GAS中每個操作都是有一個字符的后綴,表明操作數的大小。
| C聲明 |
GAS后綴 |
大小(字節) |
| char |
b |
1 |
| short |
w |
2 |
| (unsigned) int / long / char* |
l |
4 |
| float |
s |
4 |
| double |
l |
8 |
| long double |
t |
10/12 |
注意:GAL使用后綴“l”同時表示4字節整數和8字節雙精度浮點數,這不會產生歧義因為浮點數使用的是完全不同的指令和寄存器。
操作數格式:
| 格式 |
操作數值 |
名稱 |
樣例(GAS = C語言) |
| $Imm |
Imm |
立即數尋址 |
$1 = 1 |
| Ea |
R[Ea] |
寄存器尋址 |
%eax = eax |
| Imm |
M[Imm] |
絕對尋址 |
0x104 = *0x104 |
| (Ea) |
M[R[Ea]] |
間接尋址 |
(%eax)= *eax |
| Imm(Ea) |
M[Imm+R[Ea]] |
(基址+偏移量)尋址 |
4(%eax) = *(4+eax) |
| (Ea,Eb) |
M[R[Ea]+R[Eb]] |
變址 |
(%eax,%ebx) = *(eax+ebx) |
| Imm(Ea,Eb) |
M[Imm+R[Ea]+R[Eb]] |
尋址 |
9(%eax,%ebx)= *(9+eax+ebx) |
| (,Ea,s) |
M[R[Ea]*s] |
伸縮化變址尋址 |
(,%eax,4)= *(eax*4) |
| Imm(,Ea,s) |
M[Imm+R[Ea]*s] |
伸縮化變址尋址 |
0xfc(,%eax,4)= *(0xfc+eax*4) |
| (Ea,Eb,s) |
M(R[Ea]+R[Eb]*s) |
伸縮化變址尋址 |
(%eax,%ebx,4) = *(eax+ebx*4) |
| Imm(Ea,Eb,s) |
M(Imm+R[Ea]+R[Eb]*s) |
伸縮化變址尋址 |
8(%eax,%ebx,4) = *(8+eax+ebx*4) |
注:M[xx]表示在存儲器中xx地址的值,R[xx]表示寄存器xx的值,這種表示方法將寄存器、內存都看出一個大數組的形式。
數據傳送指令:
| 指令 |
效果 |
描述 |
| movl S,D |
D <-- S |
傳雙字 |
| movw S,D |
D <-- S |
傳字 |
| movb S,D |
D <-- S |
傳字節 |
| movsbl S,D |
D <-- 符號擴展S |
符號位填充(字節->雙字) |
| movzbl S,D |
D <-- 零擴展S |
零填充(字節->雙字) |
| pushl S |
R[%esp] <-- R[%esp] – 4; M[R[%esp]] <-- S |
壓棧 |
| popl D |
D <-- M[R[%esp]]; R[%esp] <-- R[%esp] + 4; |
出棧 |
注:均假設棧往低地址擴展。
算數和邏輯操作地址:
| 指令 |
效果 |
描述 |
| leal S,D |
D = &S |
movl地版,S地址入D,D僅能是寄存器 |
| incl D |
D++ |
加1 |
| decl D |
D-- |
減1 |
| negl D |
D = -D |
取負 |
| notl D |
D = ~D |
取反 |
| addl S,D |
D = D + S |
加 |
| subl S,D |
D = D – S |
減 |
| imull S,D |
D = D*S |
乘 |
| xorl S,D |
D = D ^ S |
異或 |
| orl S,D |
D = D | S |
或 |
| andl S,D |
D = D & S |
與 |
| sall k,D |
D = D << k |
左移 |
| shll k,D |
D = D << k |
左移(同sall) |
| sarl k,D |
D = D >> k |
算數右移 |
| shrl k,D |
D = D >> k |
邏輯右移 |
特殊算術操作:
| 指令 |
效果 |
描述 |
| imull S |
R[%edx]:R[%eax] = S * R[%eax] |
無符號64位乘 |
| mull S |
R[%edx]:R[%eax] = S * R[%eax] |
有符號64位乘 |
| cltd S |
R[%edx]:R[%eax] = 符號位擴展R[%eax] |
轉換為4字節 |
| idivl S |
R[%edx] = R[%edx]:R[%eax] % S; R[%eax] = R[%edx]:R[%eax] / S; |
有符號除法,保存余數和商 |
| divl S |
R[%edx] = R[%edx]:R[%eax] % S; R[%eax] = R[%edx]:R[%eax] / S; |
無符號除法,保存余數和商 |
注:64位數通常存儲為,高32位放在edx,低32位放在eax。
條件碼:
條件碼寄存器描述了最近的算數或邏輯操作的屬性。
CF:進位標志,最高位產生了進位,可用於檢查無符號數溢出。
OF:溢出標志,二進制補碼溢出——正溢出或負溢出。
ZF:零標志,結果為0。
SF:符號標志,操作結果為負。
比較指令:
| 指令 |
基於 |
描述 |
| cmpb S2,S1 |
S1 – S2 |
比較字節,差關系 |
| testb S2,S1 |
S1 & S2 |
測試字節,與關系 |
| cmpw S2,S1 |
S1 – S2 |
比較字,差關系 |
| testw S2,S1 |
S1 & S2 |
測試字,與關系 |
| cmpl S2,S1 |
S1 – S2 |
比較雙字,差關系 |
| testl S2,S1 |
S1 & S2 |
測試雙字,與關系 |
訪問條件碼指令:
| 指令 |
同義名 |
效果 |
設置條件 |
| sete D |
setz |
D = ZF |
相等/零 |
| setne D |
setnz |
D = ~ZF |
不等/非零 |
| sets D |
|
D = SF |
負數 |
| setns D |
|
D = ~SF |
非負數 |
| setg D |
setnle |
D = ~(SF ^OF) & ZF |
大於(有符號>) |
| setge D |
setnl |
D = ~(SF ^OF) |
小於等於(有符號>=) |
| setl D |
setnge |
D = SF ^ OF |
小於(有符號<) |
| setle D |
setng |
D = (SF ^ OF) | ZF |
小於等於(有符號<=) |
| seta D |
setnbe |
D = ~CF & ~ZF |
超過(無符號>) |
| setae D |
setnb |
D = ~CF |
超過或等於(無符號>=) |
| setb D |
setnae |
D = CF |
低於(無符號<) |
| setbe D |
setna |
D = CF | ZF |
低於或等於(無符號<=) |
跳轉指令:
| 指令 |
同義名 |
跳轉條件 |
描述 |
| jmp Label |
|
1 |
直接跳轉 |
| jmp *Operand |
|
1 |
間接跳轉 |
| je Label |
jz |
ZF |
等於/零 |
| jne Label |
jnz |
~ZF |
不等/非零 |
| js Label |
|
SF |
負數 |
| jnz Label |
|
~SF |
非負數 |
| jg Label |
jnle |
~(SF^OF) & ~ZF |
大於(有符號>) |
| jge Label |
jnl |
~(SF ^ OF) |
大於等於(有符號>=) |
| jl Label |
jnge |
SF ^ OF |
小於(有符號<) |
| jle Label |
jng |
(SF ^ OF) | ZF |
小於等於(有符號<=) |
| ja Label |
jnbe |
~CF & ~ZF |
超過(無符號>) |
| jae Label |
jnb |
~CF |
超過或等於(無符號>=) |
| jb Label |
jnae |
CF |
低於(無符號<) |
| jbe Label |
jna |
CF | ZF |
低於或等於(無符號<=) |
轉移控制指令:(函數調用):
| 指令 |
描述 |
| call Label |
過程調用,返回地址入棧,跳轉到調用過程起始處,返回地址是call后面那條指令的地址 |
| call *Operand |
|
| leave |
為返回准備好棧,為ret准備好棧,主要是彈出函數內的棧使用及%ebp |
源文檔 <http://www.cnblogs.com/lxgeek/archive/2011/01/01/1923738.html>
標志寄存器(Flags Register,FR)又稱程序狀態字(Program Status Word,PSW)。這是一個存放條件標志、控制標志寄存器,主要用於反映處理器的狀態和運算結果的某些特征及控制指令的執行。
各標志在標志寄存器中的位置:

各標志位名稱、英文全稱、標志值符號及含義一覽:
| 標志位 |
標志位名稱/英文 |
狀態符號表示 |
|
|
|
|
=1 |
=0 |
| CF |
進位標志/Carry Flag |
CY/Carry/進位 |
NC/No Carry/無進位 |
| PF |
奇偶標志/Parity Flag |
PE/Parity Even/偶 |
PO/Parity Odd/奇 |
| AF |
輔助進位標志/Auxiliary Carry Flag |
AC/Auxiliary Carry/進位 |
NA/No Auxiliary Carry/無進位 |
| ZF |
零標志/Zero Flag |
ZR/Zero/等於零 |
NZ/Not Zero/不等於零 |
| SF |
符號標志/Sign Flag |
NG/Negative/負 |
PL/Plus/正 |
| TF |
陷阱標志/Trap Flag |
|
|
| IF |
中斷標志/Interrupt Flag |
EI/Enable Interrupt/允許 |
DI/Disable Interrupt/禁止 |
| DF |
方向標志/Direction Flag |
DN/Down/減少 |
UP/增加 |
| OF |
溢出標志/Overflow Flag |
OV/Overflow/溢出 |
NV/Not Overflow/未溢出 |
條件標志:
CF(Carry Flag)進位標志:用於反映運算是否產生進位或借位。如果運算結果的最高位產生一個進位或借位,則CF置1,否則置0。運算結果的最高位包括字操作的第15位和字節操作的第7位。移位指令也會將操作數的最高位或最低位移入CF。
PF(Parity Flag)奇偶標志:用於反映運算結果中“1”的個數。“1”的個數為偶數,則PF置1,否則置0。
AF(Auxiliary Carry Flag)輔助進位標志:在字節操作時低半字節向高半字節進位或借位,字操作時低字節向高字節進位或借位,AF置1,否則置0。
ZF(Zero Flag)零標志:用於判斷結果是否為0。運算結果0,ZF置1,否則置0。
SF(Sign Flag)符號標志:用於反映運算結果的符號,運算結果為負,SF置1,否則置0。因為有符號數采用補碼的形式表示,所以SF與運算結果的最高位相同。
OF(Overflow Flag)溢出標志:反映有符號數加減運算是否溢出。如果運算結果超過了8位或者16位有符號數的表示范圍,則OF置1,否則置0。
控制標志:
TF(Trap Flag)陷阱標志:當TF被設置位1時,CPU進入單步模式,所謂單步模式就是CPU在每執行一步指令后都產生一個單步中斷。主要用於程序的調試。8086/8088中沒有專門用來置位和清零TF的命令,需要用其他辦法。
IF(Interrupt Flag)中斷標志:決定CPU是否響應外部可屏蔽中斷請求。TF為1時,CPU允許響應外部的可屏蔽中斷請求。
DF(Direction Flag)方向標志:決定串操作指令執行時有關指針寄存器調整方向。當DF為1時,串操作指令按遞減方式改變有關存儲器指針值,每次操作后使SI、DI遞減。
