第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第1頁
第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第2頁
第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第3頁
第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第4頁
第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第5頁
已閱讀5頁,還剩178頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五講86系列微型計(jì)算機(jī)的指令系統(tǒng)曾鐵軍主要內(nèi)容86系列匯編語言及指令的格式與尋址方式1傳送類指令2數(shù)據(jù)操作類指令3串操作指令4控制類指令586系列匯編語言及指令的格式與尋址方式指令是讓計(jì)算機(jī)完成某種操作的命令,指令的集合稱作指令系統(tǒng),不同系列計(jì)算機(jī)有不同的指令系統(tǒng)。指令系統(tǒng)與計(jì)算機(jī)硬件有著某些對(duì)應(yīng)關(guān)系,用指令進(jìn)行編程能夠充分開發(fā)計(jì)算機(jī)硬件資源,它的程序目標(biāo)代碼短、運(yùn)行速度快。86系列指令系統(tǒng)是在8位微處理器86系列的指令系統(tǒng)基礎(chǔ)上設(shè)計(jì)的,它兼容了86系列的全部指令。匯編語言的指令語句與機(jī)器指令一一對(duì)應(yīng)圖中由前向后的箭頭表示是可選項(xiàng),由后向前的箭頭表示是重復(fù)項(xiàng),圓頭方框表示是語句中的關(guān)鍵字。5.1.186系列匯編語言指令語句格式5.186系列匯編語言及指令的

格式與尋址方式【例6.4】的程序如下:START:IN

AL,71H

;將71H端口的字節(jié)讀入AL

CLC

;清除CF

CMP

AL,10

;將AL的內(nèi)容和10相比較

JC

LP1

;小于10轉(zhuǎn)LP1

CMP

AL,20

;將AL的內(nèi)容和20相比較

JC

LP2

;10≤AL<20轉(zhuǎn)LP2

MOV

BL,0FFH ;將0FFH送入BL寄存器LP3:OUT

73H,BL

;將0FFH輸出到73H端口

HLT

;暫停LP1:MOV

BL,00

JMP

LP3LP2:MOV

BL,88H

JMP

LP3(1)標(biāo)號(hào)是給該指令所在地址取的名字。86系列匯編語言中可使用的標(biāo)識(shí)符必須遵循下列規(guī)則:①標(biāo)識(shí)符由字母(a~z,A~Z)、數(shù)字(0~9)或某些特殊字符(@,-,?)組成。②第一個(gè)字符必須是字母(a~z,A~Z)或某些特殊的符號(hào)(@,-,?),但“?”不能單獨(dú)作標(biāo)識(shí)符。③標(biāo)識(shí)符有效長度為31個(gè)字符,若超過31個(gè)字符,則只保留前面的31個(gè)字符為有效標(biāo)識(shí)符。(2)指令助記符是指令名稱的代表符號(hào),它表示本指令的操作類型,必要時(shí)可在指令助記符的前面加上一個(gè)或多個(gè)“前綴”,從而實(shí)現(xiàn)某些附加操作。(3)操作數(shù)是參加本指令運(yùn)算的數(shù)據(jù),有些指令不需要操作數(shù),可以缺省;有些指令需要兩個(gè)操作數(shù),這時(shí)必須用逗號(hào)(,)將兩個(gè)操作數(shù)分開;有些操作數(shù)可以用表達(dá)式來表示。(4)注釋部分是可選項(xiàng),允許缺省,必須用分號(hào)(;)5.1.286系列CPU的尋址方式尋址:把物理地址分配給程序各條指令的過程尋址方式:根據(jù)指令的地址碼生成操作數(shù)的物理地址的方法地址指令地址:

指令通常存放在內(nèi)存中操作數(shù)地址:操作數(shù)可以存放在多個(gè)地方此處主要是針對(duì)操作數(shù)地址物理地址=段基址×16+偏移地址本書介紹的微機(jī)系統(tǒng)有4種尋址方式:立即尋址方式寄存器尋址方式直接尋址方式寄存器間接尋址方式后2種尋址方式是確定內(nèi)存單元有效地址的五種不同的計(jì)算方法,用它們可方便地實(shí)現(xiàn)對(duì)數(shù)組元素的訪問。多種尋址方式?效率和方便性的平衡1.立即數(shù)尋址MOVAL,80H;

將十六進(jìn)制數(shù)80H送入ALMOVAX,1090H;

將1090H送AX,AH中為 10H,AL中為90H立即數(shù)尋址方式的指令主要用來對(duì)寄存器賦值因?yàn)椴僮鲾?shù)可以從指令中直接取得,不需要運(yùn)行總線周期,所以,速度快立即數(shù)可以為8位,也可以為16位;規(guī)定立即數(shù)只能是整數(shù),不能是小數(shù)、變量或者其他類型的數(shù)據(jù);立即數(shù)只能作為源操作數(shù)2.寄存器尋址

INC

CX;將CX的內(nèi)容加1

ROL

AH,1;將AH中的內(nèi)容循環(huán)左移一位操作數(shù)就在CPU的內(nèi)部寄存器中對(duì)16位操作數(shù)來說,寄存器可以為AX,BX,CX,DX,SI,DI,SP或者BP,而對(duì)8位操作數(shù)來說,寄存器可為AH,AL,BH,BL,CH,CL,DH,DL操作就在CPU內(nèi)部進(jìn)行,不需要使用總線周期,因此,執(zhí)行速度快3.直接尋址

MOVAX,[1070H];將DS段的1070H和 1071H

兩單元的內(nèi)容取到AX中默認(rèn)為段寄存器是數(shù)據(jù)段寄存器DS。設(shè)DS=2000H,則執(zhí)行過程是將絕對(duì)地址為21070H和21071H兩單元的內(nèi)容取出送AX。如果要對(duì)其它段寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,則本條指令前必須用前綴指出段寄存器名。

CS:MOVBX,[3000H];將CS段的 3000H和3001H兩單元的內(nèi)容送BX設(shè)CS為5100H,則本指令在執(zhí)行時(shí),將54000H和54001H兩單元的內(nèi)容取出送BX。4.寄存器間接尋址

操作數(shù)一定在存儲(chǔ)器中,存儲(chǔ)單元的有效地址由寄存器指出,這些寄存器可以為BX,BP,SI和DI之一,即有效地址等于其中某一個(gè)寄存器的值:[BX][BP]EA=[SI][DI][BX][BP]+8位位移量

EA=[SI]16位位移量[DI]EA為寄存器能表示的有效地址寄存器間接尋址方式讀取存儲(chǔ)單元的原理和直接尋址一樣,如果指令前面沒有用前綴指明具體的段寄存器,則尋址時(shí)默認(rèn)的段寄存器通常為DS。如寄存器為BP時(shí),則對(duì)應(yīng)的段寄存器為SS。在有些資料中,將位移量看成是一個(gè)相對(duì)值。細(xì)分起來,寄存器間接尋址可分為以下4種:以BX寄存器進(jìn)行間接尋址——數(shù)據(jù)段基址尋址。MOVAX,[BX]

設(shè)DS=5000H,BX=3000H,則本指令在執(zhí)行時(shí),將53000H和53001H兩單元的內(nèi)容送AX。

ES∶MOVCX,[BX]

設(shè)ES=3000H,BX=4000H,則本指令在執(zhí)行時(shí),將34000H和34001H兩單元的內(nèi)容送CX。(2)以BP寄存器進(jìn)行間接尋址——堆棧段基址尋址。MOVBX,[BP]設(shè)SS=5000H,BP=4000H,則本指令在執(zhí)行時(shí),將54000H和54001H兩單元的內(nèi)容送BX。(3)以SI和DI寄存器進(jìn)行間接尋址——變址尋址。SI和DI寄存器分別稱為源變址寄存器和目的變址寄存器,所以用這兩個(gè)寄存器來進(jìn)行間接尋址也叫變址尋址。變址尋址通常用于對(duì)數(shù)組元素進(jìn)行操作,另外,在“54串操作指令中還將講到有些串操作指令要求用固定的變址寄存器對(duì)操作數(shù)進(jìn)行尋址,操作過程中,指令會(huì)自動(dòng)修改變址寄存器中的地址,以指向下一個(gè)操作數(shù)。

(4)將BX,BP和SI,DI寄存器組合起來進(jìn)行間接尋址——基址加變址的尋址。通常將BX和BP稱為基址寄存器,將SI和DI稱為變址寄存器。

EA=[BX][SI][BP]+[DI]+偏移量

MOVAX,[BX+SI]

設(shè)DS=1000H,BX=5000H,SI=2000H,則上面指令在執(zhí)行時(shí),有效地址為7000H,本指令將17000H和17001H兩單元的內(nèi)容取到AX中。

MOVAX,[BX+SI+0050];

將BX和SI中的內(nèi)容與0050相加作為有效地址【例5.1】設(shè)BX=0158H,DI=10A5H,位移量=1B57H,DS=2100H,并假定沒有使用段前綴,即把DS作為操作數(shù)對(duì)應(yīng)的段寄存器。在各種尋址方式下,這些寄存器和位移量所產(chǎn)生的有效地址和物理地址為:①直接尋址:有效地址=1B57H物理地址=21000H+1B57H=22B57H②寄存器間接尋址(寄存器為BX):有效地址=0158H物理地址=21000H+0158H=21158H③BX寄存器相對(duì)間接尋址:有效地址=0158H+1B57H=1CAFH物理地址=21000H+1CAFH=22CAFH④變址尋址(寄存器為DI):有效地址=10A5H物理地址=21000H+10A5H=220A5H⑤DI寄存器相對(duì)變址尋址:有效地址=10A5H+1B57H=2BFCH物理地址=21000H+2BFCH=23BFCH⑥基址加變址的尋址(BX為基址寄存器,DI為變址寄存器):有效地址=0158H+10A5H=11FDH物理地址=21000H+11FDH=221FDH⑦相對(duì)的基址加變址的尋址(BX為基址寄存器,DI為變址寄存器):有效地址=0158H+10A5H+1B57H=2D54H物理地址=21000H+2D54H=23D54H8086指令分類8086指令系統(tǒng)按功能可分為4大類型:數(shù)據(jù)傳輸類數(shù)據(jù)操作類串操作類控制類傳送類指令傳送類指令是指令系統(tǒng)中最活躍的一類指令,也是條數(shù)最多的一類指令,主要用于數(shù)據(jù)的保存及交換等場合。通用傳送指令中包括最基本的傳送指令MOV,堆棧指令PUSH和POP,數(shù)據(jù)交換指令XCHG。

一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令又可以分成4種:通用數(shù)據(jù)傳送累加器專用傳送(輸入/輸出數(shù)據(jù)傳送)目的地址傳送標(biāo)志寄存器轉(zhuǎn)送

5.2.1通用數(shù)據(jù)傳送指令MOV指令格式:MOVDST,SRC;源操作數(shù)和目的操作數(shù)可用上述6種尋址方式的任何一種。將源操作數(shù)內(nèi)容復(fù)制到目操作數(shù)中,結(jié)果目的操作數(shù)的內(nèi)容等于源操作數(shù)的內(nèi)容,源操作數(shù)的內(nèi)容不變。即OPRD2→OPRD1。OPRD1和OPRD2可以是字節(jié)或字,但是必須等長。對(duì)標(biāo)志位的影響:無

源操作數(shù)可以是通用寄存器、段寄存器、存儲(chǔ)器以及立即操作數(shù),目標(biāo)操作數(shù)可以是通用寄存器、段寄存器(CS除外)或存儲(chǔ)器。未交叉①M(fèi)OVreg,data;立即數(shù)送寄存器②MOVmem,data;立即數(shù)送存儲(chǔ)單元③MOVmem/reg1,mem/reg2

指令中兩操作數(shù)中至少有一個(gè)為寄存器例:MOV CL,DLMOV AX,BX MOV [SI],CX

MOV CL,[BX+5]④MOVsegreg,mem/reg;

存儲(chǔ)單元/寄存器送段寄存器⑤MOVmem/reg,segreg;

段寄存器送存儲(chǔ)單元/寄存器段寄存器CS、IP及立即數(shù)不能作為目標(biāo)操作數(shù);兩個(gè)存儲(chǔ)單元之間不允許直接傳送數(shù)據(jù);立即數(shù)不能直接傳送到段寄存器;兩個(gè)段寄存器之間不能直接傳送數(shù)據(jù)。幾個(gè)不能傳送的解決辦法:用AX作橋梁

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

MOVAX,MEM1 MOVMEM2,AX段寄存器←段寄存器:

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

MOVAX,DATA MOVDS,AX應(yīng)用舉例:將1000H開始的100個(gè)存儲(chǔ)單元全部填充為ASCII碼2AH(*)。程序段如下:

MOVDI,1000HMOVCX,64HMOVAL,2AHAGAIN:MOV[DI],ALINCDIDECCXJNZAGAINHLT寫入2AH(*)后,數(shù)據(jù)段中相應(yīng)存儲(chǔ)單元的內(nèi)容改變?nèi)缦拢篋S:10002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10102A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10202A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10302A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10402A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10502A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10602A2A2A2A堆棧操作指令

什么是堆棧?按“后進(jìn)先出(LIFO)”方式工作的存儲(chǔ)區(qū)域。堆棧以字為單位進(jìn)行壓入彈出操作。為什么要設(shè)置堆棧?為什么要按“后進(jìn)先出”方式工作?36主程序IP繼續(xù)執(zhí)行主程序執(zhí)行子程序轉(zhuǎn)子程序壓棧彈出返回主程序主程序IPIP(下)繼續(xù)執(zhí)行主程序轉(zhuǎn)子程序1返回主程序IP’執(zhí)行子程序2轉(zhuǎn)子程序2返回子程序1IP’(下)執(zhí)行子程序1繼續(xù)執(zhí)行子程序1(a)(b)子程序調(diào)用示意圖(a)主程序調(diào)子程序;(b)子程序嵌套示意圖壓棧彈出IP(下)規(guī)定由SS指示堆棧段的段基址,堆棧指針SP始終指向堆棧的頂部,SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的最高地址叫棧底。SPSS堆棧段進(jìn)棧方向退棧方向棧底棧頂①壓棧指令

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)=1020(SP)存儲(chǔ)區(qū)(SS段)進(jìn)棧方向執(zhí)行后2010(AL)(AH)2-8PUSHAX指令執(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í)行示意圖如下圖所示低地址存儲(chǔ)區(qū)(SS段)出棧方向執(zhí)行前2010POPBX指令執(zhí)行示意圖(SP)存儲(chǔ)區(qū)(SS段)執(zhí)行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址堆棧指令使用時(shí)應(yīng)注意幾點(diǎn):①堆棧操作總是按字進(jìn)行②不能從棧頂彈出一個(gè)字給CS③堆棧指針為SS:SP,SP永遠(yuǎn)指向棧頂④SP自動(dòng)進(jìn)行增減量(-2,+2)PUSH

DSPUSH

ES……POPESPOPDS格式:XCHGmem/reg,mem/reg功能:交換兩操作數(shù)的內(nèi)容。要求:兩操作數(shù)中必須有一個(gè)在寄存器中;操作數(shù)不能為段寄存器和立即數(shù);源和目地操作數(shù)類型要一致。舉例:XCHG AL,BLXCHG AX,BXXCHG [2000H],CLXCHG [2530H],CX交換指令XCHG又如:假設(shè)數(shù)據(jù)表放在偏移地址為2000H開始的內(nèi)存中,取出“3”所對(duì)應(yīng)的七段碼,用如下幾條程序來完成:

MOVBX,2000HMOVAL,3XLAT5.2.2目標(biāo)地址傳送指令LEAreg,mem;

將指定存儲(chǔ)器的16位偏移地址送指定寄存器LDSreg,mem32; DS:reg←(mem開始的四個(gè)內(nèi)存單元)LESreg,mem32;

同上,但DS改為ES

要求源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù),目的操作數(shù)必須是一個(gè)16位的通用寄存器。注意以下兩條指令差別:

LEABX,BUFFER

MOVBX,BUFFER前者表示將符號(hào)地址為BUFFER的存儲(chǔ)單元的偏侈地址取到BX中;后者表示將BUFFER存儲(chǔ)單元中的內(nèi)容取到BX中.LEA

AX,[2728];將2728單元的偏移量

送AX,指令執(zhí)行后,AX中為2728

LEA

BX,[BP+SI];指令執(zhí)行后, BX中的內(nèi)容為BP+SI的值LEA

SP,[0482];使堆棧指針SP為482前提條件:設(shè)2130H~2133H這4個(gè)單元中存放著一個(gè)地址,2130H和2131H中為地址的偏移量,2132H和2133H中為地址的段值指令執(zhí)行結(jié)果:使2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到DS。LDSDI,[2130H];LESDI,[2130H];指令執(zhí)行結(jié)果:使2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到ES。5.2.4標(biāo)志傳送指令(1)讀標(biāo)志指令LAHF

LAHF把標(biāo)志寄存器低8位中的5個(gè)標(biāo)志位傳送到AH中的指定位,如下圖所示:OFDFIFTFSFZFAFPFCFAHLAHF指令的功能FLAG(2)設(shè)置標(biāo)志指令SAHF

SAHF的功能與LAHF的功能正好相反,用圖來示意,只要將上圖中5個(gè)箭頭方向反一下即可。OFDFIFTFSFZFAFPFCFAHSAHF指令的功能FLAG

執(zhí)行的操作:(SP)-1←標(biāo)志寄存器高8位

(SP)-2←標(biāo)志寄存器低8位

(SP)←(SP)-2(4)從棧頂彈出標(biāo)志寄存器指令POPF

執(zhí)行的操作:標(biāo)志寄存器低8位←(SP)

標(biāo)志寄存器高8位←(SP)+1

(SP)←(SP)+2PUSHF和POPF指令用于保護(hù)和恢復(fù)標(biāo)志寄存器內(nèi)容。(3)把標(biāo)志寄存器推入棧頂指令PUSHF例如:

PUSH AXPUSH CXPUSHF;保護(hù)標(biāo)志寄存器內(nèi)容

;這段程序要用到AX,CX以及標(biāo)志位

POPF ;恢復(fù)標(biāo)志寄存器內(nèi)容

POP CXPOP AX數(shù)據(jù)傳送指令中,除SAHF和POPF這兩條指令外,其余所有指令均不影響標(biāo)志位。5.2.4輸入輸出數(shù)據(jù)傳送指令只限于用累加器AL或AX來傳送信息。功能:(累加器)←→I/O端口(1)輸入指令I(lǐng)N

INacc,PORT;PORT端口號(hào)0~255

INacc,DX;DX表示的端口范圍達(dá)64K例:INAL,50H;(AL)←(50H端口)

INAL,DX;(AL)←((DX))

IN

AX,70H

;(AX)←(70H、71H端口)IN

AX,DX

;(AX)←((DX)、(DX+1))例:OUT68H,AX;(69H,68H)←(AX)

OUTDX,AL;((DX))←(AL)在使用間接尋址的IN/OUT指令時(shí),要事先用傳送指令把I/O端口號(hào)設(shè)置到DX寄存器,如:MOVDX,220HINAL,DX;將220H端口內(nèi)容讀入AL格式:OUTport,acc

OUTDX,acc5.3數(shù)據(jù)操作類指令十進(jìn)制調(diào)整

除法

乘法

加法

減法5.3.1算術(shù)操作類5.3.1算術(shù)運(yùn)算類指令

涉及兩種類型數(shù)據(jù):無符號(hào)數(shù)和有符號(hào)數(shù)。對(duì)加減法指令,無符號(hào)和有符號(hào)數(shù)可采用同一套指令,但應(yīng)注意:參加的操作數(shù)必須都是無符號(hào)數(shù)或都是有符號(hào)數(shù)。需使用不同的標(biāo)志位來檢查無符號(hào)數(shù)和有符號(hào)數(shù)的運(yùn)算結(jié)果是否溢出。(1)不帶進(jìn)位的加法指令A(yù)DD

格式:ADD acc,dataADD mem/reg,dataADD

mem/reg1,mem/reg2例:ADD AL,50HADD CX,1000H ADD DX,SI ADD [BX+DI],AXADD AX,[BX+2000H]ADD指令對(duì)標(biāo)志位(指狀態(tài)標(biāo)志)都有影響。5.3.1.1加法指令(2)帶進(jìn)位位的加法指令A(yù)DCADC指令在形式上和功能上都有與ADD類似,只是相加時(shí)還要包括進(jìn)位標(biāo)志CF的內(nèi)容,例如:

ADCAX,SI;AX←(AX)+(SI)+(CF) ADCDX,[SI]; DX←(DX)+[SI+1][SI]+(CF)ADC[BX+DI],AX;[BX+DI+1][BX+DI]← [BX+DI+1][BX+DI]+AX+(CF)ADCAL,5;AL←(AL)+5+(CF)例:有兩個(gè)4字節(jié)的無符號(hào)數(shù)相加:

2C56F8AC+309E47BE=?設(shè)被加數(shù)、加數(shù)分別存放在BUFFER1及BUFFER2開始的兩個(gè)存儲(chǔ)區(qū)內(nèi),結(jié)果放回BUFFER1存儲(chǔ)區(qū),如下頁圖所示。因CPU只能進(jìn)行8位或16位的加法運(yùn)算,為此可將加法分4次進(jìn)行。ADC指令主要用于多字節(jié)加法運(yùn)算中56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加數(shù)加數(shù)數(shù)據(jù)段多字節(jié)加法示意圖......程序段如下:

MOVCX,4;置循環(huán)次數(shù)

MOVSI,0;置SI初值為零

CLC;清進(jìn)位標(biāo)志CFLL:MOV AL,BUFFER2[SI] ADC BUFFER1[SI],AL;帶進(jìn)位加

INC SI;(SI)+1DEC CX;(CX)-1JNZLL;若(CX)0,則轉(zhuǎn)LL思考:若最高位有進(jìn)位,如何改?格式:INCreg/mem功能:類似于C語言中的++操作:對(duì)指定的操作數(shù)加1例:INCALINCSIINCBYTEPTR[BX+4]注:本指令不影響CF標(biāo)志。3)加1指令I(lǐng)NC(單操作數(shù)指令)ADD/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=5.3.1.2減法指令(1)不考慮借位的減法指令SUB格式:

SUBdest,src操作:dest←(dest)-(src)注:1.源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)

2.立即數(shù)不能作為目的操作數(shù)指令例子:

SUB

BX,CX; SUB[BP+2],CL; SUB

AL,20; SUB

SI,5010H; SUB

WORDPTR[DI],1000H;SBB指令主要用于多字節(jié)的減法。格式:SBBdest,src操作:dest←(dest)-(src)-(CF)指令例子:SBBAX,CX;SBBWORDPTR[SI],2080H;SBB[SI],DX; SBB

AX,2030H; SBB

WORDPTR[DI+2],1000H;例:x、y、z均為32位數(shù),這三個(gè)數(shù)的低16位和高16位分別存放在地址為X,X+2;Y,Y+2;Z,Z+2的存儲(chǔ)單元中。用指令序列實(shí)現(xiàn)wx+y+24-z,結(jié)果放在W,W+2單元中。MOVAX,[X]MOVDX,[X+2]ADDAX,[Y];x和y的低16位相加,結(jié)果存入AXADCDX,[Y+2];x和y的高16位相加,結(jié)果存入DXADDAX,24ADCDX,0;x+y+24SUBAX,[Z]SBBDX,[Z+2];x+y+24-zMOV[W],AXMOV[W+2],DX;結(jié)果存入W,W+2單元作用類似于C語言中的”--”操作符。格式:DECopr 操作:opr←(opr)-1指令例子:DECCLDECBYTEPTR[DI+2]

DECSI(3)減1指令DEC格式:NEGopr操作:opr←0-(opr)對(duì)一個(gè)操作數(shù)取補(bǔ)碼相當(dāng)于用0減去此操作數(shù),故利用NEG指令可得到負(fù)數(shù)的絕對(duì)值。例:若(AL)=0FCH,則執(zhí)行NEGAL 后,

(AL)=04H,CF=1本例中,0FCH為-4的補(bǔ)碼,執(zhí)行求補(bǔ)指令后,即得到4(-4的絕對(duì)值)。(4)求補(bǔ)指令NEGSUB/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=格式:CMPdest,src操作:(dest)-(src)CMP也是執(zhí)行兩個(gè)操作數(shù)相減,但結(jié)果不送目標(biāo)操作數(shù),其結(jié)果只反映在標(biāo)志位上。指令例子:CMPAL,0AHCMPCX,SICMPDI,[BX+03](5)比較指令CMP根據(jù)標(biāo)志位來判斷比較的結(jié)果1)根據(jù)ZF判斷兩個(gè)數(shù)是否相等。若ZF=1,則兩數(shù)相等。2)若兩個(gè)數(shù)不相等,則分兩種情況考慮:①比較的是兩個(gè)無符號(hào)數(shù)若CF=0,則dest>src;若CF=1,則dest<src。②比較的是兩個(gè)有符號(hào)數(shù)若OF⊕SF=0,則dest>src;

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

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

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

BBB:CMPAL,CL;AL和CL比較

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

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

CCC:HLT5.3.1.3乘法指令進(jìn)行乘法時(shí):8位*8位→16位乘積 16位*16位→32位乘積(1)無符號(hào)數(shù)的乘法指令MUL(MEM/REG)格式:MULsrc操作:字節(jié)操作數(shù)(AX)(AL)×(src)字操作數(shù)(DX,AX)(AX)×(src)指令例子:MULBL;(AL)×(BL),乘積在AX中

MULCX;(AX)×(CX),乘積在DX,AX中格式與MUL指令類似,只是要求兩操作數(shù)均為有符號(hào)數(shù)。 IMULBL;(AX)←(AL)×(BL)IMULWORDPTR[SI];(DX,AX)←(AX)×([SI+1][SI])

(2)有符號(hào)數(shù)乘法指令I(lǐng)MUL注意:MUL/IMUL指令中

●AL(AX)為隱含的乘數(shù)寄存器;

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

SRC不能為立即數(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)=F9F5HCF=OF=1(2)MULBL;(AX)(AL)×(BL) ;A5×11=0AF5 ;(AX)=0AF5HCF=OF=15.3.1.4除法指令進(jìn)行除法時(shí):16位/8位→8位商

32位/16位→16位商對(duì)被除數(shù)、商及余數(shù)存放有如下規(guī)定:

被除數(shù) 商 余數(shù)字節(jié)除法AX AL AH字除法 DX:AX AX DX無符號(hào)除法DIV格式:DIVsrc操作:字節(jié)操作(AL)(AX)/(SRC)的商

(AH)(AX)/(SRC)的余數(shù)

字操作(AX)(DX,AX)/(SRC)的商

(DX)(DX,AX)/(SRC)的余數(shù)指令例子:DIVCLDIVWORDPTR[BX]注:若除數(shù)為零或AL中商大于FFH(或AX中商大于FFFFH),則CPU產(chǎn)生一個(gè)類型0的內(nèi)部中斷。有符號(hào)數(shù)除法指令I(lǐng)DIV格式:IDIVsrc操作與DIV類似。商及余數(shù)均為有符號(hào)數(shù),且余數(shù)符號(hào)總是與被除數(shù)符號(hào)相同。注意:對(duì)于DIV/IDIV指令A(yù)X(DX,AX)為隱含的被除數(shù)寄存器。

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

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

src不能為立即數(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ò)展??墒褂们懊娼榻B過的符號(hào)擴(kuò)展指令CBW和CWD關(guān)于除法操作中的字長擴(kuò)展問題(5)字節(jié)-字轉(zhuǎn)換指令格式:CBW;把AL的符號(hào)位復(fù)制到AHCWD;把AX的符號(hào)位復(fù)制到DX用途:用于有符號(hào)數(shù)的除法。例如:(AL)=A7H,則執(zhí)行CBW后,AH的內(nèi)容為FFH。例:寫出34H÷25H的程序段。

MOVAL,34HMOVBL,25HCBW;AL的符號(hào)擴(kuò)展到AHIDIVBL;0034H÷25H,結(jié)果為

;(AH)=0FH, (AL)=01H*5.BCD碼運(yùn)算的十進(jìn)制調(diào)整指令專用于對(duì)BCD碼運(yùn)算的結(jié)果進(jìn)行調(diào)整包括:AAA、DAA、AAS、DAS、AAM、AAD均為隱含尋址,隱含的操作數(shù)為AL和AH為何要對(duì)BCD碼的運(yùn)算結(jié)果進(jìn)行調(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)加法的十進(jìn)制調(diào)整指令(1)非壓縮BCD碼加法調(diào)整AAA本指令對(duì)在AL中的由兩個(gè)未組合的BCD碼相加后的結(jié)果進(jìn)行調(diào)正,得到一個(gè)正確的未組合的BCD碼。AAA指令只影響AF和CF,其余標(biāo)志無定義。AAA指令應(yīng)緊跟在ADD或ADC指令之后。如果AL的低4位>9∨AF=1,則:

①AL←(AL)+6,(AH)←(AH)+1,AF←1②AL←((AL)∧0FH)③CF←AF否則AL←(AL)∧0FHAAA指令的操作如下:調(diào)整原理:先看一個(gè)例子計(jì)算8+9

00001000

見右式

+00001001

00010001=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。實(shí)際上當(dāng)?shù)?位的結(jié)果>9(即A~F之間)時(shí),也應(yīng)進(jìn)行加6調(diào)正(原因是逢十沒有進(jìn)位,故用加6的方法強(qiáng)行產(chǎn)生進(jìn)位)。如對(duì)上例的結(jié)果進(jìn)行加6:0001000111

+00000110

60000011117

^00001111----------------------100001111(2)壓縮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除OF外,DAA指令影響所有其它標(biāo)志。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(1)非壓縮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)∧0FH2)減法的十進(jìn)制調(diào)整指令舉例:16-8=?

MOVAX,0106H0000011006MOVBL,08H-00001000

-08SUBAL,BL 11111110FEAAS-00000110

-0611111000F8

∧00001111

∧0F0000100008結(jié)果為:(AL)=08H,(AH)=0,CF=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

DAS對(duì)OF無定義,但影響其余標(biāo)志位。DAS指令要求跟在減法指令之后。3)乘法的十進(jìn)制調(diào)正指令A(yù)AM對(duì)AX中由兩個(gè)非壓縮BCD碼相乘的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:(AL)/0AH,(AH)←商,(AL)←余數(shù)隱含的操作寄存器為AL和AH;AAM跟在MUL指令之后使用;影響標(biāo)志位PF、SF、ZF,其它無定義;用AAM可實(shí)現(xiàn)≤99的二-十進(jìn)制轉(zhuǎn)換。例1:按十進(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碼。例2:把3AH轉(zhuǎn)換成等值的十進(jìn)制數(shù)。

MOVAL,3AH;58AAM;(AH)=05H,(AL)=08H4)除法的十進(jìn)制調(diào)正指令A(yù)AD對(duì)非壓縮BCD除法運(yùn)算進(jìn)行調(diào)整。調(diào)整操作為:(AL)←(AH)×0AH+(AL)

AH←0隱含的操作寄存器為AH,AL;AAD要在DIV指令之前使用;影響標(biāo)志位PF、SF、ZF,其它無定義;用AAD可實(shí)現(xiàn)≤99的十-二進(jìn)制轉(zhuǎn)換。例1:按十進(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)。例2:把73轉(zhuǎn)換成等值的二進(jìn)制數(shù)。

MOVAX,0703H;(AX)=73BCDAAD;(AX)=0049H5.3.2邏輯運(yùn)算和移位指令邏輯運(yùn)算指令●運(yùn)算規(guī)則:按位操作,無進(jìn)/借位

●對(duì)標(biāo)志位的影響(除NOT指令外):

CFOFSFZFPFAF00***無定義

根據(jù)運(yùn)算結(jié)果設(shè)置(1)邏輯”與”AND對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯“與”操作。格式:ANDdest,src用途:保留操作數(shù)的某幾位,清零其他位。例1:保留AL中低4位,高4位清0。ANDAL,0FH例2:AL中有字符’a’~’z’,將其轉(zhuǎn)換成大寫。

ANDAL,01011111B例3:測試AL的bit7,bit5,bit2是否都是1。

ANDAL,10100100B CMPAL,10100100B

JZYES;ifmatch,gotoYES……;ifnotmatch

…YES:……;goeshereifall‘1’對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯”或”操作。格式:ORdest,src用途:對(duì)操作數(shù)的某幾位置1;對(duì)兩操作數(shù)進(jìn)行組合。例1:把AL中的非壓縮BCD碼變成相應(yīng)十進(jìn)制數(shù)的ASCII碼。

ORAL,30H(2)邏輯”或”O(jiān)R例2:把AH和AL中的非壓縮BCD碼組合成壓縮的BCD碼,放到AL中。

MOVCL,4SHLAH,CLORAL,AH例3:把AL的第5位置為1ORAL,00100000B對(duì)操作數(shù)進(jìn)行按位邏輯”非”操作。格式:NOTmem/reg例:NOTCX

NOTBYTEPTR[DI](3)邏輯“非”(取反)NOT對(duì)兩個(gè)操作數(shù)按位進(jìn)行”異或”操作。格式:XORdest,src用途:對(duì)reg清零(自身異或)

把reg/mem的某幾位變反(與’1’異或)例1:把AX寄存器清零。例2:把DH的bit4,3變反①M(fèi)OVAX,0XORDH,18H②XORAX,AX③ANDAX,0④SUBAX,AX(4)邏輯”異或”XOR

操作與AND指令類似,但不將”與”的結(jié)果送回,只影響標(biāo)志位。TEST指令常用于位測試,與條件轉(zhuǎn)移指令一起用。例:測試AL的內(nèi)容是否為負(fù)數(shù)。TESTAL,80H;檢查AL中D7=1? JNZMINUS;是1(負(fù)數(shù)),轉(zhuǎn)MINUS

;否則(正數(shù))不轉(zhuǎn)移MINUS:…

…(5)測試指令TEST2.移位指令(1)非循環(huán)移位指令算術(shù)左移指令SAL(ShiftArithmeticLeft)算術(shù)右移指令SAR(ShiftArithmeticRight)邏輯左移指令SHL(ShiftLeft)邏輯右移指令SHR(ShiftRight)這4條指令的格式相同,以SAL為例: SALmem/reg,CL;移位位數(shù)大于1時(shí)1;移位位數(shù)等于1時(shí)移位指令執(zhí)行的操作如下圖所示:最低位最高位CF0(a)算術(shù)/邏輯左移SAL/SHL最低位最高位CF(b)算術(shù)右移SAR最低位最高位CF(c)邏輯右移SHR0非循環(huán)移位指令功能示意圖算術(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=10x不含進(jìn)位位的循環(huán)左移指令ROL 不含進(jìn)位位的循環(huán)右移指令ROR含進(jìn)位位的循環(huán)左移指令RCL 含進(jìn)位位的循環(huán)右移指令RCR格式同非循環(huán)移位指令。移位位數(shù)放在CL寄存器中,如果只移1位,也可以直接寫在指令中。循環(huán)移位指令只影響標(biāo)志位CF和OF。(2)循環(huán)移位指令這4條指令的功能如下圖示:最低位最高位CF(a)ROL最低位最高位CF(c)RCL最低位最高位CF(b)ROR最低位最高位CF(d)RCR循環(huán)移位指令功能示意圖用移位操作代替乘除法可提高運(yùn)算速度例:前例中計(jì)算x×10。(1)采用乘法指令:

MOV BL,10MUL BL 共需70~77個(gè)T周期。(2)采用移位和加法指令:

SAL AL,1;2TMOV AH,AL;2TSAL AL,1;2TSAL AL,1;2TADD AL,AH;3T只需11個(gè)T周期,僅相當(dāng)于乘法的1/7。循環(huán)移位舉例:例1:將AL的高4位與低4位互換。

MOVCL,4ROLAL,CL例2:將1A00H內(nèi)存單元中的雙字循環(huán)左移1位。

CMP[1A00H],8000HCMCRCLWORDPTR[1A02H],1RCLWORDPTR[1A00H],1例:設(shè)在1000H開始存有四個(gè)壓縮的BCD碼12、34、56、78。要求把它們轉(zhuǎn)換為ASCII碼存放在3000H開始的單元中。假定DS、ES都已設(shè)置為數(shù)據(jù)段的段基址。程序見下頁。1000H3000H1234567832H31H34H33H36H35H38H37H

MOVSI,1000H ;SI←BCD首址

MOVDI,3000H ;DI←ASCII首址

MOVBX,4 ;置計(jì)數(shù)器初值BBB:MOVAL,[SI];AL←BCD碼,第一次取12HANDAL,0FH ;屏蔽高4位→02H

ORAL,30H ;轉(zhuǎn)換為ASCII碼→32H

STOSB;保存結(jié)果LODSBMOVCL,4SHRAL,CL;邏輯右移4位ORAL,30H;得到高4位ASCII碼STOSB;保存結(jié)果DECBX ;(BX)←(BX)-1JNZBBB ;(BX)≠0,則繼續(xù)循環(huán)作業(yè)P152-P1533.1、3.2、3.7、3.9、3.13、3.163.3.4串操作指令串:順序放在內(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ǔ)單元之間的傳送和比較操作(也僅是串指令可以)重復(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í)行串指令使用的一般方法設(shè)置源串地址設(shè)置目標(biāo)串地址設(shè)置串長度設(shè)置操作方向DF串指令MOVSI,源串首地址(或LEASI,源串)MOVDI,目的串首地址(或LEADI,目的串)MOVCX,串長度CLD(或STD)《串指令》串傳送指令MOVSB/MOVSW指令執(zhí)行的操作為:MOVSB:((ES):(DI))←((DS):(SI))

SI±1,DI±1

MOVSW:((ES):(DI+1)(DI))←((DS):(SI+1)(SI))

SI±2,DI±2

指令也可寫成:MOVSdest,src但要求:①src用DS:SI尋址,dest用ES:DI尋址②傳送是字節(jié)還是字,由操作數(shù)的類型決定串傳送指令使用舉例用串傳送指令實(shí)現(xiàn)200個(gè)字節(jié)的數(shù)據(jù)傳送:LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPMOVSBHLT串比較指令CMPSB/CMPSW指令執(zhí)行的操作為:CMPSB:((DS):(SI))-((ES):(DI))

SI±1,DI±1

CMPSW:((DS):(SI+1)(SI))-((ES):(DI+1)(DI))

SI±2,DI±2指令也可寫成:CMPSdest,src比較的結(jié)果只反映在標(biāo)志位上,串本身無變化。本指令可用來檢查兩個(gè)串是否相等。執(zhí)行的操作:對(duì)字節(jié):(AL)-((ES):(DI))

DI±1對(duì)字:(AX)-((ES):(DI+1)(DI))

DI±2搜索指令執(zhí)行的仍是比較(減法)操作,結(jié)果只影響標(biāo)志位。要搜索的關(guān)鍵字放在AL(字節(jié))或AX(字)中。本指令用于在串中查找指定的信息。串掃描指令SCASB/SCASWSCAS指令加上重復(fù)前綴后,可對(duì)串進(jìn)行連續(xù)掃描比較:若前綴為REPZ,則表示比較結(jié)果相等且(ZF=1)且串未結(jié)束(CX≠0),則繼續(xù)比較。若前綴為REPNZ,則表示比較結(jié)果不相等(ZF=0)且串未結(jié)束(CX≠0)就繼續(xù)比較。例:在ES段的偏移1000H開始處存有10個(gè)ASCII碼。搜索’E’,若找到則記下搜索次數(shù)及存放地址,并在屏幕上顯示’Y’;若未找到則顯示’N’。(見右圖)在屏幕上顯示一個(gè)字符的指令段如下:(參見附錄C.3)MOVDL,<字符>MOVAH,2INT21H

實(shí)現(xiàn)題目要求的程序段見下頁:MOVDI,1000H;(DI)←串偏移地址MOVCX,0AH;(CX)←串長度

MOVAL,’E’ ;搜索關(guān)鍵字=’E’ CLD;從低地址到高地址進(jìn)行搜索REPNZSCASB;若未找到,繼續(xù)搜索

JZFOUND;找到,轉(zhuǎn)至FOUNDMOVDL,’N’;串中無’E’,(DL)←’N’JMPDONE;轉(zhuǎn)至DONEFOUND:DECDI;指針回退MOVADDR,DI;ADDR←’E’的地址

SUBDI,1000HMOVNUM,DI;NUM←搜索次數(shù)

MOVDL,’Y’;(DL)←’Y’DONE:MOVAH,2 INT21H;顯示字符HLT串裝入指令LODSB/LODSW執(zhí)行的操作為:對(duì)字節(jié):(AL)←((DS):(SI))SI±1對(duì)字:(AX)←((DS):(SI+1)(SI))

SI±2

串裝入指令通常不加重復(fù)前綴。LODSB等價(jià)于:LODSW等價(jià)于:

MOVAL,[SI]MOVAX,[SI]

INCSIINCSIINCSI36H32H39H31HSTRING1STRING238H35H36H33H被加數(shù)加數(shù)數(shù)據(jù)段‘8’‘5’‘6’‘2’‘9’‘1’‘6’‘3’SUM結(jié)果......07H07H02H06H下面要求將和的結(jié)果送顯示,為此,要先化成ASCII碼再送顯示,程序段如下:

LEASI,SUM+3;(SI)←SUM+3MOVCX,4;(CX)←和長度

STD ;置DF=1,減量修改SIMOVAH,02;(AH)←功能號(hào)LP:LODSB;取BCD碼至AL,且(SI)←(SI)-1ADDAL,30H;轉(zhuǎn)換為ASCII碼

MOVDL,AL ;(DL)←字符

INT21H;顯示字符DECCXJNZLP……串存儲(chǔ)指令STOSB/STOSW指令的操作為:對(duì)字節(jié):((ES):(DI))←(AL)DI±1

對(duì)字:((ES):(DI+1)(DI))←(AX)DI±2本指令用于把一塊存儲(chǔ)區(qū)域填充成某一初始值(即對(duì)存儲(chǔ)區(qū)進(jìn)行初始化)。存儲(chǔ)區(qū)域的首地址要預(yù)先設(shè)置到ES:DI中。要存儲(chǔ)到串中的數(shù)據(jù)要預(yù)先存到AL(AX)中。例1:把從A000H開始的2KB內(nèi)存單元清零。程序段如下:

MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW

例2:把1000H開始的100個(gè)存儲(chǔ)單元填入ASCII碼2AH(*)。程序段如下:

MOVDI,1000H;

首地址 MOVAL,2AH;‘*’ MOVCX,100;重復(fù)執(zhí)行100次 CLD;增量修改DI

REP STOSB5.5程序控制指令控制類指令包括程序轉(zhuǎn)移指令和處理機(jī)控制指令。凡屬能改變指令執(zhí)行順序的指令,統(tǒng)稱為程序轉(zhuǎn)移指令。86系列指令系統(tǒng)中,程序轉(zhuǎn)移指令可分成4種類型。轉(zhuǎn)移指令循環(huán)控制指令調(diào)用和返回指令中斷指令5.5.1轉(zhuǎn)移指令轉(zhuǎn)移指令的實(shí)質(zhì):改變IP(或CS)的內(nèi)容。所有轉(zhuǎn)移指令不會(huì)影響標(biāo)志位。分為無條件轉(zhuǎn)移和條件轉(zhuǎn)移兩種。(1)無條件轉(zhuǎn)移指令-JMP本指令無條件轉(zhuǎn)移到指定的目標(biāo)地址,以執(zhí)行從該地址開始的程序段。根據(jù)設(shè)置CS、IP的方法,JMP指令分成4種情況。

①段內(nèi)直接轉(zhuǎn)移:JMPdisp8/16位的位移量加到IP。CS保持不變。

②段內(nèi)間接轉(zhuǎn)移:JMPreg/mem 16位偏移地址送IP。CS保持不變。

③段間直接轉(zhuǎn)移JMPsegment:offset

16位的段和16位的偏移地址送到CS和IP。

④段間間接轉(zhuǎn)移JMPmem32 16位的段和16位的偏移地址送到CS和IP。轉(zhuǎn)移的目標(biāo)地址由指令直接給出。指令中給出的目標(biāo)地址實(shí)際上是一個(gè)相對(duì)于IP的位移量:位移量轉(zhuǎn)移范圍匯編語言中格式8位-128~+127JMPSHORTOPRD16位-32768~+32767JMPNEARPTROPRD例: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。

例:JMP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論