番茄花园-第二章ATT汇编语言.ppt
《番茄花园-第二章ATT汇编语言.ppt》由会员分享,可在线阅读,更多相关《番茄花园-第二章ATT汇编语言.ppt(36页珍藏版)》请在三一办公上搜索。
1、第二章 AT&T汇编语言,提纲,AT&T汇编语言GCC内嵌汇编,AT&T汇编语言,在Linux中,以.S(或.s)为扩展名的文件是包含汇编语言代码的文件。在Linux下有两种方式对AT&T汇编进行编译链接,一种是使用汇编程序GAS和连接程序LD,一种是使用GCC,AT&T汇编的编译方式,使用汇编程序GAS和连接程序LD 第一步:as sourcecode.s-o objfile.o 将汇编源文件编译成目标文件 第二步:ld objfile.o-o execode 将目标文件链接成可执行文件使用GCC gcc-o execode sourcecode.S 使用GCC编译一步就可以编译成可执行文件
2、,AT&T汇编示例,.dataoutput:.ascii hello worldn.text.globl _start_start:movl$4,%eax movl$1,%ebx movl$output,%ecx movl$12,%edx int$0 x80 movl$1,%eax int$0 x80,这段程序在linux上编译执行后会输出“hello world”。可以看到AT&T与Intel汇编在格式上有着显著的不同,AT&T中的节(Section),在AT&T的语法中,一个节由.section关键词来标识,当你编写汇编语言程序时,至少需要有以下三种节:.data节 这种节包含程序已初始化
3、的数据,也就是说,包含具有初值的那些变量.text节 这个节包含程序的代码。需要指出的是,该节是只读节,AT&T中的节(Section),.bss节这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作系统装入这个程序时将把这些变量都置为0 使用.bss比使用.data的优势在于,.bss节在编译后不占用磁盘的空间,这样编译、连接生成的代码的尺寸会比较小。尽管在磁盘上不占空间,但是在可执行文件被读入内存后系统还是会为.bss节分配内存,拥有三个节的AT&T汇编程序示例,.dataoutput:.ascii hello worldn.text.globl _start_star
4、t:movl$4,%eax movl$1,%ebx movl$output,%ecx movl$12,%edx int$0 x80 movl$3,%eax movl$1,%ebx,movl$sentence,%ecx movl$30,%edx int$0 x80 movl$4,%eax movl$30,%edx int$0 x80 movl$1,%eax int$0 x80.bss sentence:.fill 30,程序的功能是首先打印“hello world”,然后让用户输入字符然后将输入的字符打印出来,AT&T汇编语言常见指令,.ascii 语法:.ascii“string”.ascii
5、 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“0”字符)中的字符放在连续的地址单元。于此类似的.asciz指令定义的字符串会在结尾处自动加“0”字符.fill 语法:.fill repeat,size,value 含义是反复拷贝size个字节,重复repeat次,其中size和value是可选的,默认值分别为1和0,AT&T汇编语言常见指令,.globl 语法:.globl symbol.globl使得连接程序(ld)能够看到symbol。如果你的局部程序中定义了symbol,那么,与这个局部程序连接的其他局部程序也能存取symbol.rept endr 语法:.rept
6、 count.endr 把.rept指令与.endr指令之间的行重复count次,AT&T汇编语言常见指令,.space 语法:.space size,fill 这个指令保留size个字节的空间,每个字节的值为fill.byte/.word/.long 语法:.byte/.word/.long expressions 预留1个字节/字/双字,并将这个字节的内容赋值为expression,若是用逗号隔开的多个expression,则为预留多个这样的字节/字/双字,并将它们的内容依次赋值。.set 设定常数,就好像C程序中的#define的作用一样,AT&T 与Intel的汇编语言语法区别,AT&
7、T和Intel汇编语言的语法区别主要体现在操作数前缀、赋值方向、间接寻址语法、操作码的后缀上 操作数前缀,从表中可以看到在AT%T汇编中诸如%eax、%ebx之类的寄存器名字前都要加上%;$8、$0 xffff这样的立即数之前都要加上$。,AT&T 与Intel的汇编语言语法区别,源/目的操作数顺序,在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数,第二个数是目的操作数。,AT&T 与Intel的汇编语言语法区别,寻址方式 Intel的指令格式是segreg:base+index*scale+disp,而AT&T的格式是%segreg:di
8、sp(base,index,scale)。,在AT&T中,当立即数用在scale/disp中时,不应当在其前冠以“$”前缀,而且scale,disp不需要加前缀“&”。另外在Intel中基地址使用“”、“”,而在AT&T中则使用“(”、“)”。,AT&T 与Intel的汇编语言语法区别,标识长度的操作码前缀 在AT&T汇编中远程跳转指令和子过程调用指令的操作码使用前缀“l”,分别为ljmp,lcall,与之相应的返回指令伪lret。例如:,AT&T 与Intel的汇编语言语法区别,标识长度的操作码后缀 在AT&T的操作码后面有时还会有一个后缀,其含义就是指出操作码的大小。“l”表示长整数(32
9、位),“w”表示字(16位),“b”表示字节(8位)。而在Intel的语法中,则要在内存单元操作数的前面加上byte ptr、word ptr,和dword ptr,“dword”对应“long”。,GCC内嵌汇编,Linux操作系统内核代码绝大部分使用C语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。,基本行内汇编,基本行内汇编很容易理解,一般是按照下面的格式:asm(“statements”);在“asm”后面有时也会加上“_volatile_”表示编译器不要优化
10、代码,后面的指令保留原样 _asm_ _volatile_(hlt);,基本行内汇编,如果有很多行汇编,则每一行后要加上“nt”:asm(pushl%eaxnt movl$0,%eaxnt popl%eax);或者我们也可以分成几行来写,如:asm(movl%eax,%ebx);asm(xorl%ebx,%edx);asm(movl$0,_booga);,扩展的行内汇编,在扩展的行内汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入寄存器,以及如何将计算结果写回C变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可,GCC会自动插入代码完成
11、必要的操作。,扩展的行内汇编,使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。例如下面的汇编语句:_asm_ _violate_(movl%1,%0:=r(result):r(input);“movl%1,%0”是指令模板;“%0”和“%1”代表指令的操作数,称为占位符,“=r”代表它之后是输入变量且需用到寄存器,指令模板后面用小括号括起来的是C语言表达式,其中input是输入变量,该指令会完成把input的值复制到result中的操作,扩展的行内汇编,若把刚才的内嵌汇编语句改成如下:_asm_ _volatile_(movl%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 番茄花园 第二 ATT 汇编语言
链接地址:https://www.31ppt.com/p-6481276.html