運算元型別:
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擴充套件)
intshiftlr(int x, int n)
其linux下反彙編**為:
0x080483c4: push %ebp
0x080483c5: mov %esp,%ebp
0x080483c7: shll $0x2,0x8(%ebp)
0x080483cb: mov 0xc(%ebp),%ecx
0x080483ce: sarl %cl,0x8(%ebp)
0x080483d1: mov 0x8(%ebp),%eax
0x080483d4: pop %ebp
0x080483d5: ret
基本彙編指令集
基本彙編指令集 彙編指令集 1.通用資料傳送指令 mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓入堆疊.popa 把di,si,bp,sp,...
組合語言基本指令
常用命令 執行操作 cmp a,b 比較a與b mov a,b 把b的值送給a ret返回主程式 nop無作用 call 呼叫子程式 je 或jz 若相等則跳 機器碼74 或0f84 jne或jnz 若不相等則跳 機器碼75或0f85 jmp無條件跳 機器碼eb jb若小於則跳 ja若大於則跳 jg...
彙編中基本的指令格式
指令中符號解釋 r代表暫存器 代表記憶體單元 代表立即數 運算指令 add r m r m i 加法指令 減法類似 xchg r m r 兩數交換指令 inc r m 自增指令 自減類似 cmp r m,r m i 比較指令 neg r m 求補指令 mul r m 無符號乘法指令 div r m ...