6.1 IA-32指令類型(一)

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. 按位運算指令

在這裏插入圖片描述
在這裏插入圖片描述

2. 邏輯運算指令舉例

在這裏插入圖片描述

3. 按位運算指令舉例

在這裏插入圖片描述

4. 移位指令舉例

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章