




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第六講杭州電子科技大學(xué)微機原理與接口技術(shù)10/18/20221§3-38086的指令系統(tǒng)
按功能可分為以下六類:數(shù)據(jù)傳送指令算術(shù)運算指令邏輯運算和移位指令串操作指令轉(zhuǎn)移指令處理器控制指令10/18/20222§3-38086的指令系統(tǒng)一、數(shù)據(jù)傳送指令(14條)通用數(shù)據(jù)傳送指令地址目標(biāo)傳送指令MOV字節(jié)或字的傳送LEA裝入有效地址PUSH如棧指令LDS裝入數(shù)據(jù)段寄存器POP出棧指令LES裝入附加段寄存器XCHG交換字或字節(jié)標(biāo)志傳送指令XLAT表轉(zhuǎn)換LAHF標(biāo)志寄存器低字節(jié)裝入AH輸入輸出指令SAHFAH內(nèi)容裝入標(biāo)志寄存器低字節(jié)IN輸入PUSHF標(biāo)志寄存器入棧指令OUT輸出POP出棧,并送入標(biāo)志寄存器10/18/20223§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令(GeneralPurposeDataTranfers)(1)MOV傳送指令(Move)
指令格式:MOV
目的,源
指令功能:實現(xiàn)CPU的內(nèi)部寄存器間或寄存器與存儲器間的數(shù)據(jù)傳送。例:MOVAX,0FF00HMOV[DI],AXMOVCX,[1000H]MOVBL,40HMOVWORDPTR[SI],01HMOVAL,BL通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL立即數(shù)存儲器段寄存器CS,DS,ES,SS10/18/20224§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令注意:指令中至少要有一項明確說明傳送的是字節(jié)還是字;IP寄存器不能用作源操作數(shù)或目的操作數(shù);立即數(shù)和CS寄存器不能用作目的操作數(shù);除了源操作數(shù)為立即數(shù)的情況外,兩個操作數(shù)中必有一個是寄存器,但不能都是段寄存器;即MOV指令不能在兩個存儲單元之間直接傳送數(shù)據(jù),也不能在兩個段寄存器之間直接傳送數(shù)據(jù)。(1)MOV傳送指令(Move)10/18/20225§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(1)MOV傳送指令(Move)【數(shù)據(jù)段】通常,數(shù)據(jù)通常存放在數(shù)據(jù)段中。例如,某個程序的數(shù)據(jù)段:
DATA
SEGMENT
;數(shù)據(jù)段開始
AREA1
DB
14H,3BH
;定義字節(jié)變量
AREA2
DB
3DUP(0)
;復(fù)制操作
ARRAY
DW
3100H,01A6H
;定義字變量
STRING
DB
‘GOOD’
DATA
ENDS
;數(shù)據(jù)段結(jié)束匯編后,DATA將被賦予一個具體的段地址。各變量將自偏移地址0000H開始依次存放,各符號地址等于它們在數(shù)據(jù)段中的偏移量。143B000001‘G’000031A6‘O’‘O’‘D’AREA1AREA2ARRAYSTRING10/18/20226§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(1)MOV傳送指令(Move)AREA1的偏移地址為0000H;AREA2的偏移地址為0002H;ARRAY的偏移地址為0005H;STRING的偏移地址為0009H。143B000001‘G’000031A6‘O’‘O’‘D’AREA1AREA2ARRAYSTRING
DATA SEGMENT ;數(shù)據(jù)段開始
AREA1 DB14H,3BH;定義字節(jié)變量
AREA2 DB3DUP(0);復(fù)制操作
ARRAY DW3l00H,01A6H;定義字變量
STRING DB‘GOOD’DATA ENDS ;數(shù)據(jù)段結(jié)束10/18/20227§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(1)MOV傳送指令(Move)143B000001‘G’000031A6‘O’‘O’‘D’AREA1AREA2ARRAYSTRING例
MOVDX,OFFSETARRAY解:ARRAY的偏移地址DX。(OFFSET:取后面的符號偏移地址的值)
設(shè):ARRAY的定義如左圖所示
則:DX=0005H例:MOVAL,AREA1;ALAREA1中的內(nèi)容14H
MOVAREA2,AL;0002H單元14H10/18/20228§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(2)PUSH進棧指令(PushWordontoStack)指令格式:PUSH
源
指令功能:數(shù)據(jù)入堆棧
工作過程:SP←SP-2;(SP+1,SP)←源
源操作數(shù)要求:可以是16位通用寄存器、段寄存器、存儲器中的數(shù)據(jù)字,但不能是立即數(shù)。
最后一項
高地址棧底(SP)壓入彈出棧頂(SS)最大容量64KSP總是指向偶地址單元段址10/18/20229§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(3)POP出棧指令(PopWordoffStack)指令格式:POP
目的
指令功能:數(shù)據(jù)出堆棧
工作過程:目的
←(SP+1,SP) SP←SP+
2;目的操作數(shù)要求:
可以是16位通用寄存器、段寄存器或存儲單元,但CS不能作目的操作數(shù)。
最后一項
高地址棧底(SP)壓入彈出棧頂(SS)最大容量64KSP總是指向偶地址單元段址10/18/202210§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令PUSH、POP指令實例10/18/202211§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(4)XCHG交換指令(Exchange)指令格式:XCHG
目的,源
指令功能:源操作數(shù)、目的操作數(shù)數(shù)據(jù)交換。操作數(shù)要求:交換可以在寄存器之間、寄存器與存儲器之間進行;段寄存器不能作為操作數(shù);不能直接交換兩個存儲單元中的內(nèi)容。例設(shè)AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H。則執(zhí)行指令XCHGAX,[BX+200H]后,結(jié)果如何?解:把內(nèi)存中的一個字與AX中的內(nèi)容進行交換。源操作數(shù)物理地址=3000×10H+1800H+200H=31A00H,指令執(zhí)行后:AX=1995H,(3lA00H)=2000H10/18/202212§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(5)XLAT表轉(zhuǎn)換指令(TableLookup-Translation)指令格式:
XLAT轉(zhuǎn)換表
或:XLAT
指令功能:使累加器(AL)中的一個值變換為內(nèi)存表格中的某一個值,一般用來實現(xiàn)代碼轉(zhuǎn)換,即查表功能。XLAT指令使用步驟:使用之前必須先建立一個表格,表格中的內(nèi)容是所需要轉(zhuǎn)換的代碼;將轉(zhuǎn)換表的起始地址裝入BX寄存器;欲查的某項與表頭地址的位移量AL,即表格最多包含256個字節(jié);執(zhí)行XLAT指令后,根據(jù)位移量從表中查到轉(zhuǎn)換后的代碼值A(chǔ)L寄存器中。10/18/202213§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(5)XLAT表轉(zhuǎn)換指令(TableLookup-Translation)例
若十進制數(shù)字0~9的LED七段碼對照表如表所示,試用XLAT指令求數(shù)字5的七段碼值。
十進制數(shù)字七段顯示碼十進制數(shù)字七段顯示碼040H512H179H602H224H778H330H800H419H918H十進制數(shù)的七段顯示碼表10/18/202214§3-38086的指令系統(tǒng)-數(shù)據(jù)傳送指令(5)XLAT表轉(zhuǎn)換指令(TableLookup-Translation)程序如下:
TABELDB40H,79H,24H,30H,19H;七段數(shù)碼表數(shù)據(jù)
DB12H,02H,78H,00H,18H;分別對應(yīng)0~9的七段字型碼
……………MOV AL,5
;AL數(shù)字5的位移量
MOV BX,OFFSETTABLE ;BX表格首地址
XLATTABLE ;查表得:AL=12H10/18/202215
§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
2.輸入輸出指令(InputnndOutput)IN指令:從數(shù)據(jù)端口輸入數(shù)據(jù)或從狀態(tài)端口輸入狀態(tài)字。OUT指令:輸出數(shù)據(jù)或命令給指定的I/O端口。
<1>
直接輸入輸出指令格式:INAL,PORT;AL(PORT)INAX,PORT;AX(PORT+1,PORT)OUTPORT,AL;(PORT)ALOUTPORT,AX;(PORT+1,PORT)AX注:PORT為輸入輸出端口號,范圍為0~255(00~
FFH)10/18/202216
<2>間接輸入輸出指令
格式:INAL,DX;
AL(DX)INAX,DX;AX(DX+1,DX)OUTDX,AL;(DX)ALOUTDX,AX;(DX+1,DX)AX
在間接輸入輸出指令之前,需將端口號送入DX寄存器。
MOVDX,XXXXH;例
OUT 85H,AL ;85H端口AL內(nèi)容
MOV DX,0FF4H ;端口地址DX=0FF4H OUT DX,AL ;FF4H端口AL內(nèi)容
MOV DX,300H ;DX指向300HOUT DX,AX ;300H端口
AL內(nèi)容,
301H端口AH內(nèi)容§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
10/18/202217
3.地址目標(biāo)傳送指令(AddressObjectTransfers):
專用于傳送地址碼的指令,它可以用來傳送操作數(shù)的段地址和偏移地址,含以下三條指令:
⑴LEA取有效地址指令(LoadEffectiveAddress)
指令格式:LEA目的,源
指令功能:取源操作數(shù)地址的偏移量,傳送到目的操作數(shù)
操作數(shù)要求:源操作數(shù)必須是存儲單元,目的操作數(shù)必須是一個除段寄存器之外的16位寄存器。使用時要注意與MOV指令的區(qū)別。例假設(shè)SI=1000H,DS=5000H,(51000H)=1234H
LEA BX,[SI];執(zhí)行完該指令后,BX=1000H(送偏移地址)
MOV BX,[SI];執(zhí)行完該指令后,BX=1234H(送內(nèi)容)§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
10/18/202218
⑵LDS將雙字指針?biāo)偷郊拇嫫骱虳S指令(LoadPointerusingDS)
指令格式:LDS 目的,源指令功能:從源操作數(shù)指定的存儲單元中,取出一個變量的4字節(jié)地址指針,送進一對目的寄存器。其中前兩個字節(jié)(表示變量的偏移地址)送到指令中指定的目的寄存器中,后兩個字節(jié)(表示變量的段地址)送入DS寄存器。操作數(shù)要求:源操作數(shù)必是存儲單元,該單元開始的連續(xù)4個字節(jié)存放一個變量的地址指針。目的操作數(shù)必須是16位寄存器,常用SI寄存器,但不能用段寄存器。例設(shè)DS=1200H,(12450H)=F346H,(12452H)=0A90H,
執(zhí)行指令LDSSI,[0450H]
后,SI=F346H,DS=0A90H注:源操作數(shù)的物理地址=DS×10H+450H=12450H§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
10/18/202219⑶LES將雙字指針?biāo)偷郊拇嫫骱虴S指令(LoadPointerusingEs)指令格式:LES 目的,源指令功能:與LDS指令的操作基本相同,不同的是:要將源操作數(shù)所指向的存儲單元里存放的地址指針中的段地址部分送到ES寄存器中,而不是DS寄存器,目的操作數(shù)常用DI寄存器。例
設(shè)DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。執(zhí)行指令LESDI,[BX]
后,DI=0300H,ES=0500H注:源操作數(shù)的物理地址=DS×10H+BX=0100H×10H+0020H=01020H§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
10/18/202220
4.標(biāo)志傳送指令(FlagTransfers):
讀取標(biāo)志指令
:LAHF(5、3、0為任意值)
--標(biāo)志寄存器低8位AH設(shè)置標(biāo)志指令:SAHF
--標(biāo)志寄存器低8位AH,影響PSW把標(biāo)志寄存器的內(nèi)容壓入堆棧:PUSHF從堆棧彈出到標(biāo)志寄存器:POPF,影響PSW1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0§3-38086的指令系統(tǒng)——數(shù)據(jù)傳送指令
10/18/202221§3-38086的指令系統(tǒng)
——數(shù)據(jù)傳送指令
⑴LAHF標(biāo)志送到AH指令(LoadAHfromFlag)
指令格式:LAHF
指令功能:標(biāo)志寄存器SF、ZF、AF、PF和CF
→
AH寄存器的位7、6、4、2和0。
注意:◎位5、3、1的內(nèi)容未定義,是任意值。
◎執(zhí)行這條指令后,標(biāo)志位本身并不受影響。
◎這5個標(biāo)志送進AH后,AH便相當(dāng)于8080/8085的標(biāo)志寄存器,從而能對8080/8085程序進行轉(zhuǎn)換,使它們能運行在8086/8088系統(tǒng)上。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D010/18/202222§3-38086的指令系統(tǒng)
——數(shù)據(jù)傳送指令
⑵SAHFAH送標(biāo)志寄存器(StoreAHintoFlags)
指令格式:SAHF
指令功能:AH內(nèi)容→標(biāo)志寄存器。
注意:
◎位5、3、1的內(nèi)容未定義,是任意值。
◎執(zhí)行這條指令后,高位標(biāo)志并不受影響。
◎為8080/8085提供兼容性。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D010/18/202223§3-38086的指令系統(tǒng)
——數(shù)據(jù)傳送指令
⑶PUSHF標(biāo)志入棧指令(PushFlagontoStack)
指令格式:PUSHF
指令功能:將標(biāo)志寄存器PSW中的內(nèi)容壓入堆棧;并修改堆棧指針,使SPSP-2;
指令執(zhí)行后對標(biāo)志位無影響。⑷POPF標(biāo)志出棧指令(PopFlagoffStack)
指令格式:POPF
指令功能:將堆棧指針SP所指的一個字彈入標(biāo)志寄存器PSW;并修改堆棧指針,使SPSP+2。
注意:▲要成對使用PUSHF和POPF,可對標(biāo)志寄存器進行保存和恢復(fù)?!S迷冢哼^程(子程序)調(diào)用,中斷服務(wù)程序,對主程序的狀態(tài)(即標(biāo)志位)進行保護?!部捎脕砀淖冏粉櫂?biāo)志TF。在8086指令系統(tǒng)中沒有直接改變TF(D8位)的指令。10/18/202224§3-38086的指令系統(tǒng)
——算術(shù)運算指令二、算術(shù)運算指令算術(shù)運算指令可處理4種類型的數(shù):無符號二進制整數(shù)帶符號二進制整數(shù)無符號壓縮十進制整數(shù)(PackedDecimal)無符號非壓縮十進制整數(shù)(UnpackedDecimal)一個8位二進制數(shù)可看成4種不同類型的數(shù),所表示的數(shù)值亦不同。數(shù)的表示:二進制數(shù):可以是8位或16位,若是帶符號數(shù),則用補碼表示。壓縮十進制數(shù):一個字節(jié)中存放兩個BCD碼十進制數(shù)。非壓縮十進制數(shù):—個字節(jié)的低半字節(jié)存放十進制數(shù),高半字節(jié)為全零。例如,對十進制數(shù)字58:壓縮十進制數(shù)表示:只需一個字節(jié),即01011000B;非壓縮十進制數(shù)表示:需兩個字節(jié),即00000101B和00001000B。10/18/202225§3-38086的指令系統(tǒng)
——算術(shù)運算指令二進制碼(B)十六進制(H)無符號二進制(D)帶符號二進制(D)非壓縮十進制壓縮十進制00000111077+77071000100189137-119無效8911000101C5197-59無效無效4種類型數(shù)的表示方法8086/8088指令系統(tǒng)提供:加、減、乘、除運算指令:處理無符號或帶符號的8位/16位二進制數(shù)的算術(shù)運算;調(diào)整操作指令:進行壓縮的或非壓縮的十進制數(shù)的算術(shù)運算;加法和減法運算指令:帶符號數(shù)和無符號數(shù)的加法和減法的運算可以用同一條加法或減法指令來完成。乘法和除法運算:分別設(shè)置無符號數(shù)和帶符號數(shù)的乘、除法指令。絕大部分算術(shù)運算指令都影響狀態(tài)標(biāo)志位。10/18/202226§3-38086的指令系統(tǒng)
——算術(shù)運算指令加法減法ADD加法SUB減法ADC帶進位的加法SBB帶借位的減法INC增量DEC減量AAA加法的ASCII調(diào)整NEG取負(fù)DAA加法的十進制調(diào)整CMP比較除法AAS減法的ASCII調(diào)整DIV無符號數(shù)除法DAS減法的十進制調(diào)整IDIV整數(shù)除法乘法AAD除法的ASCII調(diào)整MUL無符號數(shù)乘法CBW把字節(jié)轉(zhuǎn)換成字IMUL整數(shù)除法CWD把字轉(zhuǎn)換成雙字AAM乘法的ASCII調(diào)整算術(shù)邏輯指令10/18/2022271.加法指令(Addition)⑴ADD加法指令(Addition)
指令格式:ADD目的,源指令功能:目的←源十目的⑵ADC帶進位的加法指令(AdditionwithCarry)
指令格式:ADC目的,源指令功能:目的←源十目的十CF注意:源操作數(shù)可以是寄存器、存儲器、立即數(shù);目的操作數(shù):只能用寄存器、存儲單元。源、目的操作數(shù)不能同時為存儲器,且類型必須一致,均為字節(jié)或字;這兩條指令影響的標(biāo)志位為:CF、OF、PF、SF、ZF和AF?!?-38086的指令系統(tǒng)
——算術(shù)運算指令10/18/202228§3-38086的指令系統(tǒng)
——算術(shù)運算指令例:兩種加法指令的實例
ADDAL,18H ;AL←
AL十18HADCBL,CL ;BL←
BL十CL十CFADCAX,DX ;AX←
AX十DX十CFADDAL,COST[BX];AL內(nèi)容和地址=DS:(COST+BX)的存儲字節(jié);相加,結(jié)果送ALADDCOST[BX],BL;將BL與物理地址=DS:(COST十BX)的存儲字節(jié)相加,結(jié)果留在該存儲單元中例:用加法指令對兩個8位16進制數(shù)5EH和3CH求和,并分析加法運算指令執(zhí)行后對標(biāo)志位的影響。解:MOVAL,5EH ;AL=5EH(94)
MOVBL,3CH ;BL=3CH(60)
ADDAL,BL ;結(jié)果AL=9AH10/18/202229§3-38086的指令系統(tǒng)
——算術(shù)運算指令討論ADD對標(biāo)志位的影響:▲兩個數(shù)的相加過程:
010111105EH=94
+00111100即:
+3CH=60100110109AH=154運算后標(biāo)志位:ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1?!鴮?biāo)志的解釋(人為決定):①兩個加數(shù)都看成無符號數(shù)時,運算結(jié)果為9AH,即十進制數(shù)154。在這種情況下,SF和OF都沒有意義,我們只關(guān)心ZF和CF標(biāo)志,在BCD碼運算或奇偶校驗時才考慮AF或PF標(biāo)志。②兩個加數(shù)都當(dāng)成帶符號數(shù)時,符號標(biāo)志SF和溢出標(biāo)志OF很重要,而進位標(biāo)志CF沒有意義。帶符號數(shù)能表示的范圍-128~+127,而本例中,兩個正數(shù)94和60相加,其和為154,由于154超過了范圍,即產(chǎn)生了溢出,OF=110/18/202230§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑶INC增量指令(Increment)
指令格式:INC目的指令功能:目的←目的十1
操作數(shù)的要求:通用寄存器、內(nèi)存。注意:▲這條指令主要用在循環(huán)程序中,對地址指針和循環(huán)計數(shù)器等進行修改;▲指令執(zhí)行后影響AF、OF、PF、SF和ZF,但不影響進位標(biāo)志CF?!撝噶钪挥幸粋€操作數(shù)時,如果要使內(nèi)存單元的內(nèi)容增1,程序中必須說明該存儲單元是字還是字節(jié)。例INCBL
;BL寄存器中內(nèi)容增1
INCCX
;CX寄存器中內(nèi)容增1INCBYTEPRR[BX];內(nèi)存字節(jié)單元內(nèi)容增1INCWORDPTR[BX];內(nèi)存字單元內(nèi)容增1
其中,PTR為類型說明符,前面加BYTE說明操作數(shù)類型為字節(jié),加WORD則說明操作數(shù)類型為字。10/18/202231§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑷AAA加法的ASCII調(diào)整指令(ASCIIAdjustforAddition)
指令格式:AAA
指令功能:在用ADD或ADC指令對兩個非壓縮十進制數(shù)或ASCII碼表示的十進制數(shù)作加法后,運算結(jié)果已存在AL中,用此指令將AL寄存器中的運算結(jié)果調(diào)整為一位非壓縮十進制數(shù),仍保留在AL中。如果AF=1,表示向高位有進位,則進到AH寄存器中。(注:非壓縮十進制數(shù)的高4位為全0,低4位為十進制數(shù)字0~9。例如,將9表示成00001001)調(diào)整過程:若AL低4位>9或AF=1
則:①AL←AL十6②用與操作(∧)將AL高4位清0③AF置1,CF置1,AH←AH十l
否則,僅將AL寄存器的高4位清0。10/18/202232§3-38086的指令系統(tǒng)
——算術(shù)運算指令例若AL=BCD9,BL=BCD5,求兩數(shù)之和。解:設(shè)AH=0,則運算過程如下:
ASCII碼表示的十進制數(shù),高半字節(jié)均為3,運算時需用AND指令將它屏蔽。只要使用AAA指令,可以不必屏蔽高半字節(jié),便能在AX中得到一個正確的非壓縮十進制數(shù)。ADDAL,BL;00001001…9;+00000101…5
AAA;00001110…低4為>9;+00000110…加6調(diào)整;00010100
;^00001111…清高4位;00000100…AL=4
;CF=1,AF=1,AH=1;結(jié)果為AX=0104H,表示非壓縮十進制數(shù)14
10/18/202233§3-38086的指令系統(tǒng)
——算術(shù)運算指令例求ASCII碼表示的數(shù)9(39H)與5(35H)之和。
設(shè)AH=0,則運算過程如下:
在AAA指令后加上一條“或”指令ORAX,3030H,便使AX中的結(jié)果變成了ACSII碼3134H。MOVAL,‘9’;AL=39HMOVBL,‘5’;BL=35HADDAL,BL;00111001…’9’;+00110101…’5’AAA;01101110…低4為>9;+00000110…加6調(diào)整;01110100
;^00001111…清高4位;00000100…AL=4
;CF=1,AF=1,AH=1;結(jié)果為AX=0104H,表示非壓縮十進制數(shù)14
10/18/202234§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑸DAA加法的十進制調(diào)整指令(DecimalAdjustforAddition)
指令格式:DAA
指令功能:將兩個壓縮BCD數(shù)相加后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。注意:相加后的結(jié)果必須在AL中,才能使用DAA指令。調(diào)整過程:
①若AL的低4位>9或AF=1,則AL←AL十6,對低4位進行調(diào)整;
②若此時AL的高4位>9或CF=1,則AL←AL十60H,對高4位進行調(diào)整,并使CF置1,否則CF置0。10/18/202235§3-38086的指令系統(tǒng)
——算術(shù)運算指令例若AL=BCD88,BL=BCD49,求兩數(shù)之和。解運算過程為:MOVAL,88H;AL=88HMOVBL,49H;BL=49HADDAL,BL;10001000…88;+01001001…49DAA;11010001…AF=1;+00000110…加6調(diào)整;11010111…調(diào)整后高半字節(jié)>9
;+01100000…加60H調(diào)整;00110111…結(jié)果為AL=BCD37,CF=1
10/18/202236§3-38086的指令系統(tǒng)
——算術(shù)運算指令2.減法指令(Subtration)
⑴SUB減法指令(Subraction)
指令格式:SUB目的,源指令功能:目的←
目的-源
例
SUBAX,BX ;AX←AX-BXSUBDX,1850H;DX←DX-1850HSUBBL,[BX] ;BL中內(nèi)容減去物理地址=DS:(BX)處的字節(jié),結(jié)果存入BL
⑵SBB帶借位的減法指令(SubtractwithBorrow)
指令格式:SBB目的,源指令功能:目的←
目的-源-CF(SBB主要用于多字節(jié)減法中)例
SBBAL,CL
;AL←AL-CL-CF10/18/202237§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑶DEC減量指令(Decrement)
指令格式:DEC目的指令功能:目的←
目的-l
例
DECBX ;BX←BX-1DECWORDPTR[BP] ;堆棧段中位于[BP]偏置處的字減1⑷NEG取負(fù)指令(Negate)指令格式:NEG目的指令功能:目的←0-目的,即對目的操作數(shù)取負(fù)
例
NEGAX ;將AX中的數(shù)取負(fù)
NEGBYTEPTR[BX];對數(shù)據(jù)段中位于[BX]偏置處的字節(jié)取負(fù)
⑸CMP比較指令(Compare)
指令格式:CMP目的,源指令功能:目的-源,結(jié)果不回送到目的操作數(shù)中,僅反映在標(biāo)志位上。用途:用在比較兩個數(shù)大小又不破壞原操作數(shù)的場合。10/18/202238§3-38086的指令系統(tǒng)
——算術(shù)運算指令減法指令小結(jié):(上述五種指令都做減法運算)①對于雙操作數(shù)指令(SUB、SBB、CMP):▲源操作數(shù)可以是寄存器、存儲器或立即數(shù);▲目的操作數(shù)可以是寄存器、存儲器,但不能為立即數(shù);▲兩個操作數(shù)不能同時為存儲器。②對于單操作數(shù)指令(DEC、NEG):▲目的操作數(shù)可以是寄存器、存儲器,但不能為立即數(shù);▲如果是存儲器操作數(shù),還必須說明其類型是字節(jié)還是字。③運算之后,除DEC指令不影響CF標(biāo)志外,其它均影響OF、SF、ZF、AF、PF和CF標(biāo)志。④在減法操作后,如果源操作數(shù)大于目的操作數(shù),需要借位時,進位/借位標(biāo)志CF將被置1。
10/18/202239§3-38086的指令系統(tǒng)
——算術(shù)運算指令
例
設(shè)AL=10110001B,DL=01001010B,求AL-DL。解:SUBAL,DL;與加法操作一樣,對結(jié)果的解釋取決于參與運算的數(shù)的性質(zhì),運算過程如下:
二進制減法當(dāng)成無符號數(shù)當(dāng)成帶符號數(shù)
10110001177-79
-01001010-74-)+7401100111103+103
運算后標(biāo)志位ZF=0,AF=1,CF=0,SF=0,PF=0,OF=1。討論:▲兩數(shù)為無符號數(shù):表示177與74的差是103。CF=0表示沒有借位,SF和OF無意義?!鴥蓴?shù)為帶符號數(shù):表示-79-(+74),結(jié)果應(yīng)為-153。但結(jié)果卻為正數(shù)(103),這是由于-153溢出造成的。此時,SF和OF有重要意義。
10/18/202240§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑹AAS減法的ASCII調(diào)整指令(ASCIIAdjustforSubtraction)
指令格式:AAS
指令功能:將AL寄存器中的運算結(jié)果調(diào)整為正確的非壓縮十進制數(shù)之差,仍保留在AL中。使用前提:用SUB或SBB指令對兩個非壓縮十進制數(shù)或ASCII碼表示的十進制數(shù)作減法,運算結(jié)果已存在AL。調(diào)整過程:若AL寄存器的低4位>9或AF=1,
則:①AL←AL-6,AF置1
②將AL寄存器高4位清零
③AH←AH-l,CF置l
否則,不需要調(diào)整10/18/202241§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑺DAS減法的十進制調(diào)整指令(DecimalAdjustforSubtracion)
指令格式:DAS
指令功能:將AL中兩個壓縮BCD數(shù)相減后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。高4位和低4位分別進行調(diào)整。使用前提:在兩個壓縮十進制數(shù)用SUB或SBB相減后,結(jié)果在AL中。調(diào)整過程:
①如果AL寄存器的低4位>9或AF=1
則:AL←AL-6,AF置1
②如果此時AL高半字節(jié)>9或標(biāo)志位CF=l
則:AL←AL-60H,CF置110/18/202242§3-38086的指令系統(tǒng)
——算術(shù)運算指令
例
設(shè)AL=BCD56,CL=BCD98,求兩數(shù)之差。解:運算過程如下:SUBAL,CL;01010110…BCD56;-10011000…BCD98DAS;10111110…低4位>9,CF=AF=1;-00000110…減6調(diào)整;10111000…調(diào)整后高半字節(jié)>9
;+01100000…減60H調(diào)整;01011000…BCD58,CF=1
;結(jié)果為AL=BCD58,CF=1,表示右借位10/18/202243§3-38086的指令系統(tǒng)
——算術(shù)運算指令
3.乘法指令(Multiply)⑴MUL無符號數(shù)乘法指令(Multiply)
指令格式:MUL源指令功能:把源操作數(shù)和累加器中的數(shù)都當(dāng)成無符號數(shù),然后將兩個數(shù)相乘,操作數(shù)可以是字節(jié)或字。
▲源操作數(shù)是一個字節(jié):原操作數(shù)與累加器AL中的內(nèi)容相乘,乘積為雙倍長的16位數(shù),高8位送到AH,低8位送AL。即
AX←AL*源。
▲源操作數(shù)是一個字:原操作數(shù)與累加器AX的內(nèi)容相乘,結(jié)果為32位數(shù),高位字放在DX寄存器中,低位字放在AX寄存器中。即
(DX,AX)←AX*源操作數(shù)要求:可以是寄存器、存儲單元,但不能是立即數(shù);源操作數(shù)是存儲單元時,必須在操作數(shù)前加B或W說明是字節(jié)還是字。
10/18/202244§3-38086的指令系統(tǒng)
——算術(shù)運算指令
例
MULDL ;AX←AL*DLMULCX;(DX,AX)←AX*CXMULB[SI] ;AX←AL*(內(nèi)存中某字節(jié)),B說明字節(jié)乘法
MULW[BX];(DX,AX)←AX*(內(nèi)存中某字),W說明字乘法
注意:▲MUL指令執(zhí)行后影響CF和OF標(biāo)志。如果結(jié)果的高半部分(字節(jié)操作為AH、字操作為DX)不為零,表明其內(nèi)容是結(jié)果的有效位,則CF和OF均置1。否則,CF和OF均清0。
據(jù)此可檢測并去除結(jié)果中的無效前導(dǎo)零?!朔ㄖ噶钍笰F、PF、SF和ZF的狀態(tài)不定。
例
設(shè)AL=55H,BL=14H,計算它們的積。
解:MULBL
結(jié)果:①AX=06A4H。
②由于AH=06H≠0,高位部分有效,所以置CF=1,OF=1。10/18/202245§3-38086的指令系統(tǒng)
——算術(shù)運算指令
例試計算FFH×FFH。解:用二進制表示成如下形式:
11111111×111111111111111000000001▲作為無符號數(shù):表示255×255=65025,結(jié)果正確。
▲作為帶符號數(shù):表示(一1)×(一1)=一511,顯然結(jié)果不正確。
▲用MUL指令作帶符號數(shù)的乘法,會得到錯誤的結(jié)果,必須用IMUL指令,才能使(一1)×(一1)得到正確的結(jié)果00000000
00000001。
10/18/202246§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑵IMUL整數(shù)乘法指令(IntegerMultiply)
指令格式:IMUL源指令功能:把源操作數(shù)和累加器中的數(shù)都作為帶符號數(shù),進行相乘。
▲存放結(jié)果的方式與MUL相同:源操作數(shù)為字節(jié):與AL相乘,雙倍長結(jié)果送到AX中;源操作數(shù)為字:與AX相乘,雙倍長結(jié)果送到DX和AX中,最后給乘積賦予正確的符號?!鴮?biāo)志位的影響:乘積的高半部分不是低半部分的符號擴展(不是全0或全1),則高位部分為有效位,表示它是積的一部分,于是置CF=OF=1;結(jié)果的高半部分為全0或全1,表明它僅包含了符號位,那么使CF=OF=0。AF、PF、SF和ZF不定。10/18/202247§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑶AAM乘法的ASCII調(diào)整指令(ASCIIAdjustforMultiply)
指令格式:AAM
指令功能:對AL中的兩個非壓縮十進制數(shù)相乘的乘積進行十進制數(shù)的調(diào)整,在AX中得到正確的非壓縮十進制數(shù)的乘積,高位在AH中,低位在AL中。調(diào)整過程:把AL寄存器內(nèi)容除以10,商放在AH中,余數(shù)在AL中。即:AH←AL/10所得的商AL←AH/10所得的余數(shù)
注意:▲兩個ASCII碼數(shù)相乘之前,先屏蔽掉每個數(shù)字的高半字節(jié),使每個字節(jié)包含一個非壓縮十進制數(shù)(BCD數(shù)),再用MUL指令相乘,乘積放到AL寄存器中,然后用AAM指令進行調(diào)整?!鴺?biāo)志位的影響:影響ZF、SF和PF,但AF、CF和OF無定義?!?086的指令系統(tǒng)中,十進制乘法運算不允許采用壓縮十進制數(shù),故調(diào)整指令僅此一條。
10/18/202248§3-38086的指令系統(tǒng)
——算術(shù)運算指令例求兩個非壓縮十進制數(shù)09和06之乘積。
解:MOVAL,09H ;置初值
MOVBL,06HMULBL ;AL09與06之乘積36HAAM ;調(diào)整得AH=05H(十位),AL=04H(個位)
結(jié)果:AX=0504H,即BCD數(shù)54。
例如果AL和BL中分別存放9和6的ASCII碼,求兩數(shù)之積。解:用以下指令實現(xiàn):
ANDAL,0FH ;屏蔽高半字節(jié)
ANDBL,0FHMULBL ;相乘
AAM ;調(diào)整如要將結(jié)果轉(zhuǎn)換成ASCII碼,可用指令ORAX,3030H實現(xiàn),使
AX=3534H。10/18/202249§3-38086的指令系統(tǒng)
——算術(shù)運算指令
4.除法指令(Division)⑴DIV無符號數(shù)除法指令(Division,unsigned)
指令格式:DIV源指令功能:對兩個無符號二進制數(shù)進行除法操作。
▲源操作數(shù)為字節(jié):16位被除數(shù)必須放在AX中,8位除數(shù)為源操作數(shù)。
AL←AX/源(字節(jié))的商
AH←AX/源(字節(jié))的余數(shù)
若被除數(shù)只有8位,必須把它放在AL中,并將AH清0?!床僮鲾?shù)為字:32位被除數(shù)在(DX,AX)中,16位除數(shù)作源操作數(shù)。
AX←(DX,AX)/源(字)的商
DX←(DX,AX)/源(字)的余數(shù)
若被除數(shù)、除數(shù)都是16位,則將16位被除數(shù)送到AX中,再將DX清0。
注意:▲源操作數(shù)可以是寄存器、存儲單元;▲DIV指令執(zhí)行后,所有標(biāo)志位均無定義。
10/18/202250§3-38086的指令系統(tǒng)
——算術(shù)運算指令⑵IDIV整數(shù)除法指令(IntegerDivision)
指令格式:IDIV源指令功能:對兩個帶符號二進制數(shù)進行除法操作(也稱為帶符號數(shù)除法)
注意:
▲操作與DIV相同;▲商和余數(shù)都是帶符號數(shù),且規(guī)定余數(shù)的符號和被除數(shù)的相同;▲指令執(zhí)行后,所有標(biāo)志位均無定義?!鵁o論對(DIV)還是(IDIV),都要注意溢出問題:字節(jié)操作時:被除數(shù)的高8位絕對值大于除數(shù)的絕對值,則產(chǎn)生溢出。(對于無符號數(shù),允許最大商為FFH;對于帶符號數(shù),允許商的范圍為-127~+127,或-81H~+7FH);字操作時:被除數(shù)的高16位絕對值大于除數(shù)的絕對值,則產(chǎn)生溢出。(對于無符號數(shù),允許最大商為FFFFH;對于帶符號數(shù),允許商的范圍為-32767~+32767,或-8001H~7FFFH)。10/18/202251§3-38086的指令系統(tǒng)
——算術(shù)運算指令▲帶符號數(shù)除法指令,字節(jié)操作時要求被除數(shù)為16位,字操作時要求被除數(shù)為32位,如果被除數(shù)不滿足這個條件,不能簡單地將高位置0,而應(yīng)該用符號擴展指令(SignExtension)將被除數(shù)轉(zhuǎn)換成除法指令所要求的格式。例兩個無符號數(shù)7A86H和04H相除,商應(yīng)為多少?解:MOVAX,7A86HMOVBL,04HDIVBL結(jié)果:①正確的商應(yīng)為1EA1H。
②由于BL中的除數(shù)04H為字節(jié),被除數(shù)為字,商1EA1H大于AL中能存放的最大無符號數(shù)FFH,產(chǎn)生除法錯誤中斷。10/18/202252§3-38086的指令系統(tǒng)
——算術(shù)運算指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 魚類購買合同范本
- 鋪面整幢出售合同范本
- SBI-0087702-生命科學(xué)試劑-MCE
- 2025河南新投數(shù)字能源技術(shù)有限公司招聘1人筆試參考題庫附帶答案詳解
- 相框銷售合同范本
- 知識產(chǎn)權(quán)管理企業(yè)核心競爭力之一
- 科技推動教育變革創(chuàng)新人才培養(yǎng)模式
- 私人裝飾合同范本
- 社交電商的稅收政策與合規(guī)性探討
- 社交媒體時代的管理溝通挑戰(zhàn)與機遇
- 砸墻合同協(xié)議書(2篇)
- 2024加油站操作員安全培訓(xùn)考試題及答案
- GB/T 5267.5-2024緊固件表面處理第5部分:熱擴散滲鋅層
- DB 37T5061-2016 住宅小區(qū)供配電設(shè)施建設(shè)標(biāo)準(zhǔn)
- 全國醫(yī)療服務(wù)項目技術(shù)規(guī)范
- GB 17353-2024摩托車和輕便摩托車防盜裝置
- 四環(huán)素類抗菌藥物兒科臨床應(yīng)用專家共識(2024年版)解讀
- 重點語法清單2024-2025學(xué)年人教版英語八年級上冊
- 金屬包裝容器生產(chǎn)數(shù)據(jù)分析考核試卷
- 寵物學(xué)概論課程設(shè)計
- 2024年全國統(tǒng)一高考數(shù)學(xué)試卷(理科)甲卷含答案
評論
0/150
提交評論