微機(jī)系統(tǒng)與接口課件2012-2013學(xué)年-第3章_第1頁
微機(jī)系統(tǒng)與接口課件2012-2013學(xué)年-第3章_第2頁
微機(jī)系統(tǒng)與接口課件2012-2013學(xué)年-第3章_第3頁
微機(jī)系統(tǒng)與接口課件2012-2013學(xué)年-第3章_第4頁
微機(jī)系統(tǒng)與接口課件2012-2013學(xué)年-第3章_第5頁
已閱讀5頁,還剩182頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章-1

尋址方式和指令系統(tǒng)教學(xué)重點(diǎn):指令系統(tǒng)的一般概念對(duì)操作數(shù)的尋址方式六大類指令的操作原理:操作碼的含義指令對(duì)操作數(shù)的要求指令執(zhí)行的結(jié)果指令:控制計(jì)算機(jī)完成指定操作的命令;機(jī)器指令:指令的二進(jìn)制代碼形式,如:CD21H;匯編指令:助記符形式的指令,如:INT21H;指令系統(tǒng):CPU所有指令及其使用規(guī)則的集合。8088/8086指令系統(tǒng):(1)指令向后兼容(x86系列);(2)應(yīng)用廣泛,資料豐富。第3章-1尋址方式和指令系統(tǒng)概述尋址方式:指CPU指令中規(guī)定的尋找操作數(shù)所在的地址的方式。操作數(shù):MOVAL,05H操作碼目的操作數(shù),源操作數(shù)操作數(shù)引用時(shí)的字節(jié)順序:若存放的信息是字節(jié),則按順序存放若存放的信息是字,則將字的低位字節(jié)存放在低地址,高位字節(jié)存放在高地址注:如果沒有特別說明,尋址方式是指源操作數(shù)的尋址方式。尋址方式8088/8086的操作數(shù)分為3類1、立即數(shù)(常數(shù))取值范圍如下表:立即數(shù)只能用作源操作數(shù),如8位16位無符號(hào)數(shù)00H-FFH(0-255)0000H-FFFFH(0-65535)帶符號(hào)數(shù)80H-7FH(-128~+127)8000H-7FFFH(-32768~)MOV AX,0FA00H ;正確MOV 8000H,DX ;錯(cuò)誤放在8個(gè)通用寄存器或4個(gè)段寄存器中的操作數(shù)16位AXAHAL16位BXBHBL16位CXCHCL16位DXDHDL2、寄存器操作數(shù)只能存放字操作數(shù)段寄存器存放當(dāng)前操作數(shù)的段基地址不允許將立即數(shù)傳送至段寄存器!SIDIBPSPCSDSESSS存儲(chǔ)器操作數(shù)字節(jié)字雙字124類型存儲(chǔ)單元個(gè)數(shù)一般不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù)3、存儲(chǔ)器操作數(shù)一條指令的指行時(shí)間=∑指令的執(zhí)行時(shí)間取指令取操作數(shù)執(zhí)行指令傳送結(jié)果單位用時(shí)鐘周期數(shù)表示建議:

1)盡量使用寄存器作為操作數(shù)

2)若有可能,用移位代替乘除法

3)盡量使用簡(jiǎn)單的尋址方式3.1.1立即尋址立即尋址方式中,指令操作碼和操作數(shù)都在存儲(chǔ)器的代碼段中。匯編格式:n(n為立即操作數(shù),是用8位或16位二進(jìn)制補(bǔ)碼表示的有符號(hào)數(shù))功能:操作數(shù)存放在存儲(chǔ)器,指令下一單元的內(nèi)容為立即操作數(shù)n。圖形表示:立即尋址只能用于源操作數(shù)MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH錯(cuò)誤例:

×MOV2A00H,AX;錯(cuò)誤!

例3.1指令操作例:MOVAX,3102H;AX3102H執(zhí)行后,(AH)=31H,(AL)=02H3.1.2直接尋址匯編格式:①含有變量的地址表達(dá)式。②段寄存器名:[EA]。功能:有效地址由指令直接給出,有效地址只包含位移量。圖形表示:默認(rèn)的段寄存器為DS,但也可以顯式地指定其他段寄存器—稱為段超越前綴偏移地址也可用符號(hào)地址來表示,如ADDR、VAR例3.2:指令操作例:MOVAX,[3102H]AL(3102H),AH(3103H)如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH則操作數(shù)的物理地址為:20000HH=23102H指令執(zhí)行后:MOV操作碼02H31HAHAL23102HCDHABH存儲(chǔ)器代碼段數(shù)據(jù)段..(AX)=0ABCDH3.1.3寄存器尋址寄存器尋址方式的操作數(shù)在指令指明的寄存器中。匯編格式:R(R為寄存器名)功能:操作數(shù)直接存放在寄存器R中。圖形表示:

R指令→操作數(shù)源操作數(shù)與目的操作數(shù)字長要相同;寄存器尋址與段地址無關(guān)。例3.3下列程序執(zhí)行后,(AX)=?,(BX)=?MOVAX,1234HMOVBX,5678H

ADDAX,BX該程序中MOV指令為數(shù)據(jù)傳送指令操作符,ADD指令為加法指令操作符,三條指令皆為雙操作數(shù)指令。第一、二條指令A(yù)X、BX皆為目的操作數(shù)地址,為寄存器尋址方式。第三條指令中,AX為目的操作數(shù)地址,BX為源操作數(shù)地址。源地址和目的地址皆為寄存器尋址方式。圖形表示:執(zhí)行:1234H→AX5678H→BX

(AX)+(BX)→AX執(zhí)行后:(AX)=68ACH,(BX)=5678H3.1.4寄存器間接尋址寄存器間接尋址方式中,寄存器的內(nèi)容為操作數(shù)的偏移地址EA,操作數(shù)在存儲(chǔ)器中。匯編格式:[R]功能:操作數(shù)存放在存儲(chǔ)器,寄存器R存放操作數(shù)的偏移地址EA。偏移地址EA計(jì)算方法如下:EA=[SI] SI作間址寄存器。[DI] DI作間址寄存器。[BX] BX作間址寄存器。[BP] BP作間址寄存器。以SI、DI、BX為間址時(shí),默認(rèn)的段地址寄存為DS;以BP為間址時(shí),默認(rèn)的段地址寄存為SS;只有SI、DI、BX和BP可作間址寄存器。例3.4:指令操作例:MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H則指令執(zhí)行后,(AX)=3344H3.1.5變址尋址變址尋址方式操作數(shù)的偏移地址EA為寄存器的內(nèi)容加位移量,操作數(shù)在存儲(chǔ)器中。匯編格式:X[R](X表示位移量,是8位或16位二進(jìn)制補(bǔ)碼表示的有符號(hào)數(shù))功能:操作數(shù)存放在存儲(chǔ)器,寄存器R的內(nèi)容加位移量X為操作數(shù)的偏移地址EA。圖形表示如下:偏移地址EA計(jì)算方法如下:例3.5:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BPH];默認(rèn)段寄存器為SS指令操作例:MOVAX,DATA[BX]若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H則物理地址=60000H+1000H+2A00H=63A00H指令執(zhí)行后:(AX)=5566HMOVAX,DATA[BX]3.1.6基址—變址尋址基址—變址尋址方式中,操作數(shù)的偏移地址EA是指令中基址寄存器內(nèi)容、變址寄存器內(nèi)容、位移量X三項(xiàng)之和,操作數(shù)在存儲(chǔ)器中。匯編格式:X[BR][IR]功能:操作數(shù)存放在存儲(chǔ)器,BR的內(nèi)容加IR的內(nèi)容加位移量X是操作數(shù)的偏移地址EA。圖形表示:由基址寄存器(BX或BP)給出——

基址尋址方式由變址寄存器(SI或DI)給出——

變址尋址方式同一組內(nèi)的寄存器不能同時(shí)出現(xiàn)操作數(shù)偏移地址EA計(jì)算方法如下例3.6:MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H則指令執(zhí)行后:(AH)=[83021H],(AL)=[83020H]使用基址-變址尋址方式可以很方便地訪問二維數(shù)組?;芳拇嫫鲾?shù)組首地址變址寄存器數(shù)組元素行址位移量數(shù)組元素列址(偏移地址)二維數(shù)組例:內(nèi)存圖示(按行存儲(chǔ))(行位移地址)(行內(nèi)元素下標(biāo))183252409A=3.1.7

隱含尋址指令操作數(shù)是隱含的,在指令中未顯式地指明。例:MULBL

指令隱含了被乘數(shù)AL及乘積AX

類似的指令還有:DIV、CBW、MOVS等(AL)×(BL)→AX3.1.8I/O端口尋址直接端口尋址可以對(duì)0~255的端口編號(hào)進(jìn)行尋址間接端口尋址用寄存器DX的內(nèi)容來指定端口地址,可以對(duì)編號(hào)為0~65535的端口進(jìn)尋址。只能用輸入指令I(lǐng)N或輸入指令OUT來訪問I/O端口。3.1.9跨段問題按前述規(guī)定:若選用BP作間址寄存器、變址寄存器或基址寄存器,則操作數(shù)在堆棧段,操作數(shù)的物理地址PA由堆棧段寄存器SS的內(nèi)容左移4位與偏移地址EA相加后形成;否則,操作數(shù)在數(shù)據(jù)段,操作數(shù)的物理地址PA由數(shù)據(jù)段寄存器DS的內(nèi)容左移4位與偏移EA相加后形成。該規(guī)定為系統(tǒng)默認(rèn)狀態(tài)。當(dāng)要否定默認(rèn)狀態(tài),到非約定段尋找操作數(shù)時(shí),必須用跨段前綴指明操作數(shù)的段寄存器名。匯編格式:段寄存器名:操作數(shù)地址功能:段寄存器名指明操作數(shù)屬哪個(gè)段。例3.9跨段前綴示例。MOV AX,DS:[BP]MOV CX,SS:[SI]該例中,DS:,SS:均為跨段前綴,此時(shí)默認(rèn)狀態(tài)無效,操作數(shù)的物理地址PA由段寄存器內(nèi)容左移4位加偏移EA形成。上述2條指令的源操作數(shù)物理地址分別為:PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI]小結(jié)指令由(

)和(

)構(gòu)成如何取得操作數(shù)——稱為(

)操作碼操作數(shù)尋址方式尋址方式可分為立即尋址直接尋址變址尋址寄存器尋址基址-變址尋址寄存器間接尋址基址尋址幾種尋址方式比較8086/8088的指令系統(tǒng)指令系統(tǒng)是一臺(tái)計(jì)算機(jī)所能識(shí)別和執(zhí)行的全部指令的集合。指令一般包括兩個(gè)部分:操作碼域和地址域。操作碼域存放指令的操作碼,即指明該指令應(yīng)由計(jì)算機(jī)完成何種操作。地址域確定操作數(shù)的值或地址、操作結(jié)果的地址,有的指令的地址域還指出下一條指令的地址。

機(jī)器指令:計(jì)算機(jī)能識(shí)別的代碼,機(jī)器指令是由二進(jìn)制數(shù)組成的。例如:ADDCL,BH

指令格式為:0000001011001111PUSH AX機(jī)器指令為:01010000

匯編語言:匯編語言是一種符號(hào)語言,用助記符表示操作碼,用符號(hào)或符號(hào)地址表示操作數(shù)或操作數(shù)地址,它與機(jī)器指令是一一對(duì)應(yīng)的。

匯編程序:MASM.EXE將匯編語言源程序翻譯成機(jī)器語言,即目標(biāo)程序。3.2數(shù)據(jù)傳送類指令3.2.1通用數(shù)據(jù)傳送指令3.2.2堆棧操作指令3.2.3標(biāo)志寄存器傳送指令3.2.4地址傳送指令3.2.5輸入輸出指令3.2.1通用數(shù)據(jù)傳送指令1.傳送指令MOV2.?dāng)?shù)據(jù)交換指令XCHG3.查表轉(zhuǎn)換指令XLAT1.傳送指令MOV語句格式:MOVOPD,OPS功能:將源操作數(shù)傳送入目的地址,源地址內(nèi)容不變。即(OPS)→OPD。下圖描述了MOV指令在傳送數(shù)據(jù)時(shí)允許傳送的路徑及類型。MOV指令所允許的數(shù)據(jù)傳送路徑及類型MOV指令使用規(guī)則1)IP不能作目的寄存器2)不允許mem←mem3)不允許segreg←segreg4)立即數(shù)不允許作為目的操作數(shù)5)不允許segreg←立即數(shù)6)源操作數(shù)與目的操作數(shù)類型要一致幾個(gè)不能傳送的解決辦法:用AX作橋梁

存儲(chǔ)器←存儲(chǔ)器:

MOVAX,MEM1MOVMEM2,AX段寄存器←段寄存器:

MOVAX,DSMOVES,AX段寄存器←立即數(shù):

MOVAX,DATAMOVDS,AX例:存儲(chǔ)器與寄存器間數(shù)據(jù)傳送。MOVAX,BUF;BUF是變量,源操作數(shù)為直接尋址MOVBH,[DI];源操作數(shù)為寄存器間接尋址MOVDI,ES:3[SI];源操作數(shù)為變址尋址,使用跨段前綴MOVBP,3[BX+SI] ;源操作數(shù)為基址-變址尋址MOVBUFA,DL ;BUFA是一字節(jié)變量MOV[BP],AX ;使用SS段寄存器MOVDS:[BP],DL ;使用跨段前綴MOVBUF,DS ;BUF是個(gè)字變量2.?dāng)?shù)據(jù)交換指令XCHG語句格式:XCHGOPD,OPS功能:將源地址與目的地址中的內(nèi)容互換。即(OPD)→OPS,(OPS)→OPD。兩操作數(shù)中必須有一個(gè)在寄存器中;操作數(shù)不能為段寄存器和立即數(shù);源和目地操作數(shù)類型要一致。例:MOV AX,5678H ;(AX)=5678HMOV BX,0FFFFH;(BX)=0FFFFHXCHGAX,BX (AX)=0FFFFH,(BX)=5678H3.換碼指令/查表指令XLAT語句格式:XLATOPS或XLAT功能:將(BX)為首址(AL)為位移量的字節(jié)存儲(chǔ)單元中的數(shù)據(jù)送AL寄存器。即([BX+AL])→AL。3.2.2堆棧操作指令1.進(jìn)棧指令PUSH2.出棧指令POP什么是堆棧?按“后進(jìn)先出(LIFO)”方式工作的存儲(chǔ)區(qū)域。堆棧以字為單位進(jìn)行壓入/彈出操作。為什么要設(shè)置堆棧?為什么要按“后進(jìn)先出”方式工作?參見下圖規(guī)定由SS指示堆棧段的段基址,堆棧指針SP始終指向堆棧的頂部,SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的最高地址叫棧底。SPSS堆棧段進(jìn)棧方向退棧方向棧底棧頂?shù)偷刂犯叩刂?/p>

①壓棧指令

PUSHsrc ;src為16位操作數(shù)例:PUSH AX ;將AX內(nèi)容壓棧執(zhí)行操作:(SP)-1←高字節(jié)AH

(SP)-2←低字節(jié)AL

(SP)←(SP)-2設(shè)(AX)=1020H,執(zhí)行示意圖如下:低地址存儲(chǔ)區(qū)(SS段)執(zhí)行前(AX)=1020H(SP)存儲(chǔ)區(qū)(SS段)進(jìn)棧方向執(zhí)行后20H10H(AL)(AH)PUSHAX指令執(zhí)行示意圖(SP)-2(SP)高地址低地址高地址(SP)-1壓棧指令的格式為:

PUSH regPUSH mem/regPUSH segreg例如:

PUSHAXPUSH[BX]PUSHDS注意進(jìn)棧方向是高地址向低地址發(fā)展。

②彈出指令

POP dest例:POP BX ;將棧頂內(nèi)容彈至BX

執(zhí)行操作:(BL)←(SP)

(BH)←(SP)+1

(SP)←(SP)+2POPBX的執(zhí)行示意圖如下圖所示POPBX指令執(zhí)行示意圖堆棧指令使用時(shí)應(yīng)注意幾點(diǎn):①堆棧操作總是按字進(jìn)行②一般不能從棧頂彈出一個(gè)字給CS③堆棧指針為SS:SP,SP永遠(yuǎn)指向棧頂④SP自動(dòng)進(jìn)行增減量23.2.3標(biāo)志寄存器傳送指令1.標(biāo)志送AH指令LAHF2.AH送標(biāo)志指令SAHF3.標(biāo)志寄存器進(jìn)棧指令PUSHF4.標(biāo)志寄存器出棧指令POPF標(biāo)志寄存器1.標(biāo)志送AH指令LAHF語句格式:LAHF功能:將標(biāo)志寄存器的低8位送入AH寄存器。即(FLAGS)7-0→AH。該指令的執(zhí)行對(duì)標(biāo)志位無影響。例:標(biāo)志寄存器傳送。執(zhí)行前:(FLAGS)=0485H,(AX)=0FFFFH執(zhí)行指令:LAHF

(AX)=?2.AH送標(biāo)志指令SAHF語句格式:SAHF功能:將AH的內(nèi)容送入標(biāo)志寄存器的低8位,高8位不變。即(AH)→FLAGS7-0.。從該指令功能可看出,SAHF為LAHF的逆過程。問題:將標(biāo)志ZF置0?3.標(biāo)志寄存器進(jìn)棧指令PUSHF語句格式:PUSHF功能:將標(biāo)志寄存器的內(nèi)容壓入堆棧。即(FLAGS)→↓(SP)。4.標(biāo)志寄存器出棧指令POPF功能:將棧頂內(nèi)容彈出送入標(biāo)志寄存器中。即↑(SP)→FLAGS。POPF指令與PUSHF指令互為逆過程。例:將標(biāo)志寄存器的單步標(biāo)志TF置位。PUSHF ;(FLSGS)→↓(SP)POPAX ;(SP)→AXORAX,0100H ;設(shè)置D8=TF=1PUSHAX ;(AX)→↓(SP)POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS3.2.4地址傳送指令1.傳送偏移地址指令LEA2.傳送偏移地址及數(shù)據(jù)段首址指令LDS3.傳送偏移地址及附加數(shù)據(jù)段指令LES1.傳送偏移地址指令LEA語句格式:

LEAOPD,OPS功能:將源操作數(shù)的有效地址即16位偏移地址傳送到目的寄存器中。例:主存偏移地址的獲取。MOVBX,0100H ;(BX)=0100HMOVSI,0210H ;(SI)=0210HLEABX,1234H[BX][SI];(BX)=?注意以下兩條指令差別:

LEABX,BUFFERMOVBX,BUFFER前者表示將符號(hào)地址為BUFFER的存儲(chǔ)單元的偏侈地址取到BX中;后者表示將BUFFER存儲(chǔ)單元中的內(nèi)容取到BX中。2.傳送偏移地址及數(shù)據(jù)段首址指令LDS語句格式:LDSOPD,OPS功能:將主存中指定字單元數(shù)據(jù)送入指定存儲(chǔ)器,下一字單元數(shù)據(jù)送DS寄存器。即(OPS)→OPD,(OPS+2)→DS。例:(DS)=C000H,

(C0010H)=80H,

(C0011H)=01H,

(C0012H)=00H,

(C0013H)=20H,

執(zhí)行:LDSSI,[0010H]則(SI)=?,(DS)=?(SI)=0180H,(DS)=2000H3.傳送偏移地址及附加數(shù)據(jù)段指令LES語句格式:LESOPD,OPS功能:將主存某字單元內(nèi)容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。3.2.5輸入輸出(I/O)指令1.輸入指令I(lǐng)N2.輸出指令OUT只限于用累加器AL或AX來傳送信息。功能:(累加器)←→I/O端口1.輸入指令I(lǐng)N輸入指令用來從指定的外設(shè)寄存器取信息送入累加器。它有四種形式:(1)語句格式:IN AL,PORT

功能:(PORT)→AL;端口號(hào)0~255(2)語句格式:IN AX,PORT

功能:(PORT)→AX(3)語句格式:IN AL,DX

功能:([DX])→AL;DX表示的端口范圍達(dá)64K(4)語句格式:IN AX,DX

功能:([DX])→AX2.輸出指令OUT輸出指令用來把累加器的內(nèi)容送往指定的外設(shè)存儲(chǔ)器,它有四種形式:(1)語句格式:OUT PORT,AL

功能:(AL)→PORT(2)語句格式:OUT PORT,AX

功能:(AX)→PORT(3)語句格式:OUTDX,AL

功能:(AL)→[DX](4)語句格式:OUTDX,AX

功能:(AX)→[DX]3.3算術(shù)運(yùn)算類指令3.3.1加法指令3.3.2減運(yùn)算指令3.3.3乘運(yùn)算指令3.3.4除運(yùn)算指令3.3.5符號(hào)擴(kuò)展指令3.3.6十進(jìn)制調(diào)整指令3.3.1加法指令1.加1指令I(lǐng)NC2.加指令A(yù)DD3.帶進(jìn)位加指令A(yù)DC1.加1指令I(lǐng)NC語句格式:INCOPD功能:將目的操作數(shù)加1,結(jié)果送目的地址。即(OPD)+1→OPD。INC指令是一個(gè)單操作數(shù)指令,操作數(shù)可以是寄存器或存儲(chǔ)器操作數(shù)。如:INCBX,即(BX)+1→BX。加1指令可用于對(duì)計(jì)數(shù)器和地址指針進(jìn)行調(diào)整。注:本指令不影響CF標(biāo)志!2.加指令A(yù)DD語句格式:ADDOPD,OPS功能:將目的操作數(shù)與源操作數(shù)相加,結(jié)果存入目的地址中,源地址的內(nèi)容不改變。即(OPD)+(OPS)→OPD。 例:

ADD

AL,30HADD AX,[BX+20H] ADD CX,SIADD [DI],200HADD指令對(duì)標(biāo)志位(指狀態(tài)標(biāo)志)都有影響。3.帶進(jìn)位加指令A(yù)DC語句格式:ADCOPD,OPS功能:將目的操作數(shù)加源操作數(shù)再加進(jìn)位標(biāo)志位CF,結(jié)果送目的地址。即(OPD)+(OPS)+CF→OPD。例:無符號(hào)雙字加法運(yùn)算。MOV AX,4652H ;(AX)=4652HADD AX,0F0F0H ;(AX)=3742H,CF=1MOV DX,0234H ;(DX)=0234HADC DX,0F0F0H ;(DX)=0F325H,CF=0ADD/ADC對(duì)條件標(biāo)志位(CF/OF/ZF/SF)的影響:CF位表示無符號(hào)數(shù)相加的溢出。OF位表示帶符號(hào)數(shù)相加的溢出。1結(jié)果為負(fù)0否則SF=1結(jié)果為00否則ZF=1和的最高有效位有向高位的進(jìn)位0否則CF=1兩個(gè)操作數(shù)符號(hào)相同,而結(jié)果符號(hào)與之相反0否則OF=3.3.2減運(yùn)算指令1.減1指令DEC2.減指令SUB4.帶借位減指令SBB3.求補(bǔ)指令NEG5.比較指令CMP1.減1指令DEC語句格式:DECOPD功能:將目的操作數(shù)減1,結(jié)果送目的地址。即(OPD)-1→OPD。DEC指令是一個(gè)單操作數(shù)指令,操作數(shù)可以是寄存器或存儲(chǔ)器操作數(shù)。如:DECCX。即(CX)-1→CX。注:本指令不影響CF標(biāo)志2.減指令SUB語句格式:SUBOPD,OPS功能:目的操作數(shù)減源操作數(shù),結(jié)果存于目的地址,源地址內(nèi)容不變。即(OPD)-(OPS)→OPD例:減法運(yùn)算。MOV AX,5678H ;(AX)=5678HSUB AX,1234H ;(AX)=4444HMOV BX,3354H ;(BX)=3354HSUB BX,3340H ;(BX)=0014H注:1.源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù);2.立即數(shù)不能作為目的操作數(shù)。3.帶借位減指令SBB語句格式:SBBOPD,OPS功能:目的操作數(shù)減源操作數(shù)再減借位標(biāo)志位CF,結(jié)果送目的地址。即(OPD)―(OPS)―CF→OPD4.求補(bǔ)指令NEG語句格式:NEGOPD功能:將目的操作數(shù)的每一位求反(包括符號(hào)位)后加1,結(jié)果送目的地址。等價(jià):0-OPD或0FFFFH-OPD+1;例:求補(bǔ)運(yùn)算。MOV AX,0FF64HNEG AL ;(AX)=0FF9CHSUB AL,9DH ;(AX)=0FFFFHNEG AX ;(AX)=0001HDEC AL ;(AX)=0000HNEG AX ;(AX)=0000HSUB/SBB對(duì)標(biāo)志位(CF/OF/ZF/SF)的影響CF=1表示無符號(hào)數(shù)減法溢出。OF=1表示帶符號(hào)數(shù)減法溢出。NEG指令對(duì)CF/OF的影響:CF:操作數(shù)為0時(shí),求補(bǔ)的結(jié)果使CF=0,否則CF=1。OF:字節(jié)運(yùn)算對(duì)-128求補(bǔ)或字運(yùn)算對(duì)-32768求補(bǔ)時(shí)OF=1,否則OF=0。1被減數(shù)的最高有效位有向高位的借位0否則CF=1兩個(gè)操作數(shù)符號(hào)相反,而結(jié)果的符號(hào)與減數(shù)相同0否則OF=5.比較指令CMP語句格式:CMPOPD,OPS功能:目的操作數(shù)減源操作數(shù),結(jié)果只影響標(biāo)志位,不送入目的地址。即(OPD)-(OPS)。根據(jù)標(biāo)志位來判斷比較的結(jié)果1)根據(jù)ZF判斷兩個(gè)數(shù)是否相等。若ZF=1,則兩數(shù)相等。2)若兩個(gè)數(shù)不相等,則分兩種情況考慮:①比較的是兩個(gè)無符號(hào)數(shù)若CF=0,則OPD>OPS;若CF=1,則OPD<OPS。②比較的是兩個(gè)有符號(hào)數(shù)若OF⊕SF=0,則OPD>OPS;

若OF⊕SF=1,則OPD<OPS。比較指令在使用時(shí),一般在其后緊跟一條條件轉(zhuǎn)移指令,判斷比較結(jié)果的轉(zhuǎn)向。舉例:比較AL、BL、CL中帶符號(hào)數(shù)的大小,將最小數(shù)放在AL中。程序:CMPAL,BL;AL和BL比較

JNG

BBB

;若AL≤BL,則轉(zhuǎn)

XCHGAL,BL;若AL>BL,則交換

BBB:CMPAL,CL;AL和CL比較

JNG

CCC;若AL≤CL,則轉(zhuǎn)

XCHGAL,CL;若AL>CL,則交換

CCC:HLT3.3.3乘運(yùn)算指令1.無符號(hào)數(shù)乘法指令MUL2.有符號(hào)乘指令I(lǐng)MUL進(jìn)行乘法時(shí):8位8位→16位乘積 16位16位→32位乘積1.無符號(hào)數(shù)乘法指令MUL語句格式:MULOPS功能:若是字節(jié)數(shù)據(jù)相乘,(AL)與OPS相乘得到字?jǐn)?shù)據(jù)存入AX中;若是字?jǐn)?shù)據(jù)相乘,則(AX)與OPS相乘得到雙字?jǐn)?shù)據(jù),高字存入DX、低字存入AX中。即字節(jié)乘法:(AL)(OPS)→AX,

字乘法:(AX)

(OPS)→DX,AX例:無符號(hào)數(shù)0A3H與11H相乘。MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H2.有符號(hào)乘指令I(lǐng)MUL語句格式:IMULOPS功能:字節(jié)乘法:(AL)(OPS)→AX,字乘法:(AX)(OPS)→DX、AX。IMUL指令除計(jì)算對(duì)象是帶符號(hào)二進(jìn)制數(shù)外,其他都與MUL一樣,但計(jì)算結(jié)果不同。例:有符號(hào)數(shù)0B4H與11H相乘。MOV AL,0B4H ;(AL)=B4HMOV BL,11H ;(BL)=11HIMUL BL ;(AX)=0FAF4H注意:MUL/IMUL指令中AL(AX)為隱含的乘數(shù)寄存器;

AX(DX,AX)為隱含的乘積寄存器;

OPS不能為立即數(shù);

除CF和OF外,對(duì)其它標(biāo)志位無定義。乘法指令對(duì)CF/OF的影響:00

乘積的高一半為零11

否則MUL指令:CF/OF=00

乘積的高一半是低一半的符號(hào)擴(kuò)展11

否則

IMUL指令:CF/OF=例:(AL)=A5H(-5B),(BL)=11H

(1)IMULBL;(AX)(AL)×(BL)

;A5×11-5B×11=-060BF9F5

;

(AX)=F9F5H

CF=OF=1(2)MULBL;(AX)(AL)×(BL)

;A5×11=0AF5

;

(AX)=0AF5H

CF=OF=1

3.3.4除運(yùn)算指令1.無符號(hào)除指令DIV2.有符號(hào)除指令I(lǐng)DIV進(jìn)行除法時(shí):16位/8位→8位商

32位/16位→16位商1.無符號(hào)除指令DIV語句格式:DIVOPS功能:字節(jié)除法:(AX)/(OPS)→AL(商)、AH(余數(shù))字除法:(DX、AX)/(OPS)→AX(商)、DX(余數(shù))例:寫出實(shí)現(xiàn)無符號(hào)數(shù)0400H/0B4H運(yùn)算的程序段。MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HDIV BL ;商(AL)=05H,余數(shù)(AH)=7CH

注:若除數(shù)為零或AL中商大于0FFH(或AX中商大于0FFFFH),則CPU產(chǎn)生一個(gè)類型0的內(nèi)部中斷。2.有符號(hào)除指令I(lǐng)DIV語句格式:IDIVOPS功能:字節(jié)除法:(AX)/(OPS)→AL(商)、AH(余數(shù))字除法:(DX,AX)/(OPS)→AX(商)、DX(余數(shù))如除數(shù)為0,或字節(jié)除法時(shí)AL寄存器中的商超出-128~+127的范圍,或字除法時(shí)AX寄存器中的商超出-32768~的范圍,則CPU產(chǎn)生一個(gè)類型0的內(nèi)部中斷。例:寫出實(shí)現(xiàn)有符號(hào)數(shù)0400H/0B4H運(yùn)算的程序段。MOV AX,0400H ;(AX)=0400HMOV BX,0B4H ;(BX)=0B4HIDIV BX ;(AL)=0F3H,(AH)=24H注意:

對(duì)于DIV/IDIV指令

AX(DX,AX)為隱含的被除數(shù)寄存器。

AL(AX)為隱含的商寄存器。

AH(DX)為隱含的余數(shù)寄存器。

OPS不能為立即數(shù)。

對(duì)所有條件標(biāo)志位均無定義。除法運(yùn)算要求被除數(shù)字長是除數(shù)字長的兩倍,若不滿足則需對(duì)被除數(shù)進(jìn)行擴(kuò)展,否則產(chǎn)生錯(cuò)誤;對(duì)于無符號(hào)數(shù)除法擴(kuò)展,只需將AH或DX清零即可;對(duì)有符號(hào)數(shù)而言,則是符號(hào)位的擴(kuò)展。可使用下面介紹的符號(hào)擴(kuò)展指令CBW和CWD。關(guān)于除法操作中的字長擴(kuò)展問題3.3.5符號(hào)擴(kuò)展指令1.字節(jié)轉(zhuǎn)換成字指令CBW2.將字轉(zhuǎn)換成雙字指令CWD1.字節(jié)轉(zhuǎn)換成字指令CBW語句格式:CBW功能:將AL中的符號(hào)位數(shù)據(jù)擴(kuò)展至AH。例:將字節(jié)數(shù)據(jù)擴(kuò)展成字?jǐn)?shù)據(jù)。MOV AL,0A5H;(AL)=0A5HCBW ;(AX)=0FFA5HADD AL,70H ;(AL)=25HCBW ;(AX)=0025H2.將字轉(zhuǎn)換成雙字指令CWD語句格式:CWD功能:將AX中的符號(hào)位數(shù)據(jù)擴(kuò)展至DX。例:將字?jǐn)?shù)據(jù)擴(kuò)展成雙字?jǐn)?shù)據(jù)。MOV DX,0 ;(DX)=0MOV AX,0FFABH ;(AX)=0FFABHCWD ;(DX)=0FFFFH(AX)=0FFABH例:

寫出34H÷25H的程序段。

MOVAL,34HMOVBL,25HCBW;AL的符號(hào)擴(kuò)展到AHIDIVBL;0034H÷25H,結(jié)果為;(AH)=0FH,(AL)=01H3.3.6十進(jìn)制調(diào)整指令1.壓縮BCD碼調(diào)整指令2.非壓縮BCD碼調(diào)整指令BCD碼本質(zhì)上是十進(jìn)制數(shù),即應(yīng)遵循逢十進(jìn)一的規(guī)則。而計(jì)算機(jī)是按二進(jìn)制(十六進(jìn)制)進(jìn)行運(yùn)算,并未按十進(jìn)制規(guī)則進(jìn)行運(yùn)算。(1)壓縮BCD碼加法調(diào)整DAA兩個(gè)壓縮BCD碼相加結(jié)果在AL中,通過DAA調(diào)整得到一個(gè)正確的壓縮BCD碼.指令操作(調(diào)整方法):若AL的低4位>9或

AF=1

則(AL)←(AL)+6,AF←1若AL的高4位>9或

CF=1

則(AL)←(AL)+60H,CF←1

只對(duì)AL的內(nèi)容進(jìn)行調(diào)整,對(duì)AH無影響;DAA指令應(yīng)緊跟在ADD或ADC指令之后。例:

0100100048H

MOVAL,48H

+01110100

74H

MOVBL,74H10111100BCHADDAL,BL

+01100110

66H

DAA100100010122H

(進(jìn)位) (進(jìn)位)執(zhí)行ADD后,(AL)=BCH,高4位低4位均大于9,故DAA指令執(zhí)行加66H調(diào)整,最后結(jié)果為:

(AL)=22H,CF=1,AF=1不正確的和(2)壓縮BCD碼減法的十進(jìn)制調(diào)正指令DAS對(duì)AL中由兩個(gè)壓縮BCD碼相減的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:若AL的低4位>9或

AF=1,則:

AL←(AL)-6,且AF←1若AL的高4位>9或CF=1,則:

AL←(AL)-60H,且CF←1

只對(duì)AL的內(nèi)容進(jìn)行調(diào)整,對(duì)AH無影響;DAS指令要求跟在減法指令之后。2.非壓縮BCD碼調(diào)整指令(1)加法的非壓縮BCD碼調(diào)整指令A(yù)AA(2)減法的非壓縮BCD碼調(diào)整指令A(yù)AS(3)乘法的非壓縮BCD碼調(diào)整指令A(yù)AM(4)除法的非壓縮BCD碼調(diào)整指令A(yù)AD(1)加法的非壓縮BCD碼調(diào)整指令A(yù)AA語句格式:AAA功能:如果AL的低4位大于9或(AF)=1,則:(AL)=(AL)+6(AH)=(AH)+1(AF)=(CF)=1

且AL高4位清零。否則:(CF)=(AF)=0AL高4位清零。

AAA指令只影響AF和CF,其余標(biāo)志無定義。AAA指令應(yīng)緊跟在ADD或ADC指令之后。例:計(jì)算8+900001000=11

結(jié)果應(yīng)為17,而計(jì)算機(jī)相加為11,原因在于運(yùn)算過程中,如遇到低4位往高4位產(chǎn)生進(jìn)位時(shí)(此時(shí)AF=1)是按逢十六進(jìn)一的規(guī)則,但BCD碼要求逢十進(jìn)一,因此只要產(chǎn)生進(jìn)位,個(gè)位就會(huì)少6,這就要進(jìn)行加6調(diào)正。這個(gè)1代表了16,而實(shí)際上僅應(yīng)為10,即多進(jìn)了6。(2)非壓縮BCD碼減法的十進(jìn)制調(diào)正指令A(yù)AS對(duì)AL中由兩個(gè)非壓縮的BCD碼相減的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:若AL的低4位>9或

AF=1,則:①AL←(AL)-6,AH←(AH)-1,AF←1②AL←(AL)&0FH③CF←AF否則:AL←(AL)&0FH舉例:16-8=?

MOVAX,0106H0000011006MOVBL,08H-00001000

-08SUBAL,BL11111110FE

AAS-00000110

-06

11111000F8

∧00001111

∧0F0000100008結(jié)果為:(AL)=08H,(AH)=0,CF=AF=1(3)乘法的非壓縮BCD碼調(diào)整指令A(yù)AM語句格式:AAM功能:被調(diào)整的乘積在AX中,對(duì)AL按10取模,則:(AL)/0AH→AH(商):AL(余數(shù))其中AH為商,AL為余數(shù),標(biāo)志位AF、CF、OF、PF、SF、ZF受影響。例:按十進(jìn)制乘法計(jì)算7×8=?程序段如下:

MOV AL,07H ;(AL)=07H MOV CL,08H ;(CL)=08H MUL CL ;(AX)=0038H AAM ;(AH)=05H,(AL)=06H所得結(jié)果為非壓縮的BCD碼。又例:把3AH轉(zhuǎn)換成等值的十進(jìn)制數(shù)。

MOVAL,3AH;58BCDAAM;(AH)=05H,(AL)=08H(4)除法的非壓縮BCD碼調(diào)整指令A(yù)AD語句格式:AAD功能:除法運(yùn)算前,先調(diào)整被除數(shù)AX內(nèi)容,使:(AL)=(AL)+(AH)0AH(AH)=0即把非壓縮型十進(jìn)制數(shù)變成二進(jìn)制數(shù)。例:按十進(jìn)制除法計(jì)算55÷7=?

程序段如下:

MOV AX,0505H ;(AX)=55BCD MOV CL,07H ;(CL)=7 AAD ;(AX)=0037H DIV CL ;(AH)=6,(AL)=7

所得結(jié)果為非壓縮的BCD碼(商7余6)。又例:把73轉(zhuǎn)換成等值的二進(jìn)制數(shù)。

MOVAX,0703H;(AX)=73BCDAAD;(AX)=0049H3.4位操作類指令3.4.1邏輯運(yùn)算指令3.4.2移位指令

3.4.1邏輯運(yùn)算指令1.求反指令NOT2.邏輯乘指令A(yù)ND3.測(cè)試指令TEST4.邏輯加指令OR5.按位加指令XOR1.求反指令NOT語句格式:NOTOPD功能:將目的地址中的內(nèi)容逐位取反后送入目的地址。即(OPD)→OPD例:邏輯非運(yùn)算。MOV AX,878AH ;(AX)=878AHNOT AX, ;(AX)=7875H對(duì)標(biāo)志位無影響!2.邏輯乘指令A(yù)ND——邏輯“與”語句格式:ANDOPD,OPS 功能:將目的操作數(shù)和源操作數(shù)進(jìn)行邏輯乘運(yùn)算,結(jié)果存目的地址。即(OPD)∧(OPS)→OPD。該指令用于清除目的操作數(shù)中與源操作數(shù)置0的對(duì)應(yīng)位。說明:邏輯乘的運(yùn)算法則為:1∧1=1,1∧0=0,0∧1=0,0∧0=0例:將AL中第3位和第7位清零。MOV AL,0FFHAND AL,77H3.測(cè)試指令TEST語句格式:TESTOPD,OPS功能:源地址和目的地址的內(nèi)容執(zhí)行按位的邏輯乘運(yùn)算,結(jié)果不送入目的地址,但影響標(biāo)志寄存器。即(OPD)∧(OPS)。例:測(cè)試AX中的第12位是否為0,不為0則轉(zhuǎn)L。TEST AX,1000HJNE L4.邏輯加指令OR——邏輯“或”語句格式:OROPD,OPS功能:將目的操作數(shù)和源操作數(shù)進(jìn)行邏輯加運(yùn)算,結(jié)果存目的地址。即(OPD)∨(OPS)→OPD。說明:邏輯加的運(yùn)算法則為:1∨1=1,1∨0=1,0∨1=1,0∨0=0。例:把AL中的非壓縮BCD碼變成相應(yīng)十進(jìn)制數(shù)的ASCII碼。

ORAL,30H例:把AH和AL中的非壓縮BCD碼組合成壓縮的BCD碼,放到AL中。MOVCL,4SHLAH,CLORAL,AH例:把AL的第5位置為1ORAL,00100000B5.按位加指令XOR——邏輯“異或”語句格式:XOROPD,OPS功能:目的操作數(shù)與源操作數(shù)做按位加運(yùn)算,結(jié)果送入目的地址。即(OPD)⊕(OPS)→OPD。說明:按位加的運(yùn)算法則為;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。例:把AX寄存器清零。例:把DH的bit4,3變反①M(fèi)OVAX,0XORDH,18H②XORAX,AX③ANDAX,0④SUBAX,AX3.4.2移位指令移位指令包括算術(shù)移位指令、邏輯移位指令和循環(huán)移位指令,分別進(jìn)行左移和右移操作。這些指令均有統(tǒng)一的語句格式:

操作碼OPD,1操作符OPD,CL其功能為將目的操作數(shù)的所有位按操作符規(guī)定的方式移動(dòng)1位或按寄存器CL規(guī)定的次數(shù)(0~255)移動(dòng),結(jié)果送入目的地址。目的操作數(shù)是8位(或16位)的寄存器數(shù)據(jù)或存儲(chǔ)器數(shù)據(jù)。1.算術(shù)左移和邏輯左移指令SAL(SHL)語句格式:SALOPD,1或SHLOPD,1SALOPD,CL或SHLOPD,CL功能:將(OPD)向左移動(dòng)CL指定的次數(shù),最低位補(bǔ)入相應(yīng)的0,CF的內(nèi)容為最后移入位的值。最低位最高位CF02.算術(shù)右移指令SAR語句格式:SAROPD,1或SAROPD,CLCF功能:將(OPD)向右移動(dòng)CL指定的次數(shù)且最高位保持不變;CF的內(nèi)容為最后移入位的值。例:算術(shù)右移運(yùn)算。MOV BH,0F4H ;(BH)=0F4H=11110100BMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH=11111101B;(CF)=0該例語句“SARBH,CL”實(shí)際上完成了(BH)/4→BH的運(yùn)算,所以,用SAR指令可以實(shí)現(xiàn)對(duì)有符號(hào)數(shù)除2n的運(yùn)算(n為移位次數(shù))。3.邏輯右移指令SHR語句格式:SHROPD,1或SHROPD,CL功能:將(OPD)向右移動(dòng)CL規(guī)定的次數(shù),最高位補(bǔ)入相應(yīng)個(gè)數(shù)的0,CF的內(nèi)容為最后移入位的值。算術(shù)移位——把操作數(shù)看做有符號(hào)數(shù);邏輯移位——把操作數(shù)看做無符號(hào)數(shù)。移位位數(shù)放在CL寄存器中,如果只移1位,也可以直接寫在指令中。例如:

MOVCL,4 SHRAL,CL;AL中的內(nèi)容右移4位影響C,P,S,Z,O標(biāo)志。結(jié)果未溢出時(shí):左移1位≡操作數(shù)*2

右移1位≡操作數(shù)/2例:把AL中的數(shù)x乘10因?yàn)?0=8+2=23+21,所以可用移位實(shí)現(xiàn)乘10操作。程序如下:

SALAL,1;2x MOVAH,AL SALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10x4.循環(huán)左移指令ROL語句格式:ROLOPD,1或ROLLPD,CL功能:將目的操作數(shù)的最高位與最低位連成一個(gè)環(huán),將環(huán)中的所有位一起向左移動(dòng)CL規(guī)定的次數(shù)。CF的內(nèi)容為最后移入位的值。5.循環(huán)右移指令ROR語句格式:ROROPD,1或ROROPD,CL功能:將目的操作數(shù)的最高位與最低位連成一個(gè)環(huán),將環(huán)中的所有位一起向右移動(dòng)CL規(guī)定的次數(shù),CF的內(nèi)容為最后移入位的值。6.帶進(jìn)位的循環(huán)左移指令RCL語句格式:RCLOPD,1或RCLOPD,CL功能:將目的操作數(shù)連同CF標(biāo)志一起向左循環(huán)移動(dòng)CL規(guī)定的次數(shù)。7.帶進(jìn)位的循環(huán)右移指令RCR語句格式:RCROPD,1或RCROD,CL功能:將目的操作數(shù)連同CF標(biāo)志一起向右循環(huán)移動(dòng)所規(guī)定的次數(shù)。循環(huán)移位舉例例1:將AL的高4位與低4位互換。

MOVCL,4ROLAL,CL例2:

MOVCL,8RORBX,CLRORAX,CLMOVBH,AHMOVAH,0問題:此程序段的功能是什么?將(AX,BX)組成的32位數(shù)右移8位,最高8位填0。3.5串操作類指令串操作指令:數(shù)據(jù)傳送類指令每次只能傳送一個(gè)數(shù)據(jù),若要傳送大批數(shù)據(jù)就需要重復(fù)編程,這樣就浪費(fèi)了大量的時(shí)間和空間。為此8086提供了一組處理主存中連續(xù)存放數(shù)據(jù)串的指令,這就是串操作指令。3.5串操作指令串:順序放在內(nèi)存中的一組相同類型的數(shù)據(jù);串操作:對(duì)串中的元素進(jìn)行相同的操作;串操作的尋址方式:源操作數(shù)指針———DS:SI(DS可超越)目的操作數(shù)指針——ES:DI每次串操作后:串操作指令自動(dòng)修改SI和DI——字節(jié)±1,字±2。DF標(biāo)志決定±。(注意:退出串操作后,指針指向最后操作的元素的下一個(gè)元素);可完成兩個(gè)存儲(chǔ)單元之間的傳送和比較操作(也僅是串指令可以);串指令使用的一般方法設(shè)置源串地址設(shè)置目標(biāo)串地址設(shè)置串長度設(shè)置操作方向DF串指令MOVSI,源串首地址(或LEASI,源串)MOVDI,目的串首地址(或LEADI,目的串)MOVCX,串長度CLD(或STD)“串指令”1.傳送指令MOVS語句格式:①M(fèi)OVSB——字節(jié)串傳送②MOVSW——字串傳送功能:將以SI為指針的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)傳送至以DI為指針的目的地址中去,并自動(dòng)修改指針,使之指向下一個(gè)字節(jié)(或字)存儲(chǔ)單元。即:①(DS:[SI])→ES:[DI]。②當(dāng)DF=0時(shí),(SI)和(DI)增量。當(dāng)DF=1時(shí),(SI)和(DI)減量。2.串比較指令CMPS

語句格式:①CMPSB——字節(jié)串比較②CMPSW——字串比較功能:將SI所指的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)與DI所指的目的串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)相減,并根據(jù)相減的結(jié)果設(shè)置標(biāo)志,但結(jié)果并不保存。即:①([SI])-([DI])。②修改串指針,使之指向串中的下一個(gè)元素。當(dāng)DF=0時(shí),(SI)和(DI)增量。當(dāng)DF=1時(shí),(SI)和(DI)減量。3.串搜索指令SCAS語句格式:①SCASB——字節(jié)串搜索②SCASW——字串搜索功能:AL(字節(jié))或AX(字)中的內(nèi)容與DI所指的目的串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)相減,根據(jù)相減結(jié)果設(shè)置標(biāo)志位,結(jié)果不保存,即:①字節(jié)操作:(AL)-([DI]),字操作:(AX)-([DI])。②修改指針使之指向串中的下一個(gè)元素。當(dāng)DF=0時(shí),(DI)增量。當(dāng)DF=1時(shí),(DI)減量。4.從源串中取數(shù)指令LODS語句格式:①LODSB——從字節(jié)串中取數(shù)②LODSW——從字串中取數(shù)功能:將SI所指的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)取出來送入AL(或AX)中。即:①字節(jié)操作:([SI])→AL,字操作:([SI])→AX。②修改指針SI,使它指向串中的下一個(gè)元素。當(dāng)DF=0時(shí),(SI)增量。當(dāng)DF=1時(shí),(SI)減量。5.往目的串中存數(shù)指令STOS語句格式:①STOSB——往字節(jié)串中存數(shù)②STOSW——往字串中存數(shù)功能:將AL或AX中的數(shù)據(jù)送入DI所指的目的串中的字節(jié)(或字)存儲(chǔ)單元中。即:①字節(jié)操作:(AL)→[DI],字操作:(AX)→[DI]。②修改指針DI,使之指向串中的下一個(gè)元素。當(dāng)DF=0時(shí),(DI)增量。當(dāng)DF=1時(shí),(DI)減量。重復(fù)前綴有的串操作指令前面可加上重復(fù)前綴REP。當(dāng)使用REP前綴時(shí),該指令重復(fù)執(zhí)行,重復(fù)執(zhí)行次數(shù)由CX決定(帶有REP前綴的串操作指令每執(zhí)行一次,CX自動(dòng)減1)。重復(fù)前綴包括:REPCX≠0

時(shí)重復(fù)執(zhí)行REPE/REPZCX≠0

且ZF=1時(shí)重復(fù)執(zhí)行REPNE/REPNZCX≠0

且ZF=0時(shí)重復(fù)執(zhí)行串傳送指令使用舉例例1:用串傳送指令實(shí)現(xiàn)200個(gè)字節(jié)的數(shù)據(jù)傳送:

LEASI,MEM1LEADI,MEM2MOVCX,200

CLD

REPMOVSB

例2:把從A000H開始的2KB內(nèi)存單元清零。程序段如下:MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW例3:把1000H開始的100個(gè)存儲(chǔ)單元填入ASCII碼2AH(即*號(hào))。程序段如下:

MOVDI,1000H;首地址 MOVAL,2AH;‘*’

MOVCX,100;重復(fù)執(zhí)行100次 CLD;增量修改DI

REP STOSB例4:用串操作指令代替如下指令:1)

MOVAL,[SI]INCSI2)

MOVES:[DI],AXINCDIINCDI3.6控制轉(zhuǎn)移類指令3.6.1條件轉(zhuǎn)移指令3.6.2無條件轉(zhuǎn)移指令3.6.3循環(huán)指令3.6.4子程序調(diào)用指令3.6.5中斷指令3.6.1條件轉(zhuǎn)移指令1.單個(gè)標(biāo)志位條件轉(zhuǎn)移指令2.無符號(hào)數(shù)條件轉(zhuǎn)移指令3.有符號(hào)數(shù)條件轉(zhuǎn)移指令它們都有通用的語句格式和功能。語句格式:[標(biāo)號(hào):]操作符標(biāo)號(hào)功能:如果條件滿足,則(IP)+位移量→IP。1.單個(gè)標(biāo)志位條件轉(zhuǎn)移指令

2.無符號(hào)數(shù)條件轉(zhuǎn)移指令例:比較無符號(hào)數(shù)大小,將較大的數(shù)存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,轉(zhuǎn)移到NEXTXCHG AX,BX;若AX<BX,交換NEXT:…3.有符號(hào)數(shù)條件轉(zhuǎn)移指令例:比較有符號(hào)數(shù)大小,將較大的數(shù)存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,轉(zhuǎn)移到;NEXTXCHGAX,BX ;若AX<BX,交換NEXT:…

MOV BX,12FAH MOV CH,4 ;CH做循環(huán)計(jì)數(shù)器ROT: MOV CL,4 ;CL做移位計(jì)數(shù)器 ROL BX,CL ;將最高4位移到低4位

MOV AL,BL AND AL,0FH ;取出低4位

ADD AL,30H ;轉(zhuǎn)換為ASCII碼

CMP AL,39H ;與’9’比較

JBE DISP

;若(AL)≤‘9’,則轉(zhuǎn)顯示

ADD AL,07H ;若(AL)>’9’,再加7轉(zhuǎn)為‘A’-‘F’DISP:

MOV DL,AL ;(DL)←字符

MOV AH,2

INT 21H ;顯示輸出

DEC CH ;4個(gè)十六進(jìn)制數(shù)顯示完否?

JNZ ROT

;沒有,循環(huán)

MOV DL,48H

;‘H’

MOV AH,2

INT 21H ;最后顯示’H’例:以十六進(jìn)制數(shù)形式顯示BX中的內(nèi)容。3.6.2無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令——JMP本指令無條件轉(zhuǎn)移到指定的目標(biāo)地址,以執(zhí)行從該地址開始的程序段。根據(jù)設(shè)置CS、IP的方法,JMP指令分成4種情況。

①段內(nèi)直接轉(zhuǎn)移:JMPdisp

指令中給出的8/16位的位移量加到IP。CS保持不變。

②段內(nèi)間接轉(zhuǎn)移:JMPreg/mem

reg/mem中的16位偏移地址送IP。CS保持不變。③段間直接轉(zhuǎn)移JMPsegment:offset指令中給出的16位的段和16位的偏移地址送到CS和IP。

④段間間接轉(zhuǎn)移JMPmem32

mem32中的16位的段和16位的偏移地址送到CS和IP。轉(zhuǎn)移的目標(biāo)地址由指令直接給出。指令中給出的目標(biāo)地址實(shí)際上是一個(gè)相對(duì)于IP的位移量:位移量轉(zhuǎn)移范圍匯編語言中格式8位-128~+127JMPSHORTOPRD16位-32768~JMPNEARPTROPRD例:JMP 0120H ;直接轉(zhuǎn)向0120H JMP SHORTLP ;轉(zhuǎn)向LPJMP NEARPTRBBB ;轉(zhuǎn)向BBB由于是段內(nèi)轉(zhuǎn)移,故轉(zhuǎn)移后CS內(nèi)容保持不變①段內(nèi)直接轉(zhuǎn)移②段內(nèi)間接轉(zhuǎn)移轉(zhuǎn)移的目標(biāo)地址由寄存器或存儲(chǔ)單元的內(nèi)容給出。

例1:JMPSI若(SI)=1200H,則指令執(zhí)行后,(IP)=1200H,于是轉(zhuǎn)向代碼段的偏移地址1200H處開始執(zhí)行。注意:目標(biāo)地址以段內(nèi)偏移的形式給出,而不是相對(duì)于IP的位移量,所以它是一個(gè)16位的操作數(shù)。例2:JMP[BX+DI]設(shè)指令執(zhí)行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;則指令執(zhí)行后:(IP)=2350H在匯編語言中,段內(nèi)間接尋址通常寫成:

JMP WORDPTR[BX+DI]表示所取得的目標(biāo)地址是一個(gè)字。③段間直接轉(zhuǎn)移在指令中直接給出要轉(zhuǎn)移到的目的段地址和偏移地址。

例:JMP 2000H:1000H執(zhí)行時(shí),(IP)←1000H,(CS)←2000H注:直接地址為符號(hào)地址時(shí),段間直接轉(zhuǎn)移指令中的符號(hào)地址前應(yīng)加操作符FARPTR。

例:JMPFARPTRfar_label其中的far_label為遠(yuǎn)類型的標(biāo)號(hào)。轉(zhuǎn)移的目的地址(段和偏移)在兩個(gè)相鄰的字存儲(chǔ)單元中。例如:

JMP DWORDPTR[SI]設(shè)指令執(zhí)行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H則指令執(zhí)行后:(IP)=1000H,(CS)=4A00H于是轉(zhuǎn)到4B000H處開始執(zhí)行指令。例中的DWORDPTR表示轉(zhuǎn)移地址是一個(gè)雙字。④段間間接轉(zhuǎn)移3.6.3循環(huán)指令1.循環(huán)指令LOOP2.相等/為零循環(huán)指令LOOPE3.不相等/不為零循環(huán)指令LOOPNE4.CX為零轉(zhuǎn)移指令JCXZ(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。

注:LOOP指令與下面的指令段等價(jià):

DECCX JNZlabel(2)LOOPZ/LOOPE格式:LOOPZ

label操作:(CX)-1→CX;

若(CX)≠0且

ZF=1,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。(3)LOOPNZ/LOOPNE格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0且

ZF=0,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。(4)CX為零轉(zhuǎn)移指令JCXZ語句格式:JCXZ標(biāo)號(hào)功能:(CX)=0,則程序轉(zhuǎn)移(循環(huán));否則,順序執(zhí)行。例1:給1A000H開始的256個(gè)內(nèi)存單元均減去1,若發(fā)現(xiàn)某個(gè)單元減為0則立即退出循環(huán),其后的單元不再減1。程序段如下:(邏輯地址為1A00:0000H)

MOVAX,1A00HMOVDS,AX;1A00H段MOVDI,-1MOVCX,256GOON:INCDIDECBYTEPTR[DI]LOOPNZ

GOON

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論