3.4.1 邏輯運算和移位指令
1.邏輯運算指令
(1)NOT OPRD
該指令對操作數(shù)進行求反操作,然后將結果送回。操作數(shù)可以是寄存器或貯器的內(nèi)容。該指令對標志位不產(chǎn)生影響。
例如: NOT AL
(2)AND指令
該指令對兩個操作數(shù)進行按位相“與”的邏輯運算。即只有參加相與的兩位全為“1”時,相“與”結果才為“1”;否則相“與”結果為“0”。相“與”結果送回。
AND指令可以進行字節(jié)操作,也可以進行字操作。
AND指令的一般格式為
AND OPRD1,OPRD2
其中,目的操作數(shù)OPRD1可以是累加器,也可以是任一通用寄存器,可以是內(nèi)存操作數(shù)。源操作數(shù)OPRD2可以是立即數(shù)、寄存器,也可以是內(nèi)存操作數(shù),
例如:
AND AL,0FH
ANDAX,BX
ANDSI,BP
ANDAX,DATA --WORD
ANDDX,BUFFER[SI+BX]
ANDDATA --WORD,00FFH
ANDBLOCK[BP+DI],DX
(3) TEST指令
該指令的操作功能與AND指令相同,其結果將反映在標志位上,但結果不送回,即TEST指令將不改變操作數(shù)的值。這條指令通常是在不希望改變操作數(shù)的前提下,
用來檢測某一位或某幾位的狀態(tài)。
TEST 指令的一般格式為
TEST OPRD,im ;im是立即數(shù)
立即數(shù)中哪一位為1,表示要對哪一位進行測試。
例如,若要檢測AL中的最低位是否為1,且為1則轉(zhuǎn)移。在這種情況下
可以用如下指令:
TEST AL, 01H
JNZ THERE
… THERE:MOV BL,05H
(4) OR指令
OR指令允許對字節(jié)或?qū)ψ诌M行相“或”運算。OR指令使標志位CF=0,OF=0;相“或”操作的結果反映在標志位PF、SF和ZF上;對AF標志位未定義。
OR指令的一般格式為
OR OPRD1,OPRD2
其中,目的操作數(shù)OPRD1可以是累加器,可以是任一通用寄存器,也可以是一個內(nèi)存操作數(shù)。源操作數(shù)OPRD2可以是立即數(shù),也可以是寄存器,也可以是內(nèi)存操作數(shù),
例如:
OR AL,30H
OR AX,00FFH
OR BX,SI
OR BX,DATA --WORD
OR BUFFER,SI
OR BUFFER[BX+SI],8000H
操作數(shù)自身相“或”將不改變操作數(shù)的值,但可使進位標志位CF清0。
(5) XOR指令
該指令對兩個操作數(shù)進行按位“異或”操作,即進行“異或”操作的兩位值不同時,其結果為“1”;否則就為0,操作結果送回。
XOR 指令的一般形式為
XOR OPRD 1 ,OPRD2
其中,目的操作數(shù)OPRD1可以是累加器、任一個通用寄存器,也可以是一個內(nèi)存操作數(shù)。源操作數(shù)可以是立即數(shù)、寄存器,也可以是內(nèi)存操作數(shù).
例如:
XOR AL,0FH
XOR AX,BX
XOR DX,SI
XOR CX,CONNT --WORD
XOR BUFFER,DI
XOR BUFFER[BX+SI],AX
當操作數(shù)自身進行“異或”時,由于每一位都相同,因此“異或”結果一定為0,且使進位標志位也為0。這是對操作數(shù)清0的常用方法。
例如:
XOR AX ,AX
XOR SI,SI
2.移位指令
8088有3條移位指令。算術左移和邏輯左移指令:SAL/SHL OPRD,m ;m是移位次數(shù),可以是1或寄存器CL中的內(nèi)容算術右移指令:
SAR OPRD, m
邏輯右移指令:SHR OPRD, m
(1) SAL/SHL指令
這兩條指令的操作結果是完全一樣的。每移位一次在右面最低位補一個0,而左面的最高位則移入標志位CF,如圖3.16所示。

(2) SAR指令
該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,但符號位保持不變,而最低位移至標志位CF,如圖3.17所示。
SAR可移位由m所指定的次數(shù),結果影響標志位CF、OF、PF、SF和ZF。

(3) SHR指令
該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,最低位移 至標志位CF中。與SAR不同的是,左面的最高位將補0,如圖3.18所示。 該指令可以執(zhí)行由m所指定的移
位次數(shù)。

3. 循環(huán)移位指令
8088有4條循環(huán)移位指令:
左循環(huán)移位指令 ROLOPRD,m
右循環(huán)移位指令 ROROPRD,m
帶進位左循環(huán)移位指令 RCLOPRD,m
帶進位右循環(huán)移位指令 RCROPRD,m
(1) ROL指令
該指令每做一次移位,總是將最高位移入進位位CF中,并且還將最高位移入操作數(shù)的最低位,從而構成一個環(huán),如圖3.19(a)所示。
(2) ROR指令
該指令每做一次移位,總是將最低位移入進位標志位CF中,另外,還將最低位移入操作數(shù)的最高位,從而構成一個環(huán),如圖3.19(b)所示。

(3) RCL指令
該指令是把標志位CF包含在內(nèi)的循環(huán)左移指令。每移位一次,操作數(shù)的最高位移入進位標志位CF中,而原來CF的內(nèi)容則移入操作數(shù)的最低位,從而構成一個大環(huán),
如圖3.19(c)所示。
(4)RCR指令
該指令是把進位標志位CF包含在內(nèi)的右循環(huán)指令。每移位一次,標志位CF中的原內(nèi)容就移入操作數(shù)的最高位,而操作數(shù)的最低位則移入標志位CF中,如圖3.19(c)所示。
左移一位,只要左移以后的數(shù)未超出一個字節(jié)或一個字所能表達的范圍,則相當于原來的數(shù)乘以2;而右移一位相當于除以2,
例如:
MOV AL,08H
SALAL,1 ;左移一位,相當于乘以2;該指令執(zhí)行后,AL中的內(nèi)容為16
MOVAL,16
SARAL,1 ;右移一位,相當于除以2 ;該指令執(zhí)行后,AL中的內(nèi)容為8
