博主聯系方式:
QQ:1540984562
QQ交流群:892023501
群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。
算數運算指令
- 1、加減法指令ADD、ADC 、SUB 、SBB 和增量減量指令INC、DEC、NEG
- ADD ADC例題講解
- SUB SBB例題講解
- 2、比較指令CMP
- CMP例題講解
- 3、乘除指令MUL IMUL DIV IDIV
- DIV、IDIV例題講解
- 4、符號擴展指令CBW CWD
- 5、BCD數運算調整指令(十進制調整指令)
1、加減法指令ADD、ADC 、SUB 、SBB 和增量減量指令INC、DEC、NEG
(1)不帶進位位加法指令
指令格式:ADD DST,SRC ; DST←DST+SRC
語法格式:ADD reg / mem ,reg/mem /imm8/imm16
指令功能:完成兩個操作數相加,結果送目的操作數DST。
該指令要求DST、SRC 不能同時為存儲器,DST不能為立即數,運算結果對標志位有影響。
例子:
(2)ADC 帶進位位加法指令
指令格式: ADC DST,SRC
功能:與ADD指令相同,只是相加時要加上進位位的當前值。
完成的操作為:== (DST) ← (SRC)+(DST)+ CF ==
DST、SRC 不能同時為存儲器, SRC可為立即數,運算結果對標志位有影響。
對狀態標志位的具體影響:
CF=1 二進制加法中最高有效位向高位有進位。
CF=0 二進制加法中最高有效位向高位無進位。
ZF=1 加法結果為0
ZF=0 加法結果不為0 。
OF=1 兩同符號數相加(正數+正數、或負數+負數),而結果符號與其相反。
OF=0 不同符號數相加。注意: (不同符號數相加不會產生溢出)
SF=1 加法結果為負(符號位為1)
SF=0 加法結果為正(符號位為0)。
ADD ADC例題講解
問:設在DVAR開始的連續8字節中分別存放著兩個數A(00127654H)和B(00049821H)(每個數為32位),求C=A+B,并將結果C放到DVARC開始的內存中
思路分析:完成雙字(32位)相加:先用ADD把低位字相加,再用ADC完成高位字的帶進位加法
data segmentDVAR DD 00127654H;DVAR DD 00049821H;DVARC DD ? ;存儲相加后的值
ends
;在數據段定義數據
LEA DI,DVAR;獲取DVAR地址
MOV AX,4[DI];第二個數的低位字的起始地址=DI+4,將其中內容送入AX
ADD AX,[DI];第一個數的低位字
MOV WORD PTR DVARC,AX;保存結果的低位字
MOV AX,6[DI];
ADC AX,2[DI]; 帶進位
MOV DVARC+2,AX;保存結果的高位字
語法知識點:
匯編中何時使用WORD/BYTE PTR
偽指令DD DW DB
(3) SUB DST,SRC 不帶借位減法指令
功能:進行兩個操作數的相減操作,結果送回DST。
完成的操作: DST←DST-SRC
(4) SBB DST,SRC 帶借位減法指令
功能:與SUB相類似,但相減時還應減去標志CF的當前值。
完成的操作: DST←DST-SRC-CF
語法格式:SUB(SBB) reg/mem ,reg/mem/imm
DST、SRC可以是存儲器或寄存器, 但不能同時為存儲器。運算結果對標志位有影響。
SUB SBB例題講解
問:設DVAR1和DVAR2保存有雙字數,求(DVAR1)- (DVAR2),并將結果保存在雙字變量DVARR中。
data segmentDVAR1 DD 00127654H;DVAR2 DD 00049821H;DVARR DD ? ;存儲相減后的值
ends
;在數據段定義數據
MOV AX,WORD PTR DVAR1;
SUB AX,WORD PTR DVAR2;
MOV WORD PTR DVARR,AX;保存結果的低位字
MOV AX,WORD PTR DVAR1+2;
SBB AX,WORD PTR DVAR2+2; 帶借位
MOV WORD PTR DVARR+2,AX;保存結果的高位字
(5) INC OPR 加1指令
對指定的操作數進行加1操作,其操作數OPRD可以是任意一個通用寄存器,也可以在內存單元中。
該指令影響標志位,但不影響CF標志位。
完成的操作: OPR OPR+1
INC AL ; AL←AL+1
INC (SI); (SI) (SI)+1
(6) DEC OPR 減1指令
功能:實現對操作數的減1操作,操作數可以是通用寄存器,也可以在內存單元中。減1操作時,把操作數看作為無符號的二進制數。
完成的操作: OPRD OPRD-1
語法格式:DEC reg/mem
DEC BX ; BX BX-1
DEC(DI);(DI) (DI)-1
(7) NEG (取負指令)
格式: NEG DST;
轉換成二進制算法:
OPR OPRD ‘+1
或: OPR FFFFH -(OPR)’+1
2、比較指令CMP
指令格式: CMP OPR1,OPR2;OPR1-OPR2 結果影響標志位。
語法格式:CMP reg/mem ,reg/mem/imm
功能:做兩個數的比較,與減法指令一樣執行OPR1-OPR2操作,但相減后不回送結果,只是根據相減結果修改標志位。
OPR1、OPR2可以是存儲器或寄存器,不能同時為存儲器,OPR2還可為立即數,運算結果對標志位有影響。
比較結果有三種可能:AX>BX 、 AX<BX 、 AX=BX
對標志位的影響:
CF=1 減法中最高有效位向高位有借位( AX<BX )
CF=0 減法中最高有效位向高位無借位( AX≥BX )
ZF=1 結果為0(AX=BX);
ZF=0 ,結果不為0(AX≠BX)
OF=1 兩數符號相反(正數-負數、或負數-正數),而結果符號與減數(BX)相同。
OF=0 同符號數相減。
CMP例題講解
問:若自BLOCK開始的內存緩沖區中,有100個帶符號的數,希望找到其中最大的一個值,并將它放到MAX單元中。
分析思路:循環語句 加一減一指令、找到最大值:需要比較語句CMP
帶符號的數:一個字大小
data segmentBLOCK DD 00127654H;......BLOCK DD 00049821H;MAX DD ?;
ends
;在數據段定義數據
MOV BX,OFFSETBLOCK; ==LEA BX,BLOCK; 獲取地址
MOV AX,[BX]; 將第一個數存入AX
INC BX;
INC BX; 地址轉到下一個數:BX+2
MOV CX,99;計數器置數
AGAIN:CMP AX,[BX]; AX中的數和BX指向的數
JG NEXT ;大于則轉,AX>[BX]
MOV AX,[BI]; 否則把[BX]送入AX
NEXT:DEC CX;
INC BX;
INC BX;計數減1,bi指向下一個數
JNZ AGAIN;所有的數比較完了嗎?沒完轉AGAIN繼續
MOV [MAX],AX; 將AX內容送入存儲單元MAX
3、乘除指令MUL IMUL DIV IDIV
(1)無符號數乘法指令MUL
格式:MUL SRC ;(AX)(AL)×(SRC)字節乘法
(DX,AX)(AX)×(SRC)字乘法
語法格式:MUL reg/mem
要求:字節運算時,目的操作數(被乘數)(隱含指令)必須是累加器AL,在做乘法運算時要先把被乘數設置好,即被乘數和乘積是隱含的形式,被乘數和乘數都是無符號數,乘積存放在寄存器AX中。進行字運算時,目的操作數必須是累加器AX,乘積在寄存器DX,AX中。源操作數不允許使用立即數。
示意圖:
(2) 帶符號數乘法指令IMUL
格式:IMUL SRC ;(AX) (AL)×(SRC)字節
;(DX,AX) (AX)×(SRC)字
語法格式:IMUL reg/mem
注意:操作同無符號數乘法相同
對標志位的影響也可相類比。
例: MOV AL 66H;被乘數送AL
MOV BL 88H;乘數送BL
MUL BL ;無符號乘法,AL×BL結果存于AX中
MOV AX,6666H ;被乘數(字)送AX
MOV BX,4567H ;乘數(字)送BX
MUL BX ;結果的高字在DX中,低字在AX中
何時使用帶符號和不帶符號?
MUL和IMUL指令的使用條件是由數的屬性決定(由程序設計者自己確定)。
如(11111111B)× (11111111B)為無符號數時為255×255=65025,
而為有符號數時為(-1)×(-1)=1,因此根據要相乘數的格式決定選用那一種指令。
對標志位的影響:
乘法指令運算結果影響狀態標志,但對CF、OF有特殊的定義。
字與字節相乘:
MOV AL,15H;
CBW; CBW = convert byte to word邏輯意義就是al的符號擴展到ah
節擴展CBW的基本功能是(AH)=00H,當(AL)的最高有效位為0時。AH)=FFH,當(AL)的最高有效位為1時
MOV BX,0FB78H;
IMUL BX;
(3)無符號數除法指令DIV (被除數和結果隱含)
格式:DIV SRC ;(AL) (AX)/(SRC)除法的商
字節操作 (AH) (AX)/(SRC)除法余數
字操作 (AX) (DX,AX)/(SRC)除法的商
(DX) (DX,AX)/(SRC)除法余數
(4)帶符號除法指令IDIV (被除數和結果隱含)
格式:IDIV SRC ;(AL) (AX)/(SRC)除法的商
字節操作 (AH) (AX)/(SRC)除法余數
字操作 (AX)(DX,AX)/(SRC)除法的商
(DX)(DX,AX)/(SRC)除法余數
形象表示:
== 需要注意點:==
1) 如果除數為0,則產生0型中斷。
2) 除法指令運算結果對狀態標志無定義。
3) 除法指令要求字操作時,被除數必須為32位,除數是16位,商和余數是16位;字節操作時,被除數必須為16位,除數是8位,商和余數是8位。(被除數必須大于除數)。
4)有符號與無符號除法完成的操作相同,只是做有符號除法時,操作數是有符號的,得到的商和余數也是有符號的,余數的符號同被除數符號相同。
DIV、IDIV例題講解
問:***分別實現下列數據的無符號和有符號除法
DATA7 DW 9400H ;被除數
DATA8 DW 0060H ;除數
QUOT DW ? ;商
REMAIN DW ? ;余數 ***
;無符號
MOV AX,DATA7;
MOV DX,0;
DIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;
;有符號
MOV AX,DATA7;
;CWD可將AX內容擴展到DX、AX。規則是若AX最高位=1,則執行后DX=FFFFH;若AX最高位=0,則執行后DX=0000H
IDIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;
符號擴展指令CBW,CWD是什么意思?
4、符號擴展指令CBW CWD
5、BCD數運算調整指令(十進制調整指令)
開始寫這一類指令時感覺有點蒙,看了這篇文章感覺稍微好了點,建議先看這篇文章再往下了解具體指令。
http://www.elecfans.com/dianzichangshi/20171124586013.html
BCD碼:用4位二進制碼表示1位10進制數。
它和二進制碼并不相同,為了得到正確結果我們需要進行修正。
BCD分為兩類:
1)、分離BCD碼:8位寄存器包含一位BCD碼 (非壓縮BCD)
2)、組合BCD碼:8位寄存器包含2位BCD碼 (壓縮BCD)
1、加法調整指令AAA DAA
AAA——對AL中非壓縮的BCD數的加法結果進行調整;
具體操作:
1、對相加結果AL的低四位+6修正
2、觀察AF
AF有進位,則AH=1,CF=1,AF=l;
AF無進位,則AH=0,CF=0,AF=0。
3、清AL的高4位
DAA——對AL中的兩個壓縮十進制數相加之和進行調整,得到壓縮十進制和;
具體操作:
對相加結果AL的低4位和高4位分別進行+6修正。對標志位的影響等同于ADD指令
壓縮BCD和非壓縮BCD的區別
壓縮BCD碼
用一個字節表示兩位BCD碼,高位表示十位數BCD碼,低位表示個位數BCD碼,稱為壓縮型BCD碼。
例如:十進制數56用壓縮8421BCD碼表示為0101 0110
非壓縮BCD碼
用一個字節表示一位BCD碼,高位為0,低位為BCD碼。
例如:十進制數5用非壓縮8421BCD碼表示為0000 0101
參考鏈接
問:計算十進制數的運算:4+8
;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,34H; BCD表示十進制數34
MOV BL,28H; BCD表示十進制數28
ADD AL.BL;
;在此之前(AL)=5CH,(按照二進制相加)
DAA;
;在此之后,(AL)=62H(轉化成BCD碼)
2、減法調整指令AAS DAS
AAS——對AL中非壓縮的BCD數的減法結果進行調整;
對非壓縮BCD碼的低位AL進行減6處理,觀察AF有無借位
AF有借位,則CF=1,AF=l;
AF無借位,則CF=0,AF=0。
DAS——對AL中的兩個壓縮十進制數相減之差進行調整,得到壓縮十進制差;
對壓縮BCD碼的高位AH和低位AL都進行減6處理。對標志位的影響等同于SUB指令。
問:計算十進制數的運算:5-9
;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,05H; BCD表示十進制數5
MOV BL,09H; BCD表示十進制數9
SUB AL.BL;
AAS
問:計算十進制數的運算:31-87
;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,31H; BCD表示十進制數5
MOV BL,87H; BCD表示十進制數9
SUB AL.BL;
DAS
3、乘法調整指令AAM
AAM——對AX中兩個ASCII未壓縮十進制相乘結果進行調整;
調整方法:將結果(AL)除以10,商為(AH)的低4位,余數為(AL)的低4位
問:計算十進制數的運算:78*
;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,7;
MOV BL,8;
MUL BL;
AAM
4、除法調整指令AAM
AAD——在除法指令前對AX中ASCII未壓縮的十進制數進行調整;
調整方法:(AL)=(AH)*10+(AL);使(AH)=0,接下來操作是正常的除法操作。
問:計算十進制數的運算:274*
;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AX,0207H;
MOV BL,4;
AAD ;(AX)<-001BH
DIV BL;
總結,因為BCD的類型而總分為兩類的指令其實本質相同,其中,
加減乘都是通過一些操作從而將結果進行修正,從二進制轉為BCD形式。
除法卻是對被除數進行操作,這點需要特別注意*
【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176