AT & T 汇编语法格式(与intel的不同)

748阅读 0评论2011-09-23 dfhf2007
分类:LINUX

1: 寄存器的引用要在寄存器号前加%, 如mov %eax, %ebx
2: 操作数顺序是从源(左)到目的(右), 如mov %eax(源), %ebx(目的)
3:   常数/立即数的格式:使用立即数, 要在前面加$, 如mov $4, %ebx
     符号常数直接引用, 如: mov value , %ebx
     引用符号地址在符号前加$, 如mov $value, %ebx
4. 操作数的长度:  操作数的长度用加在指令后的符号表示:  b(byte), w(word), l(long)  如 movw %ax, %bx
 
在AT&T 汇编格式中, 绝对转移和调用指令(jmp/call)的操作数前要加上“*” 作前缀
远转移指令好远调用指令的操作码, 在AT&T汇编格式中“ljmp",和"lcall", 而intel汇编格式中则为“jmp far" 和”call far“
 
寻址方式:AT&T:   section: disp(base, index, scale)  计算方法: base + index * scale + disp
 
c中写嵌入语句:
_asm_("asm statements": outputs : inputs: registers-modified);   output 表示, 这段汇编代码执行完后输出的寄存器, inputs表示输入的, registers_modified表示修改过的寄存器,                    输入寄存器和输出寄存器是用(0--9排序的), 第一个是0, 以此类推
例子:   int main(){
                    int a1 = 10, b1 = 0;
                    _asm_("movl %1, %%eax; \\n\\r"              //把第一个参数输入eax寄存器, 这里第0个为b1, 第一个为a1
                     "movl %%eax, %%ecx;"
                    
 
 
                    :"=a"(b1)                                                //输出寄存器eax的内容赋给b1, 执行完后才做这句???
                    :"b"(a1)                                                    //把a1的值赋给ebx
                    :"%eax);                                                //eax有改变
//a,b, c, d 分别代表 eax, ebx, ecx edx
//s''和"d"寄存器esi, edi
//r'表示任何寄存器
"0"表示上一次用的寄存器
上一篇:ARM-GCC-LD脚本
下一篇:GCC内嵌汇编之语法详解