?? 匯005.txt
字號:
、置中斷允許位指令STI(Set Interrupt Flag):IF←1
其功能是恢復可屏蔽的外部中斷的中斷響應功能,通常是與CLI成對使用的。
4、取標志位操作指令
、LAHF(Load AH from Flags):AH←Flags的低8位
、SAHF(Store AH in Flags):Flags的低8位←AH
5、標志位堆棧操作指令
、PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位標志寄存器進棧;
、POPF/POPFD(Pop Flags off Stack):把16位/32位標志寄存器出棧;
6、邏輯操作指令的小結
下面是學習標志位指令的控件,瀏覽者可以運用此類指令,觀看標志寄存器的相應變化。
5.2.3 算術運算指令
算術運算指令是反映CPU計算能力的一組指令,也是編程時經常使用的一組指令。它包括:加、減、乘、除及其相關的輔助指令。
該組指令的操作數可以是8位、16位和32位(80386+)。當存儲單元是該類指令的操作數時,該操作數的尋址方式可以是任意一種存儲單元尋址方式。
1、加法指令
、加法指令ADD(ADD Binary Numbers Instruction)
指令的格式:ADD Reg/Mem, Reg/Mem/Imm
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作數的值加到目的操作數中。
、帶進位加指令ADC(ADD With Carry Instruction)
指令的格式:ADC Reg/Mem, Reg/Mem/Imm
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作數和進位標志位CF的值(0/1)一起加到目的操作數中。
、加1指令INC(Increment by 1 Instruction)
指令的格式:INC Reg/Mem
受影響的標志位:AF、OF、PF、SF和ZF,不影響CF
指令的功能是把操作數的值加1。
、交換加指令XADD(Exchange and Add)
指令的格式:XADD Reg/Mem, Reg ;80486+
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是先交換兩個操作數的值,再進行算術“加”法操作。
例5.3 已知有二個32位數d1和d2(用數據類型DD說明),編寫程序片段把d2的值加到d1中。
解:32位數d1和d2在內存中如下所示。
…… …… ……
方法1:用16位寄存器編寫程序
MOV AX, word ptr d1 ;由于d1是雙字類型,必須使用強制類型說明符。以下同。
MOV DX, word ptr d1+2 ;(DX,AX)構成一個32位數據
ADD AX, word ptr d2 ;低字相加
ADC DX, word ptr d2+2 ;高字相加。在低字相加時,有可能會產生“進位”
MOV word ptr d1, AX ;低字送給d1的低字
MOV word ptr d1+2, DX ;高字送給d1的高字
方法2:用32位寄存器編寫程序
MOV EAX, d1
ADD EAX, d2
MOV d1, EAX
從上面兩段程序不難看出:用32位寄存器來處理32位數據顯得簡單、明了,而16位微機雖然也能處理32位數據,但做起來就要復雜一些。
下面是學習和掌握加法類指令的控件,可模擬執行ADD、ADC、INC、XADD、CLC、STC和CMC等指令。用鼠標左鍵單擊寄存器列表框中指定的寄存器,則可修改其值。后面其它控件的有關操作與此相一致,不再說明。
2、減法指令
、減法指令SUB(Subtract Binary Values Instruction)
指令的格式:SUB Reg/Mem, Reg/Mem/Imm
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是從目的操作數中減去源操作數。
、帶借位減SBB(Subtract with Borrow Instruction)
指令的格式:SBB Reg/Mem, Reg/Mem/Imm
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作數和標志位CF的值從目的操作數中一起減去。
、減1指令DEC(Decrement by 1 Instruction)
指令的格式:DEC Reg/Mem
受影響的標志位:AF、OF、PF、SF和ZF,不影響CF
指令的功能是把操作數的值減去1。
、求補指令NEG(Negate Instruction)
指令的格式:NEG Reg/Mem
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能:操作數=0-操作數,即改變操作數的正負號。
例5.4 已知有二個32位數d1和d2,編寫程序片段從d1中減去d2的值。
解:
方法1:用16位寄存器編寫程序
MOV AX, word ptr d1 ;取低字
MOV DX, word ptr d1+2 ;取高字,(DX,AX)構成一個32位數據
SUB AX, word ptr d2 ;低字相減
SBB DX, word ptr d2+2 ;高字相減。在低字相減時,有可能會產生“借位”
MOV word ptr d1, AX ;低字送給d1的低字
MOV word ptr d1+2, DX ;高字送給d1的高字
方法2:用32位寄存器編寫程序
MOV EAX, d1
SUB EAX, d2
MOV d1, EAX
下面是學習和掌握減法類指令的控件,可模擬執行SUB、SBB、DEC、NEG、CLC、STC和CMC等指令。
3、乘法指令
計算機的乘法指令分為無符號乘法指令和有符號乘法指令,它們的唯一區別就在于:數據的最高位是作為“數值”參與運算,還是作為“符號位”參與運算。
乘法指令的被乘數都是隱含操作數,乘數在指令中顯式地寫出來。CPU會根據乘數是8位、16位,還是32位操作數,來自動選用被乘數:AL、AX或EAX。
指令的功能是把顯式操作數和隱含操作數相乘,并把乘積存入相應的寄存器中。
、無符號數乘法指令MUL(Unsigned Multiply Instruction)
指令的格式:MUL Reg/Mem
受影響的標志位:CF和OF(AF、PF、SF和ZF無定義)
指令的功能是把顯式操作數和隱含操作數(都作為無符號數)相乘,所得的乘積按表5.2的對應關系存放。
表5.2 乘法指令中乘數、被乘數和乘積的對應關系
乘數位數 隱含的被乘數 乘積的存放位置 舉例
8位 AL AX MUL BL
16位 AX DX-AX MUL BX
32位 EAX EDX-EAX MUL ECX
、有符號數乘法指令IMUL(Signed Integer Multiply Instruction)
指令的格式: IMUL Reg/Mem
IMUL Reg, Imm ;80286+
IMUL Reg, Reg, Imm ;80286+
IMUL Reg, Reg/Mem ;80386+
受影響的標志位:CF和OF(AF、PF、SF和ZF無定義)
1)、指令格式1——該指令的功能是把顯式操作數和隱含操作數相乘,所得的乘積按表5.2的對應關系存放。
2)、指令格式2——其寄存器必須是16位/32位通用寄存器,其計算方式為:
Reg ← Reg × Imm
3)、指令格式3——其寄存器只能是16位通用寄存器,其計算方式為:
Reg1 ← Reg2×Imm 或 Reg1 ← Mem×Imm
4)、指令格式4——其寄存器必須是16位/32位通用寄存器,其計算方式為:
Reg1 ← Reg1×Reg2 或 Reg1 ← Reg1×Mem
在指令格式2~4中,各操作數的位數要一致。如果乘積超過目標寄存器所能存儲的范圍,則系統將置溢出標志OF為1。
下面是學習和掌握乘法類指令的控件,可模擬執行MUL和IMUL等指令。
4、除法指令
除法指令的被除數是隱含操作數,除數在指令中顯式地寫出來。CPU會根據除數是8位、16位,還是32位,來自動選用被除數AX、DX-AX,還是EDX-EAX。
除法指令功能是用顯式操作數去除隱含操作數,可得到商和余數。當除數為0,或商超出數據類型所能表示的范圍時,系統會自動產生0號中斷。
、無符號數除法指令DIV(Unsigned Divide Instruction)
指令的格式:DIV Reg/Mem
指令的功能是用顯式操作數去除隱含操作數(都作為無符號數),所得商和余數按表5.3的對應關系存放。指令對標志位的影響無定義。
、有符號數除法指令IDIV(Signed Integer Divide Instruction)
指令的格式:IDIV Reg/Mem
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能是用顯式操作數去除隱含操作數(都作為有符號數),所得商和余數的對應關系見表5.3。
表5.3 除法指令除數、被除數、商和余數的對應關系
除數位數 隱含的被除數 商 余數 舉例
8位 AX AL AH DIV BH
16位 DX-AX AX DX DIV BX
32位 EDX-EAX EAX EDX DIV ECX
5、類型轉換指令
在作有符號除法時,有時需要把短位數的被除數轉換成位數更長的數據類型。比如,要用BL中的數據去除AL,但根據除法指令的規定:除數是8位,則被除數必須是AX,于是就涉及到AH的取值問題。
為了方便說明,假設:(AH)=1H,(AL)=90H=-112D,(BL)=10H。
1)、在作除法運算前,必須處理AH的原有內容
假設在作除法時,不管AH中的值,這時,(AH、AL)/BL的商是19H,但我們知道:AL/BL的商應是-7,這就導致:計算結果不是所預期的結果,所以,在作除法運算前,程序員必須要處理AH中的值。
2)、作無符號數除法時
可強置AH的值為0,于是,可得到正確的結果。
3)、作有符號數除法時
如果強置AH為0,則AX=0090H,這時,AX/BL的商為9,顯然結果也不正確。
如果把AL的符號位1,擴展到AH中,得:AX=0FF90H=-112D,這時,AX/BL的商就是我們所要的正確結果。
綜上所述,因為在進行有符號數除法時存在隱含操作數數據類型轉換的問題,所以,系統提供了四條數據類型轉換指令:CBW、CWD、CWDE和CDQ。
、字節轉換為字指令CBW(Convent Byte to Word)
指令的格式:CBW
該指令的隱含操作數為AH和AL。其功能是用AL的符號位去填充AH,即:當AL為正數,則AH=0,否則,AH=0FFH。
指令的執行不影響任何標志位。
、字轉換為雙字指令CWD(Convent Word to Doubleword)
指令的格式:CWD
該指令的隱含操作數為DX和AX,其功能是用AX的符號位去填充DX。指令的執行不影響任何標志位。
、字轉換為擴展的雙字指令CWDE(Convent Word to Extended Doubleword)
指令的格式:CWDE ;80386+
該指令的隱含操作數為DX和AX,其功能是用AX的符號位填充EAX的高字位。指令的執行不影響任何標志位。
、雙字轉換為四字指令CDQ(Convent Doubleword to Quadword)
指令的格式:CDQ ;80386+
該指令的隱含操作數為EDX和EAX,指令的功能是用EAX的符號位填充EDX。指令的執行不影響任何標志位。
下面是學習和掌握除法類指令的控件,可模擬執行DIV、IDIV、CBW、CWD、CWDE和CDQ等指令。
例5.5 編寫程序段,完成下面計算公式,并把所得的商和余數分別存入X和Y中(其中:A,B,C,X和Y都是有符號的字變量)。
(C - 120 + A*B) / C
解:
…
A DW ?
B DW ?
C DW ?
X DW ?
Y DW ?
…
MOV AX, C
SUB AX, 120D ;書寫指令“ADD AX, -120D”也可以
CWD
MOV CX, DX
MOV BX, AX ;(CX, BX)←(DX, AX),調度寄存器,為作乘法準備必要的寄存器
MOV AX, A
IMUL B ;(DX, AX)←A*B
ADD AX, BX ;計算32位二進制之和,為作除法作準備
ADC DX, CX
IDIV C ;AX是商,DX是余數
MOV X, AX ;分別保存商和余數到指定的字變量單元里
MOV Y, DX
…
5.2.4 邏輯運算指令
邏輯運算指令是另一組重要的指令,它包括:邏輯與(AND)、邏輯或(OR)、邏輯非(NOT)和異或指令(XOR),邏輯運算指令也是經常使用的指令。
1、邏輯與操作指令AND(Logical AND Instruction)
指令的格式:AND Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯“與操作”,操作結果存入目標操作數中。
例5.6 已知(BH)=67H,要求把其的第0、1和5位置為0。
解:可以構造一個立即數,其第0、1和5位的值為0,其它位的值為1,該立即數即為:0DCH或11011100B,然后用指令"AND BH, 0DCH"來實現此功能。
其計算過程如右圖所示。
2、邏輯或操作指令OR(Logical OR Instruction)
指令的格式:OR Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯"或操作",操作結果存入目標操作數中。
例5.7 已知(BL)=46H,要求把其的第1、3、4和6位置為1。
解:構造一個立即數,使其第1、3、4和6位的值為1,其它位的值為0,該立即數即為:5AH或01011010B,然后用指令"OR BL, 5AH"來實現此功能。
其計算過程如右圖所示。
3、邏輯非操作指令NOT(Logical NOT Instruction)
指令的格式:NOT Reg/Mem
其功能是把操作數中的每位變反,即:1←0,0←1。指令的執行不影響任何標志位。
例5.8 已知(AL)=46H,執行指令“NOT AL”后,AL的值是什么?
解:執行該指令后,(AL)=0B9H。其計算過程如下所示。
4、邏輯異或操作指令XOR(Exclusive OR Instruction)
指令的格式:XOR Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯"異或操作",操作結果存入目標操作數中。
例5.9 已知(AH)=46H,要求把其的第0、2、5和7位的二進制值變反。
解:構造一個立即數,使其第0、2、5和7位的值為1,其它位的值為0,該立即數即為:0A5H或10100101B,然后再用指令"XOR AH, 0A5H"來實現此功能。
其計算過程如右圖所示。
5、邏輯操作指令的小結
下面是學習和掌握邏輯類指令的控件,可模擬執行AND、OR、NOT和XOR等指令。
5.2.5 移位操作指令
移位操作指令是一組經常使用的指令,它包括算術移位、邏輯移位、雙精度移位、循環移位和帶進位的循環移位等五大類。
移位指令都有指定移動二進制位數的操作數,該操作數可以是立即數或CL的值。在8086中,該立即數只能為1,但在其后的CPU中,該立即數可以是1··31之內的數。
1、算術移位指令
算術移位指令有:算術左移SAL(Shift Algebraic Left)和算術右移SAR(Shift Algebraic Right)。它們的指令格式如下:
SAL/SAR Reg/Mem, CL/Imm
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -