?? 匯005.txt
字號:
受影響的標志位:CF、OF、PF、SF和ZF(AF無定義)。
算術移位指令的功能描述如下,具體功能下圖(a)、(b)所示。
算術左移SAL把目的操作數的低位向高位移,空出的低位補0;
算術右移SAR把目的操作數的高位向低位移,空出的高位用最高位(符號位)填補。
(a)、SAL (b)、SAR
例5.10 已知(AH)=12H,(BL)=0A9H,試給出分別用算術左移和右移指令移動1位后,寄存器AH和BL的內容。
解:用算術左移和右移指令移動1位后,寄存器AH和BL的結果如下表所示。
操作數的初值
執行的指令
執行后操作數的內容
(AH)=12H
SAL AH, 1
(AH)=24H
(BL)=0A9H
SAL BL, 1
(BL)=52H
(AH)=12H
SAR AH, 1
(AH)=09H
(BL)=0A9H
SAR BL, 1
(BL)=0D4H
下面是學習和理解算術移位指令的控件。它簡單、直觀地表達了該移位指令的功能,通過它,學習者可準確地掌握計算機系統中該移位指令的含義。
在該控件中,操作者可隨機生成第一操作數,也可自行輸入之。為了便于比較,在執行指令前,把原操作數的內容存入“操作前的數據”中。
思考題:下面有兩組指令序列,問每組指令執行后,寄存器AX的不會變化嗎?
SAL AX, 1
SAR AX, 1
或
SAR AX, 1
SAL AX, 1
2、邏輯移位指令
此組指令有:邏輯左移SHL(Shift Logical Left)和邏輯右移SHR(Shift Logical Right)。它們的指令格式如下:
SHL/SHR Reg/Mem, CL/Imm
受影響的標志位:CF、OF、PF、SF和ZF(AF無定義)。
邏輯左移/右移指令只有它們的移位方向不同,移位后空出的位都補0。它們的具體功能下圖(a)、(b)所示。
(a)、SHL (b)、SHR
例5.11 已知(AH)=12H,(BL)=0A9H,試給出分別用邏輯左移和右移指令移動1位后,寄存器AH和BL的內容。
解:用算術左移和右移指令移動1位后,寄存器AH和BL的結果如下表所示。
操作數的初值
執行的指令
執行后操作數的內容
(AH)=12H
SHL AH, 1
(AH)=24H
(BL)=0A9H
SHL BL, 1
(BL)=52H
(AH)=12H
SHR AH, 1
(AH)=09H
(BL)=0A9H
SHR BL, 1
(BL)=54H
學習和理解邏輯移位指令的控件。
3、雙精度移位指令
此組指令有:雙精度左移SHLD(Shift Left Double)和雙精度右移SHRD(Shift Right Double)。它們都是具有三個操作數的指令,其指令的格式如下:
SHLD/SHRD Reg/Mem, Reg, CL/Imm ;80386+
其中:第一操作數是一個16位/32位的寄存器或存儲單元;第二操作數(與前者具有相同位數)一定是寄存器;第三操作數是移動的位數,它可由CL或一個立即數來確定。
在執行SHLD指令時,第一操作數向左移n位,其“空出”的低位由第二操作數的高n位來填補,但第二操作數自己不移動、不改變。
在執行SHRD指令時,第一操作數向右移n位,其“空出”的高位由第二操作數的低n位來填補,但第二操作數自己也不移動、不改變。
SHLD和SHRD指令的移位功能示意圖如圖5.8所示。
受影響的標志位:CF、OF、PF、SF和ZF(AF無定義)
(a)、SHLD
(b)、SHRD
圖5.8 雙精度移位指令操作示意圖
下面是幾個雙精度移位的例子及其執行結果。
雙精度移位指令
指令操作數的初值
指令執行后的結果
SHLD AX, BX, 1
(AX)=1234H,(BX)=8765H
(AX)=2469H
SHLD AX, BX, 3
(AX)=1234H,(BX)=8765H
(AX)=91A4H
SHRD AX, BX, 2
(AX)=1234H,(BX)=8765H
(AX)=448DH
SHRD AX, BX, 4
(AX)=1234H,(BX)=8765H
(AX)=5123H
學習和理解雙精度移位指令的控件。
4、循環移位指令
循環移位指令有:循環左移ROL(Rotate Left)和循環右移ROR(Rotate Right)。
指令的格式:ROL/ROR Reg/Mem, CL/Imm
受影響的標志位:CF和OF
循環左移/右移指令只是移位方向不同,它們移出的位不僅要進入CF,而且還要填補空出的位。具體功能如下圖(a)、(b)所示。
(a)、ROL
(b)、ROR
下面是幾個循環移位的例子及其執行結果。
循環移位指令
指令操作數的初值
指令執行后的結果
ROL AX, 1
(AX)=6789H
(AX)=0CF12H
ROL AX, 3
(AX)=6789H
(AX)=3C4BH
ROR AX, 2
(AX)=6789H
(AX)=59E2H
ROR AX, 4
(AX)=6789H
(AX)=9678H
學習和理解不帶進位的循環移位指令的控件。
5.2.6 位操作指令
1、位掃描指令(Bit Scan Instruction)
指令的格式:BSF/BSR Reg, Reg/Mem ;80386+
受影響的標志位:ZF
位掃描指令是在第二個操作數中找第一個“1”的位置。如果找到,則該“1”的位置保存在第一操作數中,并置標志位ZF為1,否則,置標志位ZF為0。
根據位掃描的方向不同,指令分二種:正向掃描指令和逆向掃描指令。
、正向掃描指令BSF(Bit Scan Forward)從右向左掃描,即:從低位向高位掃描;
、逆向掃描指令BSR(Bit Scan Reverse)從左向右掃描,即:從高位向低位掃描。
(a) BSF
(b) BSR
例如:
MOV AX, 1234H
BSF CX, AX ;指令執行后,(CX)=2
BSR CX, AX ;指令執行后,(CX)=12
2、位檢測指令(Bit Test Instruction)
指令的格式:BT/BTC/BTR/BTS Reg/Mem, Reg/Imm ;80386+
受影響的標志位:CF
位檢測指令是把第一個操作數中某一位的值傳送給標志位CF,具體的哪一位由指令的第二操作數來確定。
根據指令中對具體位的處理不同,又分一下幾種指令:
BT:把指定的位傳送給CF;
BTC:把指定的位傳送給CF后,還使該位變反;
BTR:把指定的位傳送給CF后,還使該位變為0;
BTS:把指定的位傳送給CF后,還使該位變為1;
圖5.11 位檢測指令的功能示意圖
例如:假設(AX)=1234H,分別執行下面指令。
BT AX, 2 ;指令執行后,CF=1,(AX)=1234h
BTC AX, 6 ;指令執行后,CF=0,(AX)=1274h
BTR AX, 10 ;指令執行后,CF=0,(AX)=1234h
BTS AX, 14 ;指令執行后,CF=0,(AX)=5234h
3、檢測位指令TEST(Test Bits Instruction)
檢測位指令是把二個操作數進行邏輯“與”操作,并根據運算結果設置相應的標志位,但并不保存該運算結果,所以,不會改變指令中的操作數。在該指令后,通常用JE、JNE、JZ和JNZ等條件轉移指令。
指令的格式:TEST Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
例如:
TEST AX, 1 ;測試AX的第0位
TEST CL, 10101B ;測試CL的第0、2、4位
下面是學習和掌握乘法類指令的控件,可模擬執行BSF、BSR、BT、BTC、BTR、BTS和TEST等指令。
5.2.7 比較運算指令
在程序中,我們要時常根據某個變量或表達式的取值去執行不同指令,從而使程序表現出有不同的功能。為了配合這樣的操作,在CPU的指令系統中提供了各種不同的比較指令。通過這些比較指令的執行來改變有關標志位,為進行條件轉移提供依據。
1、比較指令CMP(Compare Instruction)
指令的格式:CMP Reg/Mem, Reg/Mem/Imm
受影響的標志位:AF、CF、OF、PF、SF和ZF
指令的功能:用第二個操作數去減第一個操作數,并根據所得的差設置有關標志位,為隨后的條件轉移指令提供條件。但并不保存該差,所以,不會改變指令中的操作數。
2、比較交換指令(Compare And Exchange Instruction)
在數據傳送類指令中,我們介紹了交換指令XCHG,它不管二個操作數的值是什么,都無條件地進行交換。而比較交換指令,是先進行比較,再根據比較的結果決定是否進行操作數的交換操作。
比較交換指令的功能:當二個操作數相等時,置標志位ZF為1;否則,把第一操作數的值賦給第二操作數,并置標志位ZF為0。
、8位/16位/32位比較交換指令
指令的格式:CMPXCHG Reg/Mem, AL/AX/EAX ;80486+
受影響的標志位:AF、CF、OF、PF、SF和ZF
MASM 6.11中指令的描述與此不同,它沒有限定第二操作數的要求。
、64位比較交換指令
該指令只有一個操作數,第二個操作數EDX:EAX是隱含的。
指令的格式:CMPXCHG8B Reg/Mem ;Pentium+
受影響的標志位:ZF
例如:假設(AX)=1234H,(BX)=1234H,(CX)=4321H。
CMPXCHG BX, AX ;指令執行后,ZF=1
CMPXCHG CX, AX ;指令執行后,ZF=0,(AX)=4321H,CX的值不變
3、字符串比較指令(Compare String Instruction)
參見后面第5.2.11節——字符串操作類指令——的敘述。
5.2.8 循環指令
循環結構是程序的三大結構之一。為了方便構成循環結構,匯編語言提供了多種循環指令,這些循環指令的循環次數都是保存在計數器CX或ECX中。除了CX或ECX可以決定循環是否結束外,有的循環指令還可由標志位ZF來決定是否結束循環。
在高級語言中,循環計數器可以遞增,也可遞減,但匯編語言中,CX或ECX只能遞減,所以,循環計數器只能從大到小。在程序中,必須先把循環次數賦給循環計數器。
匯編語言的循環指令都是放在循環體的下面,在循環時,首先執行一次循環體,然后把循環計數器CX或ECX減1。當循環終止條件達到滿足時,該循環指令下面的指令將是下一條被執行的指令,否則,程序將向上轉到循環體的第一條指令。
在循環未終止,而向上轉移時,規定:該轉移只能是一個短轉移,即偏移量不能超過128,也就是說循環體中所有指令碼的字節數之和不能超過128。如果循環體過大,可以用后面介紹的“轉移指令”來構造循環結構。
循環指令本身的執行不影響任何標志位。
1、循環指令(Loop Until Complete)
循環指令LOOP的一般格式:
LOOP 標號
LOOPW 標號 ;CX作為循環計數器,80386+
LOOPD 標號 ;ECX作為循環計數器,80386+
循環指令的功能描述:
圖5.12 循環指令LOOP的功能示意圖
(CX)=(CX)-1或(ECX)=(ECX)-1;
如果(CX)≠0或(ECX)≠0,轉向“標號”所指向的指令,否則,終止循環,執行該指令下面的指令。
例5.13 編寫一段程序,求1+2+…+1000之和,并把結果存入AX中。
解:
方法1:因為計數器CX只能遞減,所以,可把求和式子改變為:1000+999+…+2+1。
…
XOR AX, AX
MOV CX, 1000D
again: ADD AX, CX ;計算過程:1000+999+…+2+1
LOOP again
…
方法2:不用循環計數器進行累加,求和式子仍為:1+2+…+999+1000。
…
XOR AX, AX
MOV CX, 1000D
MOV BX, 1
again: ADD AX, BX ;計算過程:1+2+…+999+1000
INC BX
LOOP again
…
從程序段的效果來看:方法1要比方法2好。
2、相等或為零循環指令(Loop While Equal or Loop While Zero)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -