AT&T彙編語言語法-1.Register Reference~7. Call and Jump

AT&T彙編語言語法

1.Register Reference
 引用寄存器要在寄存器號前加百分號%,如“movl %eax, %ebx”。
 80386 有如下寄存器:
[1] 8 個32-bit 寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;
( 8 個16-bit 寄存器,它們事實上是上面8 個32-bit 寄存器的低16 位:%ax,%bx,
%cx,%dx,%di,%si,%bp,%sp;
 8 個8-bit 寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它們事實上
是寄存器%ax,%bx,%cx,%dx 的高8 位和低8 位;)
[2] 6 個段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;
[3] 3 個控制寄存器:%cr0,%cr2,%cr3;
[4] 6 個debug 寄存器:%db0,%db1,%db2,%db3,%db6,%db7;
[5] 2 個測試寄存器:%tr6,%tr7;
[6] 8 個浮點寄存器棧:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。

2. Operator Sequence
操作數排列是從源(左)到目的(右),如“movl %eax(源), %ebx(目的)”

3. Immediately Operator
使用立即數,要在數前面加符號$, 如“movl $0x04, %ebx”
或者:
para = 0x04
movl $para, %ebx
指令執行的結果是將立即數0x04 裝入寄存器ebx。

4. Symbol Constant
符號常數直接引用 如
value: .long 0x12a3f2de
movl value , %ebx
指令執行的結果是將常數0x12a3f2de 裝入寄存器ebx。
引用符號地址在符號前加符號$, 如“movl $value, % ebx”則是將符號value 的地址裝入寄存器ebx。

5. Length of Operator
操作數的長度用加在指令後的符號表示b(byte, 8-bit), w(word, 16-bits), l(long,32-bits),如“movb %al, %bl”,“movw %ax, %bx”,“movl %eax, %ebx ”。
如果沒有指定操作數長度的話,編譯器將按照目標操作數的長度來設置。比如指令“mov %ax, %bx”,由於目標操作數bx 的長度爲word,那麼編譯器將把此指令等同於“movw %ax,%bx”。同樣道理,指令“mov $4, %ebx”等同於指令“movl $4, %ebx”,“push %al”等同於“pushb %al”。對於沒有指定操作數長度,但編譯器又無法猜測的指令,編譯器將會報錯,比如指令“push $4”。

6. Sign and Zero Extension
絕大多數面向80386 的AT&T 彙編指令與Intel 格式的彙編指令都是相同的,但符號擴展指令和零擴展指令有不同格式。符號擴展指令和零擴展指令需要指定源操作數長度和目的操作數長度,即使在某些指令中這些操作數是隱含的。
     在AT&T 語法中,符號擴展和零擴展指令的格式爲,基本部分"movs"和"movz"(對應Intel 語法的movsx 和movzx),後面跟上源操作數長度和目的操作數長度。movsbl 意味着movs (from)byte (to)long;movbw 意味着movs (from)byte (to)word;movswl意味着movs (from)word (to)long。對於movz 指令也一樣。比如指令“movsbl %al,%edx”意味着將al 寄存器的內容進行符號擴展後放置到edx 寄存器中。

其它的Intel 格式的符號擴展指令還有:
cbw -- sign-extend byte in %al to word in %ax;
cwde -- sign-extend word in %ax to long in %eax;
cwd -- sign-extend word in %ax to long in %dx:%ax;
cdq -- sign-extend dword in %eax to quad in %edx:%eax;
對應的AT&T 語法的指令爲cbtw,cwtl,cwtd,cltd。

7. Call and Jump
段內調用和跳轉指令爲"call","ret"和"jmp",段間調用和跳轉指令爲"lcall","lret"和
"ljmp"。段間調用和跳轉指令的格式爲“lcall/ljmp $SECTION, $OFFSET”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章