番茄花园-第二章ATT汇编语言.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《番茄花园-第二章ATT汇编语言.ppt》由会员分享,可在线阅读,更多相关《番茄花园-第二章ATT汇编语言.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、番茄花园-第二章ATT汇编语言 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望提纲提纲n nAT&T汇编语言n nGCC内嵌汇编AT&T汇编语言汇编语言n n在Linux中,以.S(或.s)为扩展名的文件是包含汇编语言代码的文件。n n在Linux下有两种方式对AT&T汇编进行编译链接,一种是使用汇编程序GAS和连接程序LD,一种是使用GCC AT&T汇编的编译方式汇编的编译方式n n使用汇编程序使用汇编程序GASGAS和连接程序和连接程序LD LD 第一步:第一
2、步:as sourcecode.s-o objfile.o as sourcecode.s-o objfile.o 将汇编源文件编译成目标文件将汇编源文件编译成目标文件 第二步:第二步:ld objfile.o-o execode ld objfile.o-o execode 将目标文件链接成可执行文件将目标文件链接成可执行文件n n使用使用GCC GCC gcc-o execode sourcecode.S gcc-o execode sourcecode.S 使用使用GCCGCC编译一步就可以编译成可执行文件编译一步就可以编译成可执行文件AT&T汇编示例汇编示例.data.dataoutp
3、ut:.ascii hello worldnoutput:.ascii hello worldn.text.text.globl _start.globl _start_start:_start:movl$4,%eax movl$4,%eax movl$1,%ebx movl$1,%ebx movl$output,%ecx movl$output,%ecx movl$12,%edx movl$12,%edx int$0 x80 int$0 x80 movl$1,%eax movl$1,%eax int$0 x80 int$0 x80 这段程序在linux上编译执行后会输出“hello worl
4、d”。可以看到AT&T与Intel汇编在格式上有着显著的不同 AT&T中的节中的节(Section)在在AT&TAT&T的语法中,一个节由的语法中,一个节由.section.section关键词来关键词来标识,当你编写汇编语言程序时,至少需要有以标识,当你编写汇编语言程序时,至少需要有以下三种节:下三种节:n n.data.data节节 这种节包含程序已初始化的数据,也就是说,包这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量含具有初值的那些变量 n n.text.text节节 这个节包含程序的代码。需要指出的是,该节是这个节包含程序的代码。需要指出的是,该节是只读节只读节 AT
5、&T中的节中的节(Section)n n.bss.bss节节 这个节包含程序还未初始化的数据,也就是说,这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作系统装入这个包含没有初值的那些变量。当操作系统装入这个程序时将把这些变量都置为程序时将把这些变量都置为0 0 使用使用.bss.bss比使用比使用.data.data的优势在于,的优势在于,.bss.bss节在编译节在编译后不占用磁盘的空间,这样编译、连接生成的代后不占用磁盘的空间,这样编译、连接生成的代码的尺寸会比较小。码的尺寸会比较小。尽管在磁盘上不占空间,但是在可执行文件被读尽管在磁盘上不占空间,但是在可执行文件被
6、读入内存后系统还是会为入内存后系统还是会为.bss.bss节分配内存节分配内存拥有三个节的拥有三个节的AT&T汇编程序示例汇编程序示例.data.dataoutput:.ascii hello worldnoutput:.ascii hello worldn.text.text.globl _start.globl _start_start:_start:movl$4,%eax movl$4,%eax movl$1,%ebx movl$1,%ebx movl$output,%ecx movl$output,%ecx movl$12,%edx movl$12,%edx int$0 x80 int
7、$0 x80 movl$3,%eax movl$3,%eax movl$1,%ebx 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汇编语言常见指令汇编语言常见指令n n.ascii.ascii 语法:语法:.ascii.ascii“string”.“string”.ascii a
8、scii 表示零个或多个表示零个或多个(用逗号隔开用逗号隔开)字符串,并把字符串,并把每个字符串每个字符串(结尾不自动加结尾不自动加“0”“0”字符字符)中的字符中的字符放在连续的地址单元。于此类似的放在连续的地址单元。于此类似的.asciz.asciz指令定指令定义的字符串会在结尾处自动加义的字符串会在结尾处自动加“0”“0”字符字符n n.fill.fill 语法:语法:.fill repeat,size,value.fill repeat,size,value 含义是反复拷贝含义是反复拷贝sizesize个字节,重复个字节,重复repeatrepeat次次 ,其中,其中sizesize和
9、和valuevalue是可选的,默认值分别为是可选的,默认值分别为1 1和和0 0AT&T汇编语言常见指令汇编语言常见指令n n.globl.globl 语法:语法:.globl symbol.globl symbol .globl .globl使得连接程序使得连接程序(ld)(ld)能够看到能够看到symbolsymbol。如果你。如果你的局部程序中定义了的局部程序中定义了symbolsymbol,那么,与这个局部,那么,与这个局部程序连接的其他局部程序也能存取程序连接的其他局部程序也能存取symbolsymboln n.rept endr.rept endr 语法:语法:.rept cou
10、nt.rept count .endr .endr 把把.rept.rept指令与指令与.endr.endr指令之间的行重复指令之间的行重复countcount次次 AT&T汇编语言常见指令汇编语言常见指令n n.space.space 语法:语法:.space size,fill.space size,fill 这个指令保留这个指令保留sizesize个字节的空间,每个字节的值为个字节的空间,每个字节的值为fill fill n n.byte/.word/.long.byte/.word/.long 语法:语法:.byte/.word/.long expressions.byte/.word
11、/.long expressions 预留预留1 1个字节个字节/字字/双字,并将这个字节的内容赋值为双字,并将这个字节的内容赋值为expressionexpression,若是用逗号隔开的多个,若是用逗号隔开的多个expressionexpression,则为预留多,则为预留多个这样的字节个这样的字节/字字/双字,并将它们的内容依次赋值。双字,并将它们的内容依次赋值。n n.set.set 设定常数,就好像设定常数,就好像C C程序中的程序中的#define#define的作用一样的作用一样 AT&T 与与Intel的汇编语言语法区别的汇编语言语法区别 AT&TAT&T和和IntelInte
12、l汇编语言的语法区别主要体现在操作数前缀、汇编语言的语法区别主要体现在操作数前缀、赋值方向、间接寻址语法、操作码的后缀上赋值方向、间接寻址语法、操作码的后缀上 n n操作数前缀操作数前缀 IntelIntel语法语法 AT&TAT&T语法语法 Mov eax,8 Mov eax,8 movl$8,%eax movl$8,%eax Mov ebx,0ffffh Mov ebx,0ffffh movl$0 xffff,%ebx movl$0 xffff,%ebx int 80h int 80h int$0 x80 int$0 x80 从表中可以看到在AT%T汇编中诸如%eax、%ebx之类的寄存器
13、名字前都要加上%;$8、$0 xffff这样的立即数之前都要加上$。AT&T 与与Intel的汇编语言语法区别的汇编语言语法区别 n n源源/目的操作数顺序目的操作数顺序 IntelIntel语法语法 AT&TAT&T语法语法 MOV EAX,8 MOV EAX,8 movl$8,%eax movl$8,%eax 在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数,第二个数是目的操作数。AT&T 与与Intel的汇编语言语法区别的汇编语言语法区别 n n寻址方式寻址方式 Intel Intel的指令格式是的指令格式是segregsegreg:
14、base+index*scale+dispbase+index*scale+disp,而而AT&TAT&T的格式是的格式是%segreg%segreg:disp(base,index,scale)disp(base,index,scale)。IntelIntel语法语法AT&TAT&T语法语法eax eax(%eax)(%eax)eax+_variable eax+_variable _variable(%eax)_variable(%eax)eax*4+_array eax*4+_array _array(,%eax,4)_array(,%eax,4)ebx+eax*8+_ebx+eax*8
15、+_array array _array(%ebx,%eax,8)_array(%ebx,%eax,8)在AT&T中,当立即数用在scale/disp中时,不应当在其前冠以“$”前缀,而且scale,disp不需要加前缀“&”。另外在Intel中基地址使用“”、“”,而在AT&T中则使用“(”、“)”。AT&T 与与Intel的汇编语言语法区别的汇编语言语法区别 n n标识长度的操作码前缀标识长度的操作码前缀 在在AT&TAT&T汇编中远程跳转指令和子过程调用指令的操作码汇编中远程跳转指令和子过程调用指令的操作码使用前缀使用前缀“l”“l”,分别为,分别为ljmpljmp,lcalllcall
16、,与之相应的返回指令,与之相应的返回指令伪伪lretlret。例如:。例如:IntelIntel语法语法AT&TAT&T语法语法CALL SECTION:OFFSET CALL SECTION:OFFSET lcall$secion:$offset lcall$secion:$offset JMP FAR SECTION:OFFSET JMP FAR SECTION:OFFSET ljmp$secion:$offset ljmp$secion:$offset RET FAR STACK_ADJUST RET FAR STACK_ADJUST lret$stack_adjust lret$sta
17、ck_adjust AT&T 与与Intel的汇编语言语法区别的汇编语言语法区别 n n标识长度的操作码后缀标识长度的操作码后缀 在在AT&TAT&T的操作码后面有时还会有一个后缀,其含义就是的操作码后面有时还会有一个后缀,其含义就是指出操作码的大小。指出操作码的大小。“l”“l”表示长整数(表示长整数(3232位),位),“w”“w”表示字(表示字(1616位),位),“b”“b”表示字节(表示字节(8 8位)。而在位)。而在IntelIntel的语的语法中,则要在内存单元操作数的前面加上法中,则要在内存单元操作数的前面加上byte ptrbyte ptr、word word ptr,ptr
18、,和和dword ptrdword ptr,“dword”“dword”对应对应“long”“long”。IntelIntel语法语法AT&TAT&T语法语法Mov al,bl Mov al,bl movb%bl,%almovb%bl,%alMov ax,bxMov ax,bxmovw%bx,%axmovw%bx,%axMov eax,ebxMov eax,ebxmovl%ebx,%eaxmovl%ebx,%eaxMov eax,dword ptr Mov eax,dword ptr ebxebxmovl (%ebx),%eaxmovl (%ebx),%eaxGCC内嵌汇编内嵌汇编 n nLi
19、nux操作系统内核代码绝大部分使用C语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。基本行内汇编基本行内汇编 n n基本行内汇编很容易理解,一般是按照下面的格基本行内汇编很容易理解,一般是按照下面的格式:式:asm(“statements”);asm(“statements”);n n在在“asm”“asm”后面有时也会加上后面有时也会加上“_volatile_”“_volatile_”表表示编译器不要优化代码,后面的指令保留原样示编译器不要优化代码,后面的指令保留原
20、样 _asm_ _volatile_(hlt);_asm_ _volatile_(hlt);基本行内汇编基本行内汇编 n n如果有很多行汇编,则每一行后要加上如果有很多行汇编,则每一行后要加上“nt”“nt”:asm(pushl%eaxntasm(pushl%eaxnt movl$0,%eaxnt movl$0,%eaxnt popl%eax);popl%eax);n n或者我们也可以分成几行来写,如:或者我们也可以分成几行来写,如:asm(movl%eax,%ebx);asm(movl%eax,%ebx);asm(xorl%ebx,%edx);asm(xorl%ebx,%edx);asm(m
21、ovl$0,_booga);asm(movl$0,_booga);扩展的行内汇编扩展的行内汇编 n n在扩展的行内汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入寄存器,以及如何将计算结果写回C变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可,GCC会自动插入代码完成必要的操作。扩展的行内汇编扩展的行内汇编n n使用内嵌汇编,要先编写汇编指令模板,然后将使用内嵌汇编,要先编写汇编指令模板,然后将C C语言表达式与指令的操作数相关联,并告诉语言表达式与指令的操作数相关联,并告诉GCCGCC对这些操作有哪些限制条件。例如下面的汇编语对这些
22、操作有哪些限制条件。例如下面的汇编语句:句:_asm_ _violate_ (movl%1,%0:=r(result):_asm_ _violate_ (movl%1,%0:=r(result):r(input);r(input);n n“movl%1,%0”“movl%1,%0”是指令模板;是指令模板;“%0”“%0”和和“%1”“%1”代代表指令的操作数,称为占位符,表指令的操作数,称为占位符,“=r”“=r”代表它之代表它之后是输入变量且需用到寄存器,指令模板后面用后是输入变量且需用到寄存器,指令模板后面用小括号括起来的是小括号括起来的是C C语言表达式语言表达式 ,其中,其中input
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 番茄花园 第二 ATT 汇编语言
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内