1: 寄存器的引用要在寄存器號(hào)前加%, 如mov %eax, %ebx
2: 操作數(shù)順序是從源(左)到目的(右), 如mov %eax(源), %ebx(目的)
3: 常數(shù)/立即數(shù)的格式:使用立即數(shù), 要在前面加$, 如mov $4, %ebx
符號(hào)常數(shù)直接引用, 如: mov value , %ebx
引用符號(hào)地址在符號(hào)前加$, 如mov $value, %ebx
4. 操作數(shù)的長(zhǎng)度: 操作數(shù)的長(zhǎng)度用加在指令后的符號(hào)表示: b(byte), w(word), l(long) 如 movw %ax, %bx
在AT&T 匯編格式中, 絕對(duì)轉(zhuǎn)移和調(diào)用指令(jmp/call)的操作數(shù)前要加上“*” 作前綴
遠(yuǎn)轉(zhuǎn)移指令好遠(yuǎn)調(diào)用指令的操作碼, 在AT&T匯編格式中“ljmp",和"lcall", 而intel匯編格式中則為“jmp far" 和”call far“
尋址方式:AT&T: section: disp(base, index, scale) 計(jì)算方法: base + index * scale + disp
c中寫(xiě)嵌入語(yǔ)句:
_asm_("asm statements": outputs : inputs: registers-modified); output 表示, 這段匯編代碼執(zhí)行完后輸出的寄存器, inputs表示輸入的, registers_modified表示修改過(guò)的寄存器, 輸入寄存器和輸出寄存器是用(0--9排序的), 第一個(gè)是0, 以此類(lèi)推
例子: int main(){
int a1 = 10, b1 = 0;
_asm_("movl %1, %%eax; \\n\\r" //把第一個(gè)參數(shù)輸入eax寄存器, 這里第0個(gè)為b1, 第一個(gè)為a1
"movl %%eax, %%ecx;"
:"=a"(b1) //輸出寄存器eax的內(nèi)容賦給b1, 執(zhí)行完后才做這句???
:"b"(a1) //把a(bǔ)1的值賦給ebx
:"%eax); //eax有改變
//a,b, c, d 分別代表 eax, ebx, ecx edx
//s‘‘和"d"寄存器esi, edi
//r‘表示任何寄存器
"0"表示上一次用的寄存器