指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第1頁
指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第2頁
指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第3頁
指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第4頁
指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第2章 指令系統(tǒng)及匯編語言程序設(shè)計(jì)2.3 80868088指令系統(tǒng)80868088的指令大致可分成以下六種:數(shù)據(jù)傳送、算術(shù)運(yùn)算、位操作、串操作、程序控制和處理器控制指令。 2.3.1 數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是將數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲單元中。這類指令不影響狀態(tài)標(biāo)志位,只有FLAGS的指令(SAHF和POPF)例外。1.通用數(shù)據(jù)傳送指令 (1)數(shù)據(jù)傳送指令指令格式: MOV DST,SRC功 能: DST SRC操作說明: MOV指令將源操作數(shù)SRC的內(nèi)容傳送到目的操作數(shù)DST。指令執(zhí)行后目的操作數(shù)DST與源操作數(shù)SRC的內(nèi)容相等,即DST=SRC,源操作數(shù)本身不變。操作數(shù)的類型和

2、傳送方向如圖2.1 所示。從上圖可以看出,在MOV指令中:1) 源操作數(shù)可以為:存儲器、通用寄存器、段寄存器和立即數(shù)。2) 目的操作數(shù)可以為:存儲器、通用寄存器和段寄存器(CS除外)。3) 目的操作數(shù)和源操作數(shù)不能同時(shí)為存儲器、段寄存器;立即數(shù)不能送段寄存器,其余可以任意搭配。4) 立即送存儲器時(shí)難以確定長度,需要在存儲器操作數(shù)的前面加類型說明BYTE PTR或WORD PTR,例如: MOV BYTE PTRSI+10H,30 ;8位立即數(shù)30送偏移地址為SI+10H的字節(jié)單元。 MOV WORD PTRBX+DI, 2 ;16位立即數(shù)2送偏移地址為BX+DI的字單元。【例2.7】 數(shù)據(jù)傳送

3、指令舉例。立即數(shù)送寄存器MOV AL,10HMOV BX,2100H寄存器之間傳送MOV DX,CXMOV AH,DLMOV DS,AXMOV DX,ES通用寄存器與存儲器之間傳送 MOV AX,1000H MOV BP,DX段寄存器與存儲器之間傳送 MOV BXDI,ES MOV DS,10BP+DI 【例2.8】 指出下列數(shù)據(jù)傳送指令中的錯(cuò)誤。 MOV 10H,AX ;立即數(shù)不能作為目的操作數(shù) MOV DS,2000H ;立即數(shù)不能送段寄存器 MOV CS,AX ;CS不能作為目的操作數(shù) MOV DS,ES ;目的操作數(shù)和源操作數(shù)不能同時(shí)為段寄存器 MOV DI,SI ;目的操作數(shù)和源操作

4、數(shù)不能同時(shí)為存儲器 MOV AL,BX ;類型不匹配,AL為8位、BX為16位寄存器 MOV DL,300 ;類型不匹配,DL為8位寄存器,300超過1B (2)堆棧操作指令 堆棧是內(nèi)存中的一個(gè)特定的區(qū)域,其操作原則是“后進(jìn)先出(Last In,F(xiàn)irst Out)”。由段寄存器SS確定堆棧段的起始地址,由堆棧初始化時(shí)寄存器SP的值設(shè)定堆棧底的地址。堆棧的形態(tài)如圖2.2所示。堆棧操作有入棧和出棧兩種。1)入棧指令 指令格式: PUSH SRC 功 能: SPSP-2,SP+1SPSRC 操作說明: PUSH指令先將SP的內(nèi)容減2,然后再將操作數(shù)SRC的內(nèi)容送入由SP指出的棧頂即偏移地址為SP和

5、SP+1的兩個(gè)連續(xù)字節(jié)中。指令中的操作數(shù)SRC可以是存儲器、通用寄存器和段寄存器,但不能是立即數(shù)。 【例2.9】 PUSH AX ;通用寄存器內(nèi)容入棧 PUSH CS ;段寄存器內(nèi)容入棧 PUSH SI ;字存儲單元內(nèi)容入棧2)出棧指令 指令格式: POP DST 功 能: DST SP+1SP,SP SP+2 操作說明: POP指令先將堆棧指針SP所指示的棧頂存儲單元的值彈出到操作數(shù)DST中,然后再將SP的內(nèi)容加2。指令中的操作數(shù)DST可以是存儲器、通用寄存器或段寄存器(但不能是CS),同樣,不能是立即數(shù)。【例2.10】 POP AX ;棧頂內(nèi)容彈出至通用寄存器 POP ES ;棧頂內(nèi)容彈出

6、段寄存器 POP MEMDI ;棧頂內(nèi)容彈出至字存儲單元入棧和出棧操作如圖2.3所示。使用堆棧時(shí)還應(yīng)注意:1)堆棧操作指令中的操作數(shù)必須是16位的字操作數(shù)。2)由SP指示現(xiàn)行堆棧頂?shù)奈恢?。堆棧頂是浮?dòng)的。3)編程中PUSH、POP指令應(yīng)成對使用,以保持棧的平衡。 (3)數(shù)據(jù)交換指令 指令格式: XCHG OPR1,OPR2 功 能: OPR1 OPR2 操作說明: XCHG指令將兩個(gè)操作數(shù)內(nèi)容進(jìn)行交換。交換的內(nèi)容可以是一個(gè)字節(jié)(8位),也可以是一個(gè)字(16位),兩個(gè)操作數(shù)的長度必須一致。參加交換的兩個(gè)操作數(shù)各自均可以是寄存器或存儲器,但不能二者同時(shí)為存儲器。即可以在寄存器與寄存器之間,或寄存器

7、與存儲器之間進(jìn)行交換。段寄存器不能參加交換。 【例2.11】 XCHG AL,CL ;8位寄存器間內(nèi)容交換 XCHG AX,DX ;16位寄存器間內(nèi)容交換 XCHG BX,DATASI ;寄存器與存儲單元間內(nèi)容交換 (4)字節(jié)轉(zhuǎn)換指令 指令格式: XLAT SRC-table 功 能: AL BX+AL 操作說明: XLAT指令完成一字節(jié)的查表轉(zhuǎn)換。具體操作為:將BX和AL的內(nèi)容相加后作為偏移地址,取出該存儲單元的內(nèi)容送AL。使用這條指令之前應(yīng)預(yù)先把表頭地址存入BX寄存器,AL中存放表元素的序號。表中元素的序號依次是0,1,2,3,表的最大長度為256個(gè)字節(jié)。利用XLAT指令實(shí)現(xiàn)不同數(shù)制或編碼

8、系統(tǒng)之間的轉(zhuǎn)換,十分方便。 【例2.12】 內(nèi)存數(shù)據(jù)段中存放有一張16進(jìn)制數(shù)(0-9,A-F)的ASCII碼表,其首地址為HTABLE,為了將運(yùn)算結(jié)果轉(zhuǎn)換成ASC碼輸出,可用下列程序?qū)崿F(xiàn)一位十六進(jìn)制數(shù)(4位二進(jìn)制數(shù))向ASCII碼的轉(zhuǎn)換: MOV BX,OFFSET HTABLE ;BX 表首址 MOV AL,N ; AL 欲轉(zhuǎn)換的數(shù)N(00000000B00001111B) XLAT HTABLE ;查表轉(zhuǎn)換,轉(zhuǎn)換結(jié)果的ASCII碼在AL中 HLT 上面XLAT指令中,操作數(shù)HTABLE可以省略不寫。 設(shè)N=00001011B,上面程序執(zhí)行后,AL=01000010B(字母B的ASCII代碼

9、)。2.輸入輸出指令 輸入輸出指令完成外設(shè)與CPU之間的數(shù)據(jù)傳送。輸入指令I(lǐng)N用于從外設(shè)端口接收數(shù)據(jù),輸出指令OUT則向端口發(fā)送數(shù)據(jù)。輸入輸出指令對IO端口的尋址方式可以分為兩大類: ·直接尋址 端口地址直接在指令中給出,可尋址256個(gè)端口(0255); ·DX寄存器間接尋址 將DX的內(nèi)容作為端口地址,可尋址64K個(gè)端口(065535)。 輸入輸出指令可進(jìn)行8位數(shù)據(jù)傳送,所傳送數(shù)據(jù)在AL中,也可進(jìn)行16位數(shù)據(jù)傳送,所傳送數(shù)據(jù)在AX中,不能使用其他的寄存器。 (1)輸入指令 指令格式: IN ACC,PORT 功 能: ALAXPORT 操作說明: 從指定端口PORT將8位或

10、16位數(shù)據(jù)送入AL或AX中,端口PORT的尋址可用上述的直接尋址或DX間接尋址兩種方式。 【例2.13】IN AL,10H ;將10H端口的內(nèi)容送AL,1OH是8位端口 IN AX,20H ;將20H端口的內(nèi)容送AX,20H是16位端口 IN AL,DX ;以DX的內(nèi)容作為8位端口地址,端口內(nèi)容送AL IN AX,DX ;以DX的內(nèi)容作為16位端口地址,端口內(nèi)容送AX (2)輸出指令 指令格式: OUT PORT,ACC 功 能: PORTALAX 操作說明: 將累加器AL(8位)或AX(16位)的內(nèi)容輸出到指令指定的I/O端口中,端口PORT的尋址可用上述的直接尋址或DX間接尋址兩種方式。

11、【例2.14】 OUT 40H,AL ;將AL內(nèi)容送到地址為40H的8位端口中 OUT 20H,AX ;將AX內(nèi)容送到地址為40H的16位端口中 OUT DX,AL ;將AL內(nèi)容送到地址由DX所指定的8位端口中 OUT DX,AX ;將AX內(nèi)容送到地址由DX所指定的16位端口中注意:使用DX寄存器間接尋址時(shí),在執(zhí)行輸入輸出指令前要將端口地址送入DX。3.地址傳送指令 80868088CPU提供了三條把地址寫入寄存器的指令: (1)有效地址送寄存器指令指令格式: LEA REG,SRC功 能: REGSRC的有效地址 操作說明: 將源操作數(shù)SRC(必須是一個(gè)存儲器類型操作數(shù))的有效地址即16位偏

12、移地址裝入到16位目標(biāo)寄存器REG中。 【例2.15】設(shè)DS=3000H,BX=2000H,SI=1000H,34000H=56H,34001H=12H,執(zhí)行指令LEA AX,BX+SI+1000H執(zhí)行的結(jié)果是:AX=BX+SI+1000H=4000H。而MOV AX,BX+SI+1000H指令是將偏移地址為BX+SI+1000H的內(nèi)存單元的內(nèi)容送到AX中,結(jié)果是AX=1256H。 LEA指令的功能也可用MOV指令來實(shí)現(xiàn),下面兩條指令是等效的: LEA BX,BUFFER MOV BX,OFFSET BUFFER指令中的OFFSET稱為取偏移地址操作符。上述兩條指令均可完成將變量(或標(biāo)號)BU

13、FFER的偏移地址送BX寄存器的功能。 (2)地址指針裝入DS指令指令格式: LDS REG,SRC功 能: REGSRC單元中的有效地址;DSSRC單元中的段地址 操作說明: 傳送一個(gè)32位的遠(yuǎn)地址指針,其中包括一個(gè)偏移地址和一個(gè)段基址。該地址指針存放在由源操作數(shù)SRC指定的四個(gè)連續(xù)存儲單元中。LDS指令將其中前兩個(gè)單元的內(nèi)容傳送到指定寄存器,后兩個(gè)單元內(nèi)容傳送到數(shù)據(jù)段寄存器DS。 【例2.16】 LDS SI,0100H 設(shè)原來DS=3000H,而有關(guān)存儲單元的內(nèi)容為30100H=60H,30101H=05H,30102H=18H,30103H=20H,上述指令執(zhí)行后,SI=0560H,D

14、S=2018H。 (3)地址指針裝入ES指令指令格式: LES REG,SRC功 能: REGSRC單元中的有效地址;ESSRC單元中的段地址 操作說明: 與LDS類似,傳送一個(gè)32位的遠(yuǎn)地址指針,其中偏移地址送指定寄存器,但是段基址送附加段寄存器ES。4.標(biāo)志寄存器傳送指令標(biāo)志傳送指令共有四條。 (1)標(biāo)志傳送指令 指令格式及功能:LAHF ;AHFLAGS的低8位 SAHF ;FLAGS的低8位AH操作說明:LAHF和SAHF指令隱含的操作數(shù)為AH寄存器和標(biāo)志寄存器FLAGS的低字節(jié)。涉及標(biāo)志寄存器FLAGS中的5個(gè)狀態(tài)標(biāo)志位為SF、ZF、AF、PF以及CF,如下圖所示。158765432

15、10 SFZF AF PF CF(2)標(biāo)志入、出棧指令指令格式及功能: PUSHF ;SP SP-2,SP+1SP FLAGS POPF ;FLAGSSP+ISP,SPSP+2操作說明:PUSHF和POPF指令使標(biāo)志寄存器與堆棧之間進(jìn)行數(shù)據(jù)交換。常用于在調(diào)用子程序之前把標(biāo)志寄存器壓入堆棧,保護(hù)調(diào)用以前標(biāo)志寄存器的值,從子程序返回以后再彈出,恢復(fù)這些標(biāo)志狀態(tài)。這兩條指令也可以用來修改標(biāo)志寄存器中標(biāo)志位的值。2.3.2 算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令包括加、減、乘、除指令。算術(shù)運(yùn)算指令除符號擴(kuò)展指令(CBW,CWD)外,其余指令都影響標(biāo)志位。1. 加法指令(1)加

16、法指令指令格式: ADD DST,SRC功 能: DSTDST+SRC操作說明: ADD指令將目的操作數(shù)與源操作數(shù)相加,并將結(jié)果存回目的操作數(shù)。加法算術(shù)指令影響標(biāo)志寄存器6個(gè)狀態(tài)標(biāo)志:SF、ZF、AF、PF、CF和OF?!纠?.17 】 已知AL=49H,DL=6AH,執(zhí)行ADD AL,DL后,AL=0B3H。 各標(biāo)志位為:SF=1,ZF=0,AF=1,PF=0,CF=0,OF=1上例中,如果AL、DL中的內(nèi)容是無符號數(shù),由于CF=0,所得結(jié)果正確。如果AL、DL中的內(nèi)容是補(bǔ)碼表示的帶符號數(shù),由于OF=1,所得結(jié)果B3H是錯(cuò)誤的(兩個(gè)正數(shù)49H和6AH相加,結(jié)果是補(bǔ)碼B3H表示的一個(gè)負(fù)數(shù))。指

17、令中目的操作數(shù)類型 可以是寄存器或存儲器,源操作數(shù)可以是寄存器、存儲器或立即數(shù)。但是源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲器。另外,不能對段寄存器進(jìn)行加法運(yùn)算(段寄存器也不能參加減法、乘法和除法運(yùn)算)。其加減法運(yùn)算的操作數(shù)類型要求如下圖2.4所示?!纠?.18】ADD AL,20 ;累加器內(nèi)容與立即數(shù)相加 ADD DX,SI ;寄存器內(nèi)容相加 ADD AX,BX ;寄存器與存儲器內(nèi)容相加 ADD DATADI,AL ;存儲器內(nèi)容與寄存器相加 ADD BYTEPTRBPSI,50H ;存儲器內(nèi)容與立即數(shù)相加(2)帶進(jìn)位加法指令指令格式: ADC DST,SRC 功 能: DSTDST+SRC+CF

18、操作說明: ADC指令與ADD指令有些相似,但是它將目的操作數(shù)與源操作數(shù)相加時(shí),同時(shí)還要加上進(jìn)位標(biāo)志CF的內(nèi)容,然后將結(jié)果送回目的操作數(shù)。ADC指令也將根據(jù)運(yùn)算結(jié)果修改狀態(tài)標(biāo)志位。 用 途:帶進(jìn)位加法指令主要用于數(shù)據(jù)位數(shù)較長、需要分段運(yùn)算的加法運(yùn)算。如果數(shù)據(jù)的低位相加時(shí)產(chǎn)生進(jìn)位,在下一次高位相加時(shí)必須將這個(gè)進(jìn)位加進(jìn)去,否則結(jié)果是錯(cuò)誤的。 【例2.19】 編寫計(jì)算兩個(gè)四字節(jié)長整數(shù)之和的程序,已知數(shù)NA=7A546C08H,NB=12F0497DH,求:NA+NB。運(yùn)算程序如下: MOV BX,6C08H ;取加數(shù)的低字 ADD BX,497DH ;和另一個(gè)加數(shù)的相應(yīng)字相加 MOV AX,7A54

19、H ;取加數(shù)的高字 ADC AX,12FOH ;和另一個(gè)加數(shù)的相應(yīng)字相加 上述程序段的運(yùn)行結(jié)果:AX中為和的高字,BX中為和的低字。 (3)加1指令 指令格式: INC DST 功 能: DSTDST+1 操作說明: INC指令將目的操作數(shù)內(nèi)容加1后送回目的操作數(shù)。該指令將影響狀態(tài)標(biāo)志位,如SF、ZF、AF、PF和OF,但對進(jìn)位標(biāo)志CF沒有影響。 INC指令中目的操作數(shù)可以是寄存器或存儲器,但不能是段寄存器和立即數(shù)。INC指令常常用于循環(huán)程序中修改地址或者進(jìn)行加法計(jì)數(shù)。 【例2.20】INC SI ;將SI寄存器內(nèi)容加1 INC BYTE PTRBX ;將存儲器字節(jié)單元BX內(nèi)容加1 INC W

20、ORD PTRSI :將存儲器字單元SI內(nèi)容加1指令中的BYTE PTR或WORD PTR分別指定隨后的存儲器操作數(shù)的類型。2. 減法指令 減法指令包括不帶借位減法指令、帶借位減法指令減1指令、求補(bǔ)指令和比較指令。 (1)減法指令 指令格式: SUB DST,SRC 功 能: DST DST-SRC 操作說明: SUB指令用目的操作數(shù)減去源操作數(shù),結(jié)果送回目的操作數(shù)。SUB指令對狀態(tài)標(biāo)志位均有影響。對操作數(shù)類型的要求與加法指令相同?!纠?.21】SUB AL,52H SUB DX,BX SUB DI,AX SUB WORD PTRBX,30H(2)帶借位減法指令 指令格式:SBB DST,SR

21、C 功 能:DST DST-SRC-CF 操作說明:SBB指令將目的操作數(shù)減去源操作數(shù),同時(shí)減去進(jìn)位標(biāo)志CF,并將結(jié)果送回目的操作數(shù)。該指令主要用于多字節(jié)數(shù)的分段減法。SBB指令對標(biāo)志位的影響與SUB指令相同。SBB指令中目的操作數(shù)與源操作數(shù)的類型也與SUB指令相同。【例2.22】 SBB BX,2000H SBB AX,DX SBB BP,AX【例2.23】 試編寫一程序段,將數(shù)據(jù)段中偏移地址為1000H與1001H的存儲單元內(nèi)容之差存放在1002H單元中。程序如下:MOV BX,1000H ;偏移地址1000H送BX,以便用BX間接尋址MOV AL,BXINC BX SUB AL,BXIN

22、C BXMOV BX,ALHLT(3)減1指令指令格式: DEC DST功 能: DSTDST-1操作說明: DEC指令使目的操作數(shù)內(nèi)容減1后送回目的操作數(shù)中。指令對狀態(tài)標(biāo)志位SF、ZF、AF、PF和OF有影響,但不影響進(jìn)位標(biāo)志CF。 指令中的操作數(shù)與INC一樣,可以是寄存器(不可以是段寄存器)或存儲器,在循環(huán)程序中常常利用DEC指令來修改循環(huán)次數(shù)寄存器或地址。 【例2.24】 DEC CX ;寄存器內(nèi)容減1 DEC BYTE PTRDI ;存儲單元內(nèi)容減1注意:與INC指令類似,若DEC指令的目標(biāo)操作數(shù)為存儲器時(shí),必須用BYTE PTR或WORD PTR等說明其類型 (4)求補(bǔ)指令指令格式:

23、 NEG DST功 能: DST 0 - DST 操作說明: NEG指令使操作數(shù)求補(bǔ),即用“0”減去目的操作數(shù)(或包括符號一起全部求反加1),結(jié)果送回目的操作數(shù)。求補(bǔ)指令對狀態(tài)標(biāo)志位有影響。其操作數(shù)可以是寄存器或存儲器。 【例2.25】 NEG AX NEG WORD PTRDI+20利用NEG指令可以由一個(gè)數(shù)的補(bǔ)碼得到它相反數(shù)的補(bǔ)碼,如果這個(gè)數(shù)是負(fù)數(shù),那么,就得到它的絕對值。例如:假設(shè)AL=1,執(zhí)行指令NEG AL后,AL=0FFH,為-1的補(bǔ)碼;假設(shè)AL=0FFH(0FFH是-1的補(bǔ)碼),執(zhí)行指令NEG AL后,AL=1,為-1的絕對值。(5)比較指令指令格式: CMP DST,SRC功

24、能: DST-SRC 操作說明: CMP指令將目的操作數(shù)減去源操作數(shù),但結(jié)果不送回目的操作數(shù)。即只做減法運(yùn)算,不保留差的值,運(yùn)算結(jié)果的性質(zhì)反映在狀態(tài)標(biāo)志位上。這是比較指令CMP與減法指令SUB的區(qū)別所在。CMP指令常常與條件轉(zhuǎn)移指令結(jié)合起來使用,完成各種條件判斷和相應(yīng)的程序轉(zhuǎn)移。 CMP指令中目的操作數(shù)和源操作數(shù)的類型與SUB指令相同??梢赃M(jìn)行字節(jié)比較,也可以進(jìn)行字比較。 【例2.26】CMP AL,0AH CMP AX,AREAl CMP BX+5,SI比較指令的執(zhí)行結(jié)果將影響狀態(tài)標(biāo)志位。根據(jù)標(biāo)志寄存器內(nèi)容可判斷兩數(shù)大小。例如:執(zhí)行CMP DST,SRC后: 若ZF=1,則DST=SRC 兩

25、個(gè)無符號數(shù)比較:若CF=1,則DST < SRCCF=0,則DSTSRC 兩個(gè)帶符號數(shù)比較:若OF與SF同號,則DSTSRCOF與SF異號,則DST < SRC【例2.27】判斷寄存器AX與BX的內(nèi)容是否相等,若相等,使DX=1,否則,使DX=0。解:程序如下CMP AX,BXJZ EQUALMOV DX,0JMP NEXTEQUAL: MOV DX,1NEXT: HLT 【例2.28】在DATA開始的內(nèi)存單元存有100個(gè)無符號字節(jié)數(shù),找出其中最大數(shù)送MAX單元中。程序如下:MOV SI,OFFSET DATAMOV AL,SIINC SIMOV CL,99AGAIN: CMP A

26、L,SI JNC NEXT ;無借位轉(zhuǎn)移到NEXT MOV AL,SINEXT: INC SI DEC CL JNZ AGAIN ;CL不等于0轉(zhuǎn)移到AGAIN MOV MAX,AL HLT3. 乘法指令 乘法指令有兩條,分別用于無符號數(shù)和帶符號數(shù)的乘法。指令格式:MUL SRC ;無符號數(shù)乘法 IMUL SRC ;帶符號數(shù)乘法功 能:SRC為字節(jié)操作數(shù)時(shí),做字節(jié)乘法:AXAL*SRCSRC為字操作數(shù)時(shí),做字乘法: (DX,AX)AX*SRC操作說明:乘法指令中只列出源操作數(shù),目的操作數(shù)是隱含的。源操作數(shù)可以是寄存器或存儲器,但不能是立即數(shù)。兩條指令都可以實(shí)現(xiàn)字節(jié)或字的乘法運(yùn)算。如果兩個(gè)8位數(shù)

27、據(jù)相乘,其16位乘積存放在AX中。如果兩個(gè)16位數(shù)據(jù)相乘,其32位乘積存放在DX和AX中,其中高16位存于DX中,低16位存于AX中。乘法操作指令示意如圖2.5所示。 注意:兩條指令的功能是一樣的,但是對同樣的機(jī)器數(shù)其運(yùn)算結(jié)果是不同的。例如:計(jì)算(11111111B)*(11111111B)時(shí),若將11111111B看成是無符號數(shù)時(shí)使用MUL指令時(shí),則表示為255*255=65025,而看成帶符號數(shù)時(shí)使用IMUL指令時(shí),則表示為(-1)*(-1)=1。 乘法指令影響CF和OF兩個(gè)標(biāo)志位,且它們的狀態(tài)相同。 對MUL指令,如果乘積的高半部分(在AH或DX中)不為零,則狀態(tài)標(biāo)志位CF=OF=1,否

28、則CF=OF=0。因此,狀態(tài)標(biāo)志位CF=OF=1表示AH或DX中包含著乘積的有效數(shù)字。 IMUL指令將兩個(gè)操作數(shù)均按帶符號數(shù)處理。如果乘積的高半部分僅僅是低半部分符號位的擴(kuò)展(沒有有效數(shù)字),則狀態(tài)標(biāo)志位CF=OF=0;反之,高半部分包含乘積的有效數(shù)字而不只是符號的擴(kuò)展部分,則CF=OF=1。4.除法指令指令格式: DIV SRC ;無符號數(shù)除法 IDIV SRC ;帶符號數(shù)除法功 能:SRC為字節(jié)操作數(shù)時(shí),做字節(jié)除法:ALAXSRC的商 AHAXSRC的余數(shù)SRC為字操作數(shù)時(shí),做字除法:AX(DX,AX)SRC的商 DX(DX,AX)SRC的余數(shù) 操作說明: 80868088執(zhí)行除法時(shí)規(guī)定:

29、除數(shù)只能是被除數(shù)的一半字長。當(dāng)被除數(shù)為16位時(shí),除數(shù)應(yīng)為8位;被除數(shù)為32位時(shí),除數(shù)應(yīng)為16位。并規(guī)定:被除數(shù)為16位時(shí),應(yīng)存放在AX中。除數(shù)為8位,可存放在寄存器或存儲器中(不能為立即數(shù))。得到的8位商放在AL中,8位余數(shù)放在AH中;被除數(shù)為32位時(shí),應(yīng)存放在DX(高位)和AX(低位)中,除數(shù)為16位,可存放在寄存器或存儲器中(不能為立即數(shù))。得到的16位商放在AX中,16位余數(shù)放在DX中。 除法指令操作如圖2.6所示。 使用除法指令,出現(xiàn)以下三種情形之一時(shí),CPU立即產(chǎn)生一個(gè)類型號為0的內(nèi)部中斷(有關(guān)中斷的概念將在本書的第5章敘述)。 除數(shù)為零。 字節(jié)除法時(shí),被除數(shù)高8位的絕對值大于除數(shù)的

30、絕對值(此時(shí)的商超過了8位)。 字除法時(shí),被除數(shù)高16位的絕對值大于除數(shù)的絕對值(此時(shí)的商超過了16位)。 前一種屬于操作數(shù)異常(除數(shù)為零),后兩種屬于運(yùn)算結(jié)果溢出。此外,如果被除數(shù)和除數(shù)字長相等,則在用IDIV指令進(jìn)行帶符號數(shù)除法之前,必須先用符號擴(kuò)展指令CBW或CWD將AL或AX中的被除數(shù)的符號位擴(kuò)展,使之成為16位數(shù)或32位數(shù)。對于無符號數(shù)來說,應(yīng)該用8位或16位零把被除數(shù)擴(kuò)展成16位數(shù)或32位數(shù)。5.符號擴(kuò)展指令 (1)字節(jié)擴(kuò)展指令 指令格式: CBW 功 能: 如果AL<80H,則AH00H,否則AH0FFH。 (2)字?jǐn)U展指令 指令格式: CWD 功 能: 如果AX<8

31、000H,則DX0000H,否則DX0FFFFH。 注 意: 上述兩條指令僅限于在AL或AX中進(jìn)行。 【例2.29】 若AL=100,BL=15,試編寫程序段,求出AL除以BL的商和余數(shù)分別存放在DL和DH中。 解:程序如下:CBW ;字節(jié)轉(zhuǎn)換DIV BL ;除法MOV DL,AL ;存商MOV DH,AH ;存余數(shù)HLT6. 十進(jìn)制數(shù)(BCD碼)運(yùn)算調(diào)整指令以上介紹的是二進(jìn)制數(shù)的算術(shù)運(yùn)算。有的場合需要使用十進(jìn)制數(shù),計(jì)算機(jī)中十進(jìn)制數(shù)用BCD碼來表示。BCD碼有兩類:一類叫壓縮型BCD碼(1個(gè)字節(jié)存放2位BCD碼),一類叫非壓縮型BCD碼(1個(gè)字節(jié)中只存放1位BCD碼)。在用BCD碼進(jìn)行十進(jìn)制數(shù)

32、加、減、乘運(yùn)算時(shí),應(yīng)分兩步進(jìn)行: 先按二進(jìn)制數(shù)運(yùn)算規(guī)則進(jìn)行運(yùn)算,得到中間結(jié)果。 用十進(jìn)制調(diào)整指令對中間結(jié)果進(jìn)行修正,得到運(yùn)算結(jié)果的BCD碼。 注 意:BCD碼的運(yùn)算只能在8位累加器AL中進(jìn)行。十進(jìn)制數(shù)的乘、除運(yùn)算只能用非壓縮的BCD格式。除法運(yùn)算時(shí),應(yīng)先調(diào)整,后運(yùn)算。 (1)壓縮型BCD碼調(diào)整指令 指令格式: DAA ;加法調(diào)整 DAS ;減法調(diào)整操作說明: 將加法(ADD或ADC)或減法(SUB或SBC)運(yùn)算的結(jié)果(在AL寄存器中)調(diào)整為壓縮BCD碼。注意,參與運(yùn)算的應(yīng)是壓縮BCD碼?!纠?.30】 48+29=77運(yùn)算結(jié)果得不到77的壓縮BCD碼,是因?yàn)樵谶M(jìn)行二進(jìn)制加法運(yùn)算時(shí),低四位向高四

33、位有個(gè)進(jìn)位,這個(gè)進(jìn)位是按十六進(jìn)制進(jìn)行的,即低4位逢16才向高四位進(jìn)1,而十進(jìn)制數(shù)應(yīng)是逢十進(jìn)一。因此,比正確結(jié)果少6,這時(shí),調(diào)整指令應(yīng)在相加結(jié)果的低4位上加6。即:上述運(yùn)算過程用指令實(shí)現(xiàn)如下: MOV AL,48H ADD AL,29H DAA(2)非壓縮型BCD碼調(diào)整指令1) 加減法調(diào)整指令格式: AAA ;加法調(diào)整 AAS ;減法調(diào)整操作說明: 將加法(ADD或ADC)或減法(SUB或SBC)運(yùn)算的結(jié)果(在AL寄存器中)調(diào)整為非壓縮BCD碼。調(diào)整后的AL寄存器中高4位被清0,如有進(jìn)位或借位,則在AH中。 2)乘法調(diào)整 指令格式: AAM 操作說明: 把AL中的數(shù)值調(diào)整為非壓縮BCD碼,并存入

34、AX中。 在用此指令進(jìn)行調(diào)整之前應(yīng)先執(zhí)行無符號數(shù)的乘法指令,相乘的兩個(gè)數(shù)必須是非壓縮BCD碼,即BCD碼在低4位中,相乘的結(jié)果在AL中(兩個(gè)乘數(shù)均小于10,它們的乘積小于100)。執(zhí)行調(diào)整指令A(yù)AM時(shí),將AL內(nèi)容除以10,將商放在AH中作為結(jié)果的十位數(shù)(BCD碼),余數(shù)放在AL中,作為結(jié)果的個(gè)位數(shù)(BCD碼)。 3)除法調(diào)整 指令格式: AAD 功 能: ALAH*l0+AL,AH0 操作說明: AAD指令是一個(gè)隱含了寄存器操作數(shù)AL和AH的指令。其具體操作為:將AH寄存器的內(nèi)容乘以10并加上AL寄存器的內(nèi)容,結(jié)果送回AL,同時(shí)將AH清0。其操作實(shí)質(zhì)是將AX寄存器中的非壓縮BCD碼轉(zhuǎn)換成二進(jìn)制

35、數(shù),存放在AL中。 注 意:該指令與其他調(diào)整指令在使用方法上是不同的。加、減、乘法調(diào)整在運(yùn)算后進(jìn)行再進(jìn)行指令調(diào)整,而除法調(diào)整應(yīng)在除法運(yùn)算之前先使用指令調(diào)整。除法所得的商還需用AAM指令進(jìn)行調(diào)整方可得到正確的非壓縮BCD碼的結(jié)果。 【例2.31】 用非壓縮BCD碼做58/4=142這一運(yùn)算時(shí),可用下列指令實(shí)現(xiàn)MOV AX,0508H ;AX58的非壓縮BCD碼AAD ;非壓縮BCD碼除法調(diào)整,AX=003AH=58MOV BL,04H ;BL除數(shù)4DIV BL ;AH=2(余數(shù)),AL=0EH(商的二進(jìn)制碼)MOV BL,AH ;余數(shù)存入BL中AAM ;AX=0104H(商的非壓縮BCD碼)HL

36、T2.3.3位操作指令這類指令包括邏輯運(yùn)算指令、移位指令和循環(huán)指令。1邏輯運(yùn)算指令80868088指令系統(tǒng)的邏輯運(yùn)算指令有“與”(AND)、“測試”(TEST)、“或”(OR)、“異或”(XOR)和“非”(NOT)五條。除了“非”指令對狀態(tài)標(biāo)志位不產(chǎn)生影響外,其余四條指令對狀態(tài)標(biāo)志位均有影響。這些指令將根據(jù)各自邏輯運(yùn)算的結(jié)果影響SF、ZF和PF狀態(tài)標(biāo)志位,同時(shí)將CF和OF置“0”,但AF的值不確定。 (1)邏輯“與”指令 指令格式: AND DST,SRC 功 能: DSTDSTSRC操作說明: AND指令將目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯“與”運(yùn)算(即相“與”的兩位均為1時(shí)結(jié)果為1,否則為0

37、),將結(jié)果送回目的操作數(shù)。指令中目的操作數(shù)可以是寄存器或存儲器,源操作數(shù)可以是立即數(shù)、寄存器或存儲器。但是指令的兩個(gè)操作數(shù)不能同時(shí)是存儲器。作 用: AND指令可以有選擇地屏蔽某些位(有選擇地清0),而保留另一些位不變?!纠?.32】 AND AL,3CH ;8位二進(jìn)制分別進(jìn)行與運(yùn)算AND AX,BX ;16位二進(jìn)制分別進(jìn)行與運(yùn)算AND DX,BUFFERSIAND DI,CX【例2.33】 MOV AL,1011010lB ;AL=1OllOl01BAND AL,0FH ;AL=00000101B,保留低四位,高四位清0 (2)測試指令 指令格式: TEST DST,SRC 功 能: DST

38、 SRC 操作說明: TEST指令將目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯“與”運(yùn)算,但邏輯運(yùn)算的結(jié)果不送回目的操作數(shù),即僅做DSTSRC運(yùn)算,兩個(gè)操作數(shù)的內(nèi)容均保持不變,但運(yùn)算結(jié)果影響狀態(tài)標(biāo)志位。 作 用:TEST指令常常用于位測試,它與條件轉(zhuǎn)移指令一起,共同完成對特定位狀態(tài)的判斷,并實(shí)現(xiàn)相應(yīng)的程序轉(zhuǎn)移。 【例2.34】 測試AL的最高位是否為零,若不為零,則轉(zhuǎn)移到NEXT。TEST AL,10000000BJNZ NEXT NEXT: (3)邏輯“或”指令 指令格式: OR DST,SRC 功 能: DSTDSTSRC 操作說明: 將目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯“或”運(yùn)算(即相“或”的兩位中

39、任一位為1時(shí)結(jié)果為1,只有兩位都為0時(shí)結(jié)果才為0),并將結(jié)果送回目的操作數(shù)。 作 用: OR指令操作數(shù)的類型與AND指令相同。OR指令可將寄存器或存儲器中的某些特定的位設(shè)置成“1”,同時(shí)使其余位保持原來的狀態(tài)不變。 【例2.35】 若將AL寄存器的最高位置“1” ,而保持其余位不變時(shí),可用如下指令: OR AL,10000000B ;ALAL(10000000B) (4)邏輯“異或”指令 指令格式: XOR DST,SRC 功 能: DSTDSTSRC 操作說明: XOR指令將目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯“異或”運(yùn)算(即相“異或”的兩位數(shù)不相同時(shí)結(jié)果為“1”,相同時(shí)則為“0”),并將結(jié)果送

40、回目的操作數(shù)。XOR指令操作數(shù)的類型與AND、OR指令均相同。作 用: XOR指令可將寄存器或存儲器中的某些特定的位“求反”,而使其余位保持不變。XOR指令的另一個(gè)用途是將寄存器的內(nèi)容清0。XOR指令和AND、OR等指令一樣,也會將進(jìn)位標(biāo)志CF清0。 【例2.36】 使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不變,可將AL和10101010B(即OAAH)“異或”。 MOV AL,0FH ;AL=0FH XOR AL,10101010B ;AL=1O1OOl01B(0A5H)【例2.37】 XOR AX,AX ;將AX清0,同時(shí)將CF清0 (5)邏輯“非”運(yùn)算指令格式: N

41、OT DST功 能: DST 操作說明: NOT指令使目的操作數(shù)按位取反,即其中所有“0”的位變?yōu)椤?”,所有“1”的位變?yōu)椤?”。其操作數(shù)可以是8位或16位的寄存器或存儲器,但不能對立即數(shù)執(zhí)行邏輯“非”操作。 【例2.38】 NOT AHNOT WORD PTRBXDI2.移位指令80868088指令系統(tǒng)的移位指令可以向左或向右移位,移位次數(shù)由COUNT決定,COUNT為1時(shí)移動(dòng)一位,可直接寫于指令中。要求移多位時(shí),移動(dòng)位數(shù)必須事先放在CL寄存器中。移位指令影響除AF外的其他狀態(tài)標(biāo)志位。 (1)邏輯左移指令指令格式: SHL DST,COUNT 功 能:如圖2.7所示。 操作說明:SHL指令

42、將目的操作數(shù)順序向左移1位或移CL寄存器中指定的位數(shù)。左移1位時(shí),操作數(shù)的最高位MSB移入進(jìn)位標(biāo)志CF,最低位LSB補(bǔ)0,相當(dāng)于無符號數(shù)乘上2。 【例2.39】 MOV AH,8BHMOV CL,3SHL AH,CL ;SI內(nèi)容左移3位 (2)邏輯右移指令 指令格式: SHR DST,COUNT功 能: 如圖2.8所示。操作說明: SHR將目的操作數(shù)順序向右移1位或移CL寄存器中指定的位數(shù)。低位移入CF,高位補(bǔ)0。無符號數(shù)右移1位相當(dāng)于除以2?!纠?.40】 MOV BL,20H ;BL=20HSHR BL,1 ;BL=10H(3)算術(shù)左移指令指令格式:SAL DST,COUNT 功 能:如圖

43、2.9所示。操作說明:SAL指令將目的操作數(shù)順序向左移1位或移CL寄存器中指定的位數(shù)。操作與SHL完全相同?!纠?.41】SAL WORD PTRBX+50,1 (4)算術(shù)右移指令指令格式:SAR DST,COUNT功 能:如圖2.10 操作說明:SAR指令將目的操作數(shù)向右移1位或由CL寄存器指定的位數(shù)。右移一位時(shí),操作數(shù)的最低位LSB移入進(jìn)位標(biāo)志CF,最高位MSB保持不變。對帶符號數(shù)算術(shù)右移一位相當(dāng)于將該數(shù)除以2?!纠?.42】SAR AL,1SAR DI,CLSAR WORD PTRTABLESI,1SAR BYTE PTRBX,CL 4循環(huán)移位指令80868088指令系統(tǒng)有四條循環(huán)移位指

44、令,包括不帶進(jìn)位和帶進(jìn)位循環(huán)移位。指令中指定的左移或右移的位數(shù)COUNT可以是1或由CL寄存器指定。所有循環(huán)移位指令都只影響進(jìn)位標(biāo)志CF和溢出標(biāo)志OF。 (1)循環(huán)左移指令 指令格式: ROL DST,COUNT功 能: 如圖2.11所示。 操作說明: ROL指令將目的操作數(shù)順序向左移1位或移CL寄存器中指定的位數(shù)。左移1位時(shí),操作數(shù)的最高位MSB移入進(jìn)位標(biāo)志CF的同時(shí),還移到最低位LSB形成循環(huán),進(jìn)位標(biāo)志位不在循環(huán)環(huán)內(nèi)。 【例2.43】 ROL AH,1 ;8位二進(jìn)制數(shù)循環(huán)左移1位ROL DX,CL ;16位二進(jìn)制數(shù)循環(huán)左移CL位操作說明:ROR指令將目的操作數(shù)順序向右移1位或右移CL寄存器

45、中指定的位數(shù)。右移1位時(shí),操作數(shù)的最低位LSB移入進(jìn)位標(biāo)志CF的同時(shí),還移到最高位MSB形成循環(huán),進(jìn)位標(biāo)志位不在循環(huán)環(huán)內(nèi)。 (2)循環(huán)右移指令 指令格式: ROR DST,COUNT功 能:如圖2.12所示。 操作說明:ROR指令將目的操作數(shù)順序向右移1位或移CL寄存器中指定的位數(shù)。右移1位時(shí),操作數(shù)的最低位LSB移入進(jìn)位標(biāo)志CF的同時(shí),還移到最高位MSB形成循環(huán),進(jìn)位標(biāo)志位不在循環(huán)環(huán)內(nèi)。【例2.44】ROR CX,1ROR DX,CL(3)帶進(jìn)位循環(huán)左移指令指令格式:RCL DST,COUNT功 能:如圖2.13所示。 操作說明:RCL指令將目的操作數(shù)連同進(jìn)位標(biāo)志CF一起向左循環(huán)移動(dòng)1位或C

46、L寄存器中指定的位數(shù)。移動(dòng)一位時(shí),最高位MSB移入CF,而原CF移入最低位LSB。【例2.45】ROR CX,1ROR DX,CL (4)帶進(jìn)位循環(huán)右移指令格式: RCR DST,COUNT功 能:如圖2.14所示。操作說明:RCR指令將目的操作數(shù)連同進(jìn)位標(biāo)志CF一起向右循環(huán)移動(dòng)1位或由CL寄存器中指定的位數(shù)。移動(dòng)一位時(shí),最低位LSB移入CF,而原CF則移入最高位MSB?!纠?.46】 測試AL寄存器中第5位的狀態(tài),為“0”時(shí)轉(zhuǎn)向ZERO,否則向下繼續(xù)執(zhí)行。方法1 用循環(huán)移位指令實(shí)現(xiàn): MOV CL,6 ROR AL,CL ;將AL的bit5移入CF JNC ZERO ;若CF=0,則轉(zhuǎn)向ZE

47、RO處 ;否則,繼續(xù)執(zhí)行 ZERO: 方法2:用測試指令實(shí)現(xiàn):TEST AL,20H ;將AL與20H相“與”JZ ZERO ;若結(jié)果為0,則轉(zhuǎn)向ZERO處 ;否則,繼續(xù)執(zhí)行ZERO: 2.3.4 串操作指令串操作指令共有以下5條:串傳送指令(MOVS)、串裝入指令(LODS)、串送存指令(STOS)、串比較指令(CMPS)和串掃描指令(SCAS)。 串操作指令具有以下幾個(gè)共同特點(diǎn): (1)操作數(shù)的尋址 1)用寄存器SI尋址源操作數(shù)(源串)DS:SI,但也允許段超越。 2)用寄存器DI尋址目的操作數(shù)(目的串)ES:DI,不允許段超越。 3)每一次操作后自動(dòng)修改地址指針,由方向標(biāo)志DF決定。當(dāng)DF=0時(shí)(由CLD指令設(shè)置),按增量修改;若DF=1(由STD指令設(shè)置),按減量修改。增減的量值取決于所操作的數(shù)據(jù)的類型。字節(jié)操作時(shí),量值為1,字操作時(shí)為2。 (2)重復(fù)前綴指令 1)重復(fù)前綴指令加在串操作指令前,使串操作重復(fù)進(jìn)行,重復(fù)的次數(shù)由CX的內(nèi)容決定。因此,使用重復(fù)前綴以前應(yīng)首先給CX賦值。串操作指令每執(zhí)行一次,CX的內(nèi)容就減1,直到CX減為0時(shí),結(jié)束串指令操作。2)重復(fù)前綴指令格式及重復(fù)條件REP ;CXCX-1;CX0重復(fù)執(zhí)行串操作指令。主要與MOVS、STOS和LODS指令可配合工作。REPEREPZ ;CXCX-1;CX0且ZF=

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論