IA-32中的主要指令類型
b - 8位,w - 16 位,l - 32 位
(1)傳送指令
通用數據傳送指令 | |
---|---|
MOV: | 一般傳送,包括movb、movw和movl等 |
MOVS: | 符號擴展傳送,如movsbw、movswl等 |
MOVZ: | 零擴展傳送,如movzwl、movzbl等 |
XCHG: | 數據交換 |
PUSH/POP: | 入棧/出棧,如pushl,pushw,popl,popw等 |
地址傳送指令 | |
LEA: | 加載有效地址, 如leal(%edx,%eax), %eax”的功能爲 R[eax]←R[edx]+R[eax], 執行前,若R[edx]= i ,R[eax]= j ,則指令執行後,R[eax]= i + j |
輸入輸出指令 | |
IN和OUT: | I/O端口與寄存器之間的交換 |
標誌傳送指令 | |
PUSHF、POPF: | 將EFLAG壓棧,或將棧頂內容送EFLAG |
(2)定點算術運算指令
加/ 減運算 | (影響標誌、不區分無/帶符號) |
---|---|
ADD: | 加,包括addb、addw、addl等 |
SUB: | 減,包括subb、subw、subl等 |
增1 / 減1運算 | (影響除CF以外的標誌、不區分無/帶符號) |
INC: | 加,包括incb、incw、incl等 |
DEC: | 減,包括decb、decw、decl等 |
取負運算 | (影響標誌、若對0取負,則結果爲0且CF清0,否則CF置1) |
NEG: | 取負,包括negb、negw、negl等 |
比較運算 | (做減法得到標誌、不區分無/帶符號) |
CMP: | 比較,包括cmpb、cmpw、cmpl等 – |
乘/ 除運算 | (不影響標誌、區分無/帶符號) |
MUL / IMUL: | 無符號乘/ 帶符號乘 |
DIV/ IDIV: | 帶無符號除/ 帶符號除 |
(3)按位運算指令
邏輯運算 | |
---|---|
NOT: | 非,包括notb、notw、notl等 |
AND: | 與,包括andb、andw、andl等 |
OR: | 或,包括orb、orw、orl等 |
XOR: | 異或,包括xorb、xorw、xorl等 |
TEST: | 做“與”操作測試,僅影響標誌 |
移位運算 | (左/右移時,最高/最低位送CF) |
SHL/SHR: | 邏輯左/右移,包括shlb、shrw、shrl等 |
SAL/SAR: | 算術左/右移,左移判溢出,右移高位補符 (移位前、後符號位發生變化,則OF=1 ) 包括salb、sarw、sarl等 |
ROL/ROR: | 循環左/右移,包括rolb、rorw、roll等 |
RCL/RCR: | 帶進位循環左/右移,即:將CF作爲操作數 一部分循環移位, 包括rclb、rcrw、rcll等 |
(4)控制轉移指令
無條件轉移指令 | |
---|---|
JMP DST: | 無條件轉移到目標指令DST處執行 |
條件轉移 | |
Jcc DST: | cc爲條件碼,根據標誌(條件碼)判斷是否滿足條件, 若滿足 ,則轉移到目標指令DST處執行,否則按順序執行 |
條件設置 | |
SETcc DST: | 按條件碼cc判斷的結果保存到DST(是一個8位寄存器) |
調用和返回指令 | (用於過程調用) |
CALL DST: | 返回地址RA入棧,轉DST處執行 |
RET: | 從棧中取出返回地址RA,轉到RA處執行 |
中斷指令 |
6.1 IA-32中的傳送指令
1. 常用傳送指令
2. 棧
- 棧(Stack)是一種採用**“先進後出”** 方式進行訪問的一塊存儲區,用於嵌套過程調用 。
從高地址向低地址增長
。 - “入棧”(pushw%ax) 和 “出棧” (popw%ax)
3. 指令的執行
(1)程序由指令序列組成
(2)指令執行過程示例
(3)傳送指令舉例
將以下Intel格式指令轉換爲AT&T格式指令,並說明功能。
//Intel格式
push ebp
mov ebp, esp
mov edx, DWORD PTR [ebp+8]
mov bl, 255
mov ax, WORD PTR [ebp+edx*4+8]
mov WORD PTR [ebp+20],dx
lea eax, [ecx+edx*4+8]
//At&T格式
pushl %ebp //R[esp]←R[esp]-4,M[R[esp]] ←R[ebp],雙字
movl %esp, %ebp //R[ebp] ←R[esp],雙字
movl 8(%ebp), %edx //R[edx] ←M[R[ebp]+8],雙字
movb $255, %bl //R[bl]←255,字節
movw 8(%ebp,%edx,4), %ax //R[ax]←M[R[ebp]+R[edx]×4+8],字
movw %dx, 20(%ebp) //M[R[ebp]+20]←R[dx],字
leal 8(%ecx,%edx,4), %eax //R[eax]←R[ecx]+R[edx]×4+8,雙字
6.2 IA-32中的定點算數運算指令
1. 運算指令
2. 整數乘除指令
3. 定點算術運算指令彙總
4. 指令執行過程舉例
5. 定點加法指令舉例
6. 定點乘法指令舉例
例一
布斯乘法
例二
Q:假設R[eax]=000000B4H,R[ebx]=00000011H, M[000000F8H]=000000A0H,請問: 執行指令“imull $-16, (%eax,%ebx,4), %eax”後哪些寄存器和存儲單元發生 了變化?乘積的機器數和真值各是多少?
解:
“imull -16, (%eax,%ebx,4),%eax”
功能爲R[eax]←(-16)×M[R[eax]+R[ebx]×4] ,執行結果如下
R[eax]+R[ebx]×4=000000B4H+00000011H<<2=000000F8H
R[eax]=(-16)×M[000000F8H]
=(-16)×000000A0H(帶符號整數乘)
=16 ×(-000000A0H)
=FFFFFF60H<<4
=FFFFF600H
EAX中的真值爲-2560
6.3 IA-32中的按位運算指令
1. 按位運算指令