魔兽世界部落口号英语:AT & T 汇编语法格式(与intel的不同)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 17:09:24
1: 寄存器的引用要在寄存器号前加%, 如mov %eax, %ebx2: 操作数顺序是从源(左)到目的(右), 如mov %eax(源), %ebx(目的)3:   常数/立即数的格式:使用立即数, 要在前面加$, 如mov $4, %ebx     符号常数直接引用, 如: mov value , %ebx     引用符号地址在符号前加$, 如mov $value, %ebx4. 操作数的长度:  操作数的长度用加在指令后的符号表示:  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"表示上一次用的寄存器