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"表示上一次用的寄存器