第四周 算術(shù)運算、邏輯運算與移位操作指令
大家好,又是我,沉迷學(xué)習(xí)無法自拔的小笨蛋康sir。 這個文集將會同步更新我觀看吳寧老師的《微機原理與接口技術(shù)》教學(xué)視頻寫的筆記,學(xué)習(xí)筆記,大概每周一章。 有問題大家可以在評論下面留言討論,歡迎糾錯! 歡迎收藏閱讀,動動小手給個硬幣點個贊。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——@正能量的康sir??
也可移步我的博客(https://blog.csdn.net/qq_33956508)獲得更好的閱讀體驗(暫不更新),也會更新一些其它技術(shù)類文章。

第19講 加法運算類指令
算術(shù)運算類指令:
加法運算指令
減法運算指令
乘法指令
除法指令
算術(shù)運算指令的執(zhí)行大多對狀態(tài)標(biāo)志位會產(chǎn)生影響。
加法運算指令
加法指令
普通加法指令A(yù)DD
帶進位位的加法指令A(yù)DC
加1指令I(lǐng)NC
前面兩種雙操作數(shù)的加法指令對操作數(shù)的要求與MOV相同.
回顧MOV的要求:
兩操作數(shù)字長必須相同;
兩操作數(shù)不允許同時為存儲器操作數(shù);
兩操作數(shù)不允許同時為段寄存器;
在源操作數(shù)時立即數(shù)時,目標(biāo)操作數(shù)不能是段寄存器;
IP和CS不作為目標(biāo)操作數(shù),F(xiàn)LAGS一般也不作為操作數(shù)在指令中出現(xiàn)。
ADD指令
格式:ADD OPRD1,OPRD2
操作:OPRD1+OPRD2——>OPRD1
ADD指令的執(zhí)行對全部6個狀態(tài)標(biāo)志位都產(chǎn)生影響
例子:
MOV AL,78H
ADD AL,99H
指令執(zhí)行后6個狀態(tài)標(biāo)志位的狀態(tài)
01111000+10011001=100010001
標(biāo)志位:CF=1,SF=0,AF=1,ZF=0,PF=1,OF=0
2.ADC指令
指令格式、對操作數(shù)的要求、對標(biāo)志位的影響與ADD指令完全一樣
指令的操作:OPRD1+OPRD2+CF——>OPRD1
ADC指令多用于多字節(jié)數(shù)相加,使用前要先將CF清零
3.INC指令
格式:INC OPRD (OPRD不能是段寄存器,不能是立即數(shù))
操作: OPRD+1——>OPRD
INC指令的執(zhí)行不影響CF,但會影響其余5個狀態(tài)標(biāo)志位。
(即使是FFH再加1,也不會影響CF。INC后面不能跟基于CF狀態(tài)轉(zhuǎn)移的條件轉(zhuǎn)移指令)
常用于在程序中修改地址指針。
例子:
求內(nèi)存數(shù)據(jù)段中M1為首和M2為首的兩個20字節(jié)數(shù)之和,并將結(jié)果寫入M2為首的區(qū)域中。
LEA SI,M1
LEA DI,M2
MOV CX,20
CLC ;使CF=0
NEXT:MOV AL,[SI]
ADC [DI],AL;因為ADC的結(jié)果就是OPRD1+OPRD2+CF,所以上一次運算如果進位使CF=1,這次會被加上
INC SI
INC DI
DEC CX
JNZ NEXT
HLT

按“字“運算
LEA SI,M1
LEA DI,M2
MOV CX,10
CLC
NEXT:MOV AX,[SI]
ADC [DI],AX
ADD SI,2
ADD DI,2
DEC CX
JNZ NEXT
HLT

第20講 減法運算類指令
減法指令:
普通減法指令SUB
? 考慮借位的減法指令SBB
? 減1指令DEC
? 比較指令CMP
? 求補指令NEG
減法指令對操作數(shù)的要求與對應(yīng)的加法指令相同
SUB指令
格式:SUB OPRD1,OPRD2
操作:OPRD1-OPRD2——>OPRD1
對標(biāo)志位的影響與ADD指令同
SBB指令
指令格式、對操作數(shù)的要求、對標(biāo)志位的影響與SUB指令完全一樣
指令的操作:OPRD1-OPRD2-CF——>OPRD1
DEC指令
格式:DEC OPRD
操作:OPRD-1——>OPRD
指令對操作數(shù)的要求與INC相同
指令常用于在程序中修改數(shù)值
應(yīng)用程序例
程序功能:延時(定時)
MOV BL,2
NEXT1:MOV CX,0FFFFH;關(guān)于前面的0:指令中,立即數(shù)16位最高位是A-F的符號時,前面必須加0,為了編譯器識別。
NEXT2:DEC CX
JNZ NEXT2;ZF=0轉(zhuǎn)NEXT2
DEC BL
JNZ NEXT1;ZF=0轉(zhuǎn)NEXT1
HLT;暫停執(zhí)行
NEG指令(這條命令用得少)
格式:NEG OPRD ;OPRD指8/16位寄存器或存儲器操作數(shù)
操作:0-OPRD——>OPRD
對一個負(fù)數(shù)取補碼就相當(dāng)于用零減去此數(shù)
說明:執(zhí)行NEG指令后,一般情況下都會使CF為1,除非給定的操作數(shù)為零才會使CF為0.
當(dāng)指令的操作數(shù)的值為80H(-128)或為8000H(-32768),則執(zhí)行NEG指令后,結(jié)果不變,但0F置1,其它情況下OF均置0.
用0減去操作數(shù),可以得到負(fù)數(shù)的絕對值。
CMP指令
格式:CMP OPRD1,OPRD2
操作:OPRD1-OPRD2
指令執(zhí)行的結(jié)果不影響目標(biāo)操作數(shù),僅影響標(biāo)志位
用途:用于比較兩個數(shù)的大小,可作為條件轉(zhuǎn)移指令轉(zhuǎn)移的條件
指令對操作數(shù)的要求及對標(biāo)志位的影響與SUB指令相同
CMP指令
兩個無符號數(shù)的比較:CMP AX,BX
若AX>=BX ——>CF=0
若AX<BX——>CF=1
若AX=BX——>CF=0,ZF=1
CMP指令
兩個帶符號數(shù)的比較
CMP AX,BX
兩個數(shù)的大小由OF和SF共同決定
OF和SF狀態(tài)相同 AX>=BX
OF和SF狀態(tài)不同 AX<BX
CMP指令例:
程序功能 在20個數(shù)中找到最大的數(shù),并將其存放在MAX單元中。
LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT:INC SI
CMP AL,[SI]
JNC GOON ;CF=0轉(zhuǎn)移
XCHS [SI],AL
GOON:DEC CL
JNZ NEXT
MOV [BX],AL
HLT

第21講 乘除運算指令
乘法指令
無符號的乘法指令MUL
帶符號的乘法指令I(lǐng)MUL
注意:乘法指令采用隱含尋址,隱含的是存放被乘數(shù)的累加器AL或AX及存放結(jié)果的AX,DX;
無符號數(shù)的乘法指令
格式: MUL OPRD ;OPRD不能是立即數(shù)
操作:OPRD為字節(jié)數(shù) AL x OPRD——>AX
?OPRD為16位數(shù)AXxOPRD——>DXAX
舉例:MUL BYTE PTR[BX];BYTE PTR說明后面的偏移地址指向的內(nèi)存單元是字節(jié)長(8位)。WORD PTR是字長(8086來說就是16位)。
ALxXXH——>AX ? ? ?

有符號數(shù)乘法指令
格式:IMUL OPRD
指令格式及對操作數(shù)的要求與MUL指令相同。
指令執(zhí)行原理:
將兩個操作數(shù)取補碼(對負(fù)數(shù)按位取反加1,正數(shù)不變);
做乘法運算
將乘積取補碼(按位取反加1)
2、除法指令
無符號除法指令
格式:DIV OPRD
有符號除法指令
格式:IDIV OPRD
操作
指令要求被除數(shù)是除數(shù)的雙倍字長
若OPRD是字節(jié)數(shù)
執(zhí)行AX/OPRD
結(jié)果AL=商 AH=余數(shù)
若OPRD是雙字節(jié)數(shù)
執(zhí)行:DXAX/OPRD
結(jié)果:AX=商 DX=余數(shù)
算術(shù)運算指令小結(jié)
算術(shù)運算指令執(zhí)行影響狀態(tài)標(biāo)志位
乘法指令執(zhí)行結(jié)果為相乘的雙倍字長;除法指令要求被除數(shù)是除數(shù)的雙倍字長
例:
MOV SI,1200H
MOV WORD PTR[SI],8765H
MOV AL,[SI]
INC SI;指向高八位 也就是87H
MUL BYTE PTR[SI];計算ALx[SI]=65H x 87H——>AX=3543H
修改一下
?????? MOV SI,1200H
?????? MOV WORD PTR[SI],8765H
?????? MOV AX,[SI];所以AX=8765H
?????? MUL WORD PTR[SI];計算AXx[SI]——>DX AX
第22講 邏輯運算指令
邏輯運算
基本邏輯運算
與或非
異或
邏輯運算指令——實現(xiàn)邏輯操作的指令
與、或、非、異或
邏輯運算指令
對操作數(shù)的要求:
大多(與 或 異或)與MOV指令相同。特例:
?非”運算指令要求操作數(shù)不能是立即數(shù);需要說明字長(PTR)
對標(biāo)志位的影響
除“非”運算指令,其余指令的執(zhí)行都會影響除AF外的5個狀態(tài)標(biāo)志(CF、OF、ZF、SF、PF),如何影響:無論執(zhí)行結(jié)果如何,都會使標(biāo)志位CF=OF=0。ZF、SF、PF正常影響。
“非”運算指令的執(zhí)行不影響標(biāo)志位。
1、“與”指令
格式:AND OPRD1,OPRE2
操作:兩操作數(shù)相“與”,結(jié)果送目標(biāo)地址
應(yīng)用:
實現(xiàn)兩操作數(shù)按位相與的運算AND BL,[SI]
使目標(biāo)操作數(shù)的某些位不變,某些位清零AND AL,0FH (AL的高四位變0,低四位不變)
在操作數(shù)不變的情況下使CF和OF清零AND AX,AX
舉例:
從地址為3F8H端口中讀入一個字節(jié)數(shù)(狀態(tài)字),如果該數(shù)bit1位為1,則可從38FH端口將DATA為首地址的1個字輸出,否則就不能進行數(shù)據(jù)傳送。
要求:編寫相應(yīng)的程序段

MOV DX,3F8H
WATT:IN AL,DX
AND AL,02H ;把AL和00000010相與,然后判斷結(jié)果是0還是非0,由此判斷bit1位不是1還是1
JZ WATT ;ZF=1轉(zhuǎn)移
MOV DX,38FH
MOV AX,DATA
OUT DX,AX
2、“或”運算指令
格式:OR OPRD1,OPRD2
操作:兩操作數(shù)相“或”,結(jié)果送目標(biāo)地址
應(yīng)用:
實現(xiàn)兩操作數(shù)相“或”的運算OR AX,[DI]
使某些位不變,某些位置“1”: OR CL,0FH
在不改變操作數(shù)的情況下使OF=CF=0 : OR AX,AX
例子:
OR AL,AL
JPE GOON ;PF=1轉(zhuǎn)移
OR AL,80H
GOON:…
“或”指令的應(yīng)用
將一個二進制數(shù)9變?yōu)樽址?’
二進制9? 00001001? 09H
字符9 ASCII碼00111001? 39H
MOV AL,9
OR AL,30H
也可以用ADD AL,30H,只是運算速度和標(biāo)志位影響上的差別
3、“非”運算指令
格式:NOT OPRD
操作:操作數(shù)按位取反再送回原地址
注:指令的執(zhí)行對標(biāo)志位無影響
例:NOT BYTE PTR[BX]
4、“異或”運算指令
格式:XOR OPRD1,OPRD2
操作:兩操作數(shù)“異或”,結(jié)果送目標(biāo)地址
例子
XOR BL,80H;最高位取反,低7位不變
異或:不同為1,相同為0.所以:和0異或,狀態(tài)不變;和1異或,狀態(tài)取反。
XOR AX,AX;使AX清零(用異或的方法效率最高)
其它清零AX的方法:
AND AX,0
SUB AX,AX
MOV AX,0000H
5、“測試“指令
格式:TEST OPRD1,OPRD2
操作:執(zhí)行“與”運算,但運算的結(jié)果不送回目標(biāo)地址
應(yīng)用:常用于測試某些位的狀態(tài)
例:從地址位3F8H的端口中讀入一個字節(jié)數(shù),當(dāng)該數(shù)的bit1,bit3,bit5位同時為1時,可從38FH端口將DATA為首地址的一個字輸出,否則就不能進行數(shù)據(jù)傳送
編寫相應(yīng)的程序段。
源程序代碼:
LEA SI,DATA
MOV DX,3F8H
WATT:IN AL,DX
TEST AL,02H
JZ WATT ;ZF=1轉(zhuǎn)移
TEST AL,08H
JZ WATT
TEST AL,20H
JZ WATT
MOV DX,38FH
MOV AX,[SI]
OUT DX,AX
優(yōu)化后:
LEA SI,DATA
MOV DX,3F8H
WATT:IN AL,DX
AND AL,2AH
CMP AL,2AH
JNZ WATT
MOV DX,38FH
MOV AX,[SI]
OUT DX,AX
再優(yōu)化:
優(yōu)化后:
LEA SI,DATA
MOV DX,3F8H
WATT:IN AL,DX
AND AL,2AH
XOR AL,2AH
JNZ WATT
MOV DX,38FH
MOV AX,[SI]
OUT DX,AX
第23講 移位操作指令
控制二進制位向左或向右移動的指令
分類:非循環(huán)移位指令、循環(huán)移位指令
移位操作指令說明
指令格式在形式上為雙操作數(shù),本質(zhì)上為單操作數(shù);
指令的目標(biāo)操作數(shù)為被移動對象,源操作數(shù)為移動次數(shù)
當(dāng)目標(biāo)為存儲器操作數(shù)時,需要說明其字長
移動移動1位時由指令直接給出;移動兩位及以上時,移位次數(shù)必須由CL指定。
指令源操作數(shù) 只能是1或CL
1.非循環(huán)移位指令
邏輯左移
算術(shù)左移
邏輯右移
算術(shù)右移
左移和右移的原理不一樣,
邏輯左移和算數(shù)左移原理相同:左移最高位移入CF,最低位補零;
邏輯右移和算數(shù)右移原理不同:邏輯右移最低位移入CF,最高位補零;算術(shù)右移最低位移入CF,符號位會復(fù)制到最高位。(所以如果一個8位數(shù)算術(shù)右移8次會每一位都是原來符號位的數(shù)。)
左移一位乘2,右移一位除以2
算術(shù)左移和邏輯左移
(算術(shù)移位指令針對有符號數(shù),邏輯移位指令針對無符號數(shù))
算術(shù)左移指令:(有符號數(shù))
SAL OPRD,1
SAL OPRD,CL
邏輯左移指令:(無符號數(shù))
SHL OPRD,1
SHL OPRD,CL
邏輯右移:(無符號數(shù))
SHR OPRD,1
SHR OPRD,CL
邏輯右移例:
MOV AL,68H
MOV CL,2
SHR AL,CL

算術(shù)右移:(有符號數(shù))
格式:
SAR OPRD,1
SAR OPRD,CL

非循環(huán)移位指令的應(yīng)用:
左移可實現(xiàn)乘法運算(左移1位 乘以2)
右移可實現(xiàn)除法運算(右移1位 除以2)
2.循環(huán)移位指令
不帶進位位的循環(huán)指令:左移ROL、右移ROR
帶進位位的循環(huán)移位:左移RCL、右移RCR
指令格式、對操作數(shù)的要求與非循環(huán)移位指令相同
不帶進位位的循環(huán)移位
左移:最高位移動到CF,同時移動到最低位
右移:最低位移動到CF,同時移動到最高位

帶進位位的循環(huán)移位
左移:CF移動到最低位,最高位移動到CF
右移:CF移動到最高位,最低位移動到CF

循環(huán)移位指令的應(yīng)用:
用于對某些位狀態(tài)的測試;
高位部分和低位部分的交換;
與非循環(huán)移位指令一起組成32位或更長字長數(shù)的移位。
例:
在內(nèi)存數(shù)據(jù)段 M 1為首地 址的 4個單元中存放了 4個壓縮 BCD 碼 。
要求:將這4個壓縮BCD碼分別轉(zhuǎn)換為ASCII碼,并將轉(zhuǎn)換結(jié)果存放在同一邏輯段、M2為首的單元中。

例:
題目分析:
壓縮BCD碼是用4位二進制碼表示1位十進制數(shù)
轉(zhuǎn)換ASCII碼時需要分別轉(zhuǎn)換高4位(十位數(shù))和低4位(個位數(shù))
0~9的ASCII碼的高4位均為0011(30H)
轉(zhuǎn)換低4位應(yīng)先使高4位清零,轉(zhuǎn)換高4位時須先將高4位移動到低4位的位置
程序例
LEA SI,M1
LEA DI,M2
MOV CH,4
Next:MOV AL,[SI]
MOV BL,AL
AND AL,0FH;高四位清零
OR AL,30H;高四位變0011,轉(zhuǎn)化為ASCII
MOV [DI],AL;表示個位的8位ASCII存入[DI]
INC DI
MOV AL,BL
MOV CL,4
SHR AL,CL;邏輯右移4次。高四位移動到低四位
OR AL,30H;高四位變0011,轉(zhuǎn)化為ASCII
MOV [DI],AL;十位的8位ASCII存入上個[DI]加一的地方
INC DI
INC SI
DEC CH
JNZ NExt;如果CH不為0,則跳轉(zhuǎn)到Next
HLT