![第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第1頁](http://file4.renrendoc.com/view/6daeae8820367f710a07025abf04c8e8/6daeae8820367f710a07025abf04c8e81.gif)
![第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第2頁](http://file4.renrendoc.com/view/6daeae8820367f710a07025abf04c8e8/6daeae8820367f710a07025abf04c8e82.gif)
![第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第3頁](http://file4.renrendoc.com/view/6daeae8820367f710a07025abf04c8e8/6daeae8820367f710a07025abf04c8e83.gif)
![第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第4頁](http://file4.renrendoc.com/view/6daeae8820367f710a07025abf04c8e8/6daeae8820367f710a07025abf04c8e84.gif)
![第五講 86系列微型計(jì)算機(jī)指令系統(tǒng)_第5頁](http://file4.renrendoc.com/view/6daeae8820367f710a07025abf04c8e8/6daeae8820367f710a07025abf04c8e85.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 彩鋼房屋維修工程承包合同7篇
- 2025年沈陽航空職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年江西外語外貿(mào)職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 生產(chǎn)設(shè)備采購合同
- 簡單產(chǎn)品購銷的合同范本
- 清潔生產(chǎn)技術(shù)服務(wù)合同書模板
- 考核目標(biāo)的挑戰(zhàn)性與可衡量性
- 抵押和借款合同
- 住房裝修合同范本
- 酒店單位合同協(xié)議書
- 充電樁知識(shí)培訓(xùn)課件
- 2025年七年級(jí)下冊道德與法治主要知識(shí)點(diǎn)
- 2025年交通運(yùn)輸部長江口航道管理局招聘4人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀
- 偏癱足內(nèi)翻的治療
- 藥企質(zhì)量主管競聘
- 信息對(duì)抗與認(rèn)知戰(zhàn)研究-洞察分析
- 手術(shù)室??谱o(hù)士工作總結(jié)匯報(bào)
- 2025屆高三聽力技巧指導(dǎo)-預(yù)讀、預(yù)測
- 四年級(jí)下冊部編版語文教學(xué)參考教師用書
- 月球基地建設(shè)與運(yùn)行管理模式
評(píng)論
0/150
提交評(píng)論