Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

AT&T 組合語言指令集速查表 (GAS 語法)

編輯:Linux 教學
 

GAS (GNU Assembler) 採用 AT&T 語法,每條指令以單字元尾碼標示操作數大小。本文整理資料型別對應尾碼、定址模式、資料傳送、算術邏輯、條件碼、比較/測試、條件設定/跳轉、函式呼叫等核心指令集,供 x86 組合語言開發參考。

操作數大小尾碼對照

C 宣告GAS 尾碼大小 (位元組)
charb1
shortw2
(unsigned) int / long / char*l4
floats4
doublel8
long doublet10/12

註:l 同時用於 4 位元組整數與 8 位元組雙精度浮點數,指令集不同故無歧義。

定址模式格式

格式運算數值名稱範例 (GAS = C)
$ImmImm立即定址$1 = 1
%EaR[Ea]暫存器定址%eax = eax
ImmM[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)

資料傳送指令

指令效果說明
movl S,DD <-- S傳送雙字 (4 bytes)
movw S,DD <-- S傳送字 (2 bytes)
movb S,DD <-- S傳送位元組 (1 byte)
movsbl S,DD <-- 符號擴展 S位元組擴展為雙字 (符號填充)
movzbl S,DD <-- 零擴展 S位元組擴展為雙字 (零填充)
pushl S堆疊推入R[%esp]-=4; M[R[%esp]]=S
popl D堆疊彈出D=M[R[%esp]]; R[%esp]+=4

算術邏輯指令

指令效果說明
leal S,DD = &S載入有效位址 (僅限暫存器目的)
incl DD++加 1
decl DD--減 1
negl DD = -D取負
notl DD = ~D按位取反
addl S,DD = D + S加法
subl S,DD = D - S減法
imull S,DD = D * S有號乘法
xorl S,DD = D ^ S異或
orl S,DD = D | S或
andl S,DD = D & S與
sall k,D / shll k,DD = D << k邏輯左移
sarl k,DD = D >> k算術右移 (保留符號)
shrl k,DD = D >> k邏輯右移 (補零)

特殊算術指令 (64 位元運算)

指令效果說明
imull SRDX:RAX = S * RAX有號 64 位元乘法
mull SRDX:RAX = S * RAX無號 64 位元乘法
cltdRDX:RAX = 符號擴展 RAX轉換為 64 位元
idivl SRDX = 餘數; RAX = 商有號除法
divl SRDX = 餘數; RAX = 商無號除法

條件碼暫存器

  • CF (Carry Flag):無號溢位/借位
  • OF (Overflow Flag):有號溢位
  • ZF (Zero Flag):結果為零
  • SF (Sign Flag):結果為負

比較與測試指令

指令基於說明
cmpb/w/l S2,S1S1 - S2比較 (設定條件碼)
testb/w/l S2,S1S1 & S2測試 (設定條件碼)

條件設定指令 (setcc)

指令同義條件說明
sete/setz DZF相等/零
setne/setnz D~ZF不等/非零
sets DSF負數
setns D~SF非負
setg/setnle D~(SF^OF) & ~ZF有號大於
setge/setnl D~(SF^OF)有號大於等於
setl/setnge DSF^OF有號小於
setle/setng D(SF^OF) | ZF有號小於等於
seta/setnbe D~CF & ~ZF無號大於
setae/setnb D~CF無號大於等於
setb/setnae DCF無號小於
setbe/setna DCF | ZF無號小於等於

條件跳轉指令 (jcc)

指令同義條件說明
jmp Label1無條件跳轉
jmp *Operand1間接跳轉
je/jz LabelZF相等/零
jne/jnz Label~ZF不等/非零
js LabelSF負數
jns Label~SF非負
jg/jnle Label~(SF^OF) & ~ZF有號大於
jge/jnl Label~(SF^OF)有號大於等於
jl/jnge LabelSF^OF有號小於
jle/jng Label(SF^OF) | ZF有號小於等於
ja/jnbe Label~CF & ~ZF無號大於
jae/jnb Label~CF無號大於等於
jb/jnae LabelCF無號小於
jbe/jna LabelCF | ZF無號小於等於

控制轉移指令 (函式呼叫)

指令說明
call Label程序呼叫,返回位址入堆疊,跳轉至程序起始
call *Operand間接呼叫
leave恢復堆疊幀 (等同 mov %ebp,%esp; pop %ebp)
ret從程序返回 (彈出返回位址跳轉)
Copyright © Windows教程網 All Rights Reserved