3.1 指令格式
彙編指令由操作碼與操作數兩部分構成
標號中的冒號表示屬性爲NEAR
對於段寄存器,CS不允許用戶干預,其他必須通過通用寄存器間接傳送。
對於單操作數指令,操作數不能是立即數
對於雙操作數指令,目的操作數不能是立即數,且操作數不能均爲內存操作數。
3.2 尋址方式
立即數尋址與寄存器尋址
直接尋址
- 符號常量通常爲立即數尋址,符號變量爲直接尋址
- 對於符號變量(X)來說, MOV AX, X 等價於 MOV AX,[X]
寄存器間接尋址
- 組合方式
- DS 和 BX/SI/DI
- SS 和 BP
- 隱含段地址僅有DS/SS兩種,間接尋址寄存器只有BX,SI,DI,BP四種
- 組合方式
寄存器相對尋址
- 等價的三種表示方法
- MOV AX, disp[SI]
- MOV AX, [SI]+disp
- MOV AX, [SI+disp]
注:即在3的條件下增加一個常量偏移
- 等價的三種表示方法
基址變址尋址
- 組合方式
- DS * 16 + BX + SI/DI
- SS * 16 + BP + SI/DI
注:即在3的條件下增加一個寄存器偏移
相對基址變址尋址
注:即在5的條件下再增加一個常量偏移
比例變址尋址
要求:80386以上處理器
組合方式
- DS:基址寄存器 + 比例 * 變址寄存器 + disp
- SS:基址寄存器 + 比例 * 變址寄存器 + disp
說明
- 基址寄存器有8個
- 變址寄存器有7個,除去ESP
- 基址寄存器爲ESP/EBP時默認數據段爲SS,其他默認爲DS
轉移地址相關尋址方式
個數:5種
影響寄存器:CS、IP
- CS:記錄標號所在的段地址(高字)
- IP:記錄段內偏移地址(低字)
注:和其他尋址方式大同小異
3.3 指令系統
MOV/MOVSX/MOVZX
MOV
- IP 不能作爲操作數
- 不能傳送數據給CS寄存器
- MOV不會影響標誌寄存器
MOVSX
- 源操作數是帶符號數
- 源操作數長度小於目的操作數
- 不影響標誌寄存器
- MOVZX
- 源操作數是無符號整數,擴展爲0
- 其他同上
PUSH/POP/PUSHA/POPA
- PUSHA/POPA 在80286以上纔有效
- PUSHA/POPA順序:AX,CX,DX,BX,SP,BP,SI,DI
XCHG
只能通用寄存器與通用寄存器互換或通用寄存器與存儲器互換。地址傳送指令
- LEA
- 功能:LEA reg, mem,將mem有效地址存入reg
- 等價指令:MOV reg, OFFSET mem
- 要求
- 源操作數是存儲器,目前操作數爲寄存器
- LDS/LES/LFS/LGS/LSS
- 說明:均爲地址指針傳送指令,後兩位表明高字傳送的目的段
- 低字傳入寄存器
- 等價指令:MOV BX, OFFSET X + MOV AX, SEG X
- LEA
加減法指令
主要影響標誌寄存器:ZF,SF,CF,OF
無符號數溢出CF=1,有符號數溢出OF=1
ADC:運算結果 + CF
SBB:運算結果 - CF
通常將AL擴展爲AX時,需兩步
MOV AH, 0 ADC AH, 0
例題
求Z = X + Y,X、Y爲16位數,Z爲32位數
注:先求和,傳送時考慮進位
MOV AX, X ADD AX, Y MOV DX, 0 ADC DX, 0 MOV WORD PTR Z+2, DX MOV WORD PTR Z, AX ;這兩行很關鍵
求Z = X-Y, 其中X,Y,Z均爲32位數
注:在做減法時就考慮借位
MOV DX, WORD PTR X + 2 MOV AX, WORD PTR X SUB AX, WORD PTR Y ;先做低位減法,無需借位 SBB DX, WORD PTR Y + 2 ;高位減法,需要借位 MOV WORD PTR Z, AX MOV WORD PTR Z + 2, DX
求W = X+Y+60-Z,其中X,Y,Z,W均爲雙字
MOV AX, WORD PTR X MOV DX, WORD PTR X+2 ADD AX, WORD PTR Y ADC DX, WROD PRT Y+2 ADD AX, 60 ADC DX, 0 SUB AX, WORD PTR Z SBB DX, WORD PTR Z+2 MOV WORD PTR W, AX MOV WORD PTR W+2,DX
判斷OF、CF在運算後的變化
MOV AL, -100 MOV AH, 88 SUB AL, AH ;運算結果-188,等於-(10111100),無法表示符號位,產生溢出,OF = 1 ;-100 = (10011100),88 = (01011000),做無符號減法,不產生借位,故CF = 0 ;-(10111100) 補碼爲 (01000100) = 44H MOV BL, 100 MOV BH, -88 SUB BL, BH ;運算結果+188,等於+(10111100),無法表示符號位,產生溢出,OF = 1 ;100 = (01100100),-88 = (10101000),做無符號減法,顯然產生借位,故CF = 1 ;+(10111100)補碼爲(10111100) = 0BCH MOV CL, 100 MOV CH, 88 SUB CL, CH ;運算結果爲+12,等於+(00001100),可以表示符號位,無溢出,OF = 0 ;100 = (01100100),88 = (01011000),做無符號減法,顯然不產生借位,故CF = 0 ;+(00001100)的補碼爲(00001100) = 0CH MOV DL, -100 MOV DH, -88 SUB DL, DH ;運算結果爲-12,等於-(00001100),可以表示符號位,無溢出,OF = 0 ;-100 = (10011100),-88 = (10101000),做無符號減法,顯然產生借位,故CF = 1 ;-(00001100) = 11110100 = 0F4H
乘除法指令
乘法(MUL/IMUL)
若爲字節乘法(8位),結果送入AX,若爲字乘法(16位),結果送入DX:AX
乘法操作目的操作數爲隱含的,源操作數不能爲立即數
當高位結果不爲0時,CF = OF = 1
若爲IMUL 2操作數指令,只要求目的操作數爲寄存器,源操作數和目的操作數同規模
若爲IMUL 3操作數指令,要求去上述相同,第三操作數爲立即數
有符號乘法,高位未必是乘積的符號擴展
MOV AX, 0 MOV BL, 10 MOV AL, 9CH IMUL BL ; AX = 0FC18H
除法(DIV/IDIV)
- 商存低位,餘數存高位
- 對標誌寄存器無定義,除數爲0或商溢出,自動中斷退出程序。
符號擴展指令
- 說明:一般出現在除法操作前的預處理中
- 例子
- 計算(X + 125 - X * Y) / Z,其中X、Y、Z爲16位帶符號字變量,商存入X,餘數存入Y
MOV AX, X IMUL Y MOV CX, AX MOV BX, DX MOV AX, X ADD AX, 125 CWD SUB AX, CX SBB DX, BX IDIV Z MOV X, AX MOV Y, DX
- 計算(X + 125 - X * Y) / Z,其中X、Y、Z爲16位帶符號字變量,商存入X,餘數存入Y
邏輯運算指令
- 常用操作
- 清零(清CF標誌)
XOR AX, AX - 加 30H(數字的ASCII碼變化)
OR AL, 30H
- 清零(清CF標誌)
- 常用操作
移位指令
- SHL/SHR
- 格式:SHL/SHR DST, COUNT
- 說明:左移/右移count位
- SHL/SHR
比較指令
實際內容爲減法,詳見第五章筆記。