资源描述:
《att汇编语言与gcc内嵌汇编简介》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、AT&T汇编语言与GCC内嵌汇编简介来源:ChinaUnix博客 日期:2006.05.1421:44 (共有0条评论)我要评论 AT&T汇编语言与GCC内嵌汇编简介 版本0.1 时间04/3/30 EMAILchforest_chang@hotmail.com 1AT&T与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2GCC内嵌汇编 2.1简介 2.2内嵌汇编举例 2.3语法 2.3.1汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破
2、坏描述部分 2.4GCC如何编译内嵌汇编代码 3后记 本节先介绍 AT&T汇编语言语法与INTEL汇编语法的差别,然后介绍GCC内嵌汇编语法。阅读本节需要读者具有INTEL 汇编语言基础。 1AT&T与INTEL的汇编语言语法的区别 1.1 指令大小写 INTEL格式的指令使用大写字母,而AT&T 格式的使用小写字母。 例: INTELAT&T MOVEAX,EBXmovl%ebx,%eax 1.2 指令操作数赋值方向 在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。 AT&T语法第一个为源操作数,第二个为目的操作数,方
3、向从左到右,合乎自然。 例: INTELAT&T MOVEAX,EBXmovl%ebx,%eax 1.3 指令前缀 在INTEL语法中寄存器和立即数不需要前缀; AT&T中寄存器需要加前缀“%”;立即数需要加前缀“$”。 例: INTELAT&T MOVEAX,1movl$1,%eax 符号常数直接引用,不需要加前缀,如: movlvalue,%ebx value为一常数; 在符号前加前缀$,表示引用符号地址, 如 movl$value,%ebx 是将value的地址放到ebx中。 总线锁定前缀“lock”: 总线锁定操作。“lock”前缀在Linux
4、 核心代码中使用很多,特别是SMP 代码中。当总线锁定后其它CPU 不能存取锁定地址处的内存单元。 远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall, 与之相应的返回指令伪lret。 例: INTELAT&T lcall$secion:$offset JMPFARSECTION:OFFSETljmp$secion:$offset RETFARSATCK_ADJUSTlret$stack_adjust 1.4间接寻址语法 INTEL中基地址使用“[”、“]”,而在AT&T“(”、“)”; 另外处理复杂操作数的语法也不同, INTE
5、L为Segreg:[base+index*scale+disp] ,而在AT&T中为%segreg:disp(base,index,sale),其中segreg ,index,scale,disp都是可选的,在指定index而没有显式指定Scale 的情况下使用默认值1。Scale,disp不需要加前缀“&”。 INTELAT&T Instrfoo,segreg:[base+index*scale+disp]instr%segreg:disp(base,index,scale),foo 1.5 指令后缀 AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小,“
6、b”表示byte (一个字节);“w”表示word(2,个字节);“l”表示long(4,个字节)。 INTEL中处理内存操作数时也有类似的语法如: BYTEPTR、WORDPTR、DWORDPTR。 例: INTELAT&T moval,blmovb%bl,%al movax,bxmovw%bx,%ax moveax,dwordptr[ebx]movl(%ebx),%eax AT&T汇编指令中,操作数扩展指令有两个后缀,一个指定源操作数的字长,另一个指定目标操作数的字长。AT&T的符号扩展指令的为“movs”,零扩展指令为“movz ”(相应的Intel指令为
7、“movsx”和“movzx”)。因此,“movsbl%al,%edx”表示对寄存器al 中的字节数据进行字节到长字的符号扩展,计算结果存放在寄存器edx 中。下面是一些允许的操作数扩展后缀: l bl:,字节-长字l bw:,字节-字l wl:,字-长字 跳转指令标号后的后缀表示跳转方向,“f”表示向前(forward), “b,”表示向后(back)。 例: jmp1f jmp1f 1.6指令