轉自http://blog.csdn.net/wwv386646959/article/details/9020005
基本操作指令
操作數類型:
1. 立即數操作數,也就是常數值。立即數的書寫方式是“$”後面跟一個整數,比如$0x1F,這個會在後面的具體分析中見到很多。
2. 寄存器操作數,它表示某個寄存器的內容,用符號Ea來表示任意寄存器a,用引用R[Ea]來表示它的值,這是將寄存器集合看成一個數組R,用寄存器表示符作爲索引。
3. 操作數是存儲器引用,它會根據計算出來的地址(通常稱爲有效地址)訪問某個存儲器位置。用符號Mb[Addr]表示對存儲在存儲器中從地址Addr開始的b字節值的引用。通常可以省略下標b。
下面表格表示多種不同的尋址模式:
操作數類型
|
格式 |
操作數值 |
名稱 |
立即數
|
$Imm |
Imm |
立即數尋址 |
寄存器
|
Ea |
R[Ea] |
寄存器尋址 |
寄存器
|
Imm |
M[Imm] |
絕對尋址 |
寄存器
|
(Ea) |
M[R[Ea]] |
間接尋址 |
寄存器
|
Imm(Eb) |
M[Imm+R[Eb]] |
(基址+偏移量)尋址 |
寄存器
|
(Eb,Ei) |
M[R[Eb]+R[Ei]] |
變址尋址 |
寄存器
|
|
M[Imm+R[Eb]+R[Ei]] |
|
寄存器
|
(,Ei, s) |
M[R[Ei] * s]
|
伸縮化的變址尋址 |
寄存器
|
Imm(,Ei, s) |
M[Imm+R[Ei] * s]] |
伸縮化的變址尋址 |
寄存器
|
(Eb,Ei, s) |
M[R[Eb]+R[Ei] * s] |
伸縮化的變址尋址 |
寄存器
|
Imm(Eb,Ei, s) |
M[Imm+R[Eb]+R[Ei] * s] |
伸縮化的變址尋址 |
注:操作數可以是立即數值、寄存器值或是來自存儲器的值,伸縮因子必須是1、2、4、或者是8。
數據傳送指令
在操作指令中,最頻繁使用的指令是執行數據傳送的指令。傳送指令的兩個操作數不能都指向存儲器位置。將一個值從一個存儲器位置拷到另一個存儲器位置需要兩條指令——第一條指令將源值加載到寄存器中,第二條將該寄存器值寫入到目的位置。
下面爲五種傳送指令:
指令 意義
movl $0x4050, %eax 立即數——寄存器
movl %ebp, %esp 寄存器——寄存器
movl (%edi, %ecx), %eax 存儲器——寄存器
movl $-17, (%esp) 立即數——存儲器
movl %eax, -12(%ebp) 寄存器——存儲器
常用指令:
指令 |
效果 |
描述 |
movl S, D |
D ←S |
傳送雙字
|
movl S, D
|
D ←S |
傳送字 |
movl S, D
|
D ←S |
傳送字節 |
movl S, D
|
D ←符號擴展(S) |
傳送符號擴展的字節 |
movl 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 |
出棧 |
算術和邏輯操作
加載有效地址(Load EffectiveAddress)指令lea實際上是mov指令的變形,因爲mov不能夠直接對兩個存儲器操作數,,指令將有效地址寫入到目的操作數(如寄存器)。
整數算術操作:
指令 |
效果 |
描述 |
leal S , D |
D ← &S |
加載有效地址 |
incl D decl D negl D notl D |
D ← D + 1 D ← D-1 D ← -D D ← ~D |
加 1 減 1 取負 取補
|
addl S , D subl S , D iImull S , D xorl S , D orl S , D and S , D |
D ← D + S D ← D - S D ← D * S D ← D ^ S D ← D | S D ← D & S |
加法 減法 乘法 異或 或 與 |
sall k , D shll k , D sarl k , D shrl k , D |
D ← D << k D ← D << k D ← D >> k D ← D >> k |
算術左移 邏輯左移(等同於sal) 算術右移(符號位擴展) 邏輯右移 (0擴展) |
C函數的彙編例子:
intshiftlr(int x, int n)
{
x <<= 2;
x >>= n;
return x;
}
其Linux下反彙編代碼爲:
0x080483c4<shiftlr+0>: push %ebp
0x080483c5<shiftlr+1>: mov %esp,%ebp
0x080483c7<shiftlr+3>: shll $0x2,0x8(%ebp)
0x080483cb<shiftlr+7>: mov 0xc(%ebp),%ecx
0x080483ce<shiftlr+10>: sarl %cl,0x8(%ebp)
0x080483d1<shiftlr+13>: mov 0x8(%ebp),%eax
0x080483d4<shiftlr+16>: pop %ebp
0x080483d5<shiftlr+17>: ret