尋址方式與指令系統(tǒng)構(gòu)成_第1頁(yè)
尋址方式與指令系統(tǒng)構(gòu)成_第2頁(yè)
尋址方式與指令系統(tǒng)構(gòu)成_第3頁(yè)
尋址方式與指令系統(tǒng)構(gòu)成_第4頁(yè)
尋址方式與指令系統(tǒng)構(gòu)成_第5頁(yè)
已閱讀5頁(yè),還剩186頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《微機(jī)原理與接口技術(shù)》

輔助教學(xué)電子課件

第三章

尋址方式和指令系統(tǒng)一、指令與指令系統(tǒng)指令:控制計(jì)算機(jī)完成某種操作的命令指令系統(tǒng):處理器所能識(shí)別的所有指令的集合指令的兼容性:同一系列機(jī)的指令都是兼容的。二、指令格式指令中應(yīng)包含的信息:運(yùn)算數(shù)據(jù)的來(lái)源運(yùn)算結(jié)果的去向執(zhí)行的操作指令碼的格式:指令碼由操作碼和操作數(shù)字段兩部分組成。操作碼指示該指令執(zhí)行的操作。操作數(shù)字段指示操作數(shù)的類(lèi)型和操作數(shù)的尋址方式。操作碼操作數(shù)…操作數(shù)操作碼字段操作數(shù)字段操作碼說(shuō)明計(jì)算機(jī)要執(zhí)行哪種操作,如傳送、運(yùn)算、移位、跳轉(zhuǎn)等操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對(duì)象有些指令不需要操作數(shù),通常的指令都有一個(gè)或兩個(gè)操作數(shù),也有個(gè)別指令有3個(gè)甚至4個(gè)操作數(shù)3.18086/8088系統(tǒng)的尋址方式8086/8088指令系統(tǒng)操作數(shù)的種類(lèi)分為兩大類(lèi):3.1.1操作數(shù)的種類(lèi)數(shù)據(jù)操作數(shù)轉(zhuǎn)移地址操作數(shù)數(shù)據(jù)操作數(shù)具體數(shù)值,也稱(chēng)立即數(shù)(im):操作數(shù)據(jù)在指令中。寄存器(reg):操作數(shù)存放在寄存器中。存儲(chǔ)器(mem):操作數(shù)存放在指定的存儲(chǔ)單元中。I/O端口:操作數(shù)來(lái)自或送到I/O端口。指令的執(zhí)行速度

對(duì)不同的操作數(shù),指令執(zhí)行的時(shí)間不同:存儲(chǔ)器

快!立即數(shù)寄存器轉(zhuǎn)移地址操作數(shù)指令操作的對(duì)象不是數(shù)據(jù),而是要轉(zhuǎn)移的目標(biāo)地址。要轉(zhuǎn)移的目標(biāo)地址包含在指令中,或存放在寄存器中,或存放在存儲(chǔ)單元中。對(duì)于轉(zhuǎn)移地址操作數(shù),其指令只有一個(gè)目標(biāo)操作數(shù),它是一個(gè)供程序轉(zhuǎn)移的目標(biāo)地址。尋址方式(AddressingMode)

指令中關(guān)于如何求出存放操作數(shù)有效地址的方法。有效地址EA(EffectiveAddress)根據(jù)尋址方式計(jì)算得到的地址。

3.1.2尋址方式(AddressingMode)操作數(shù)直接包含在指令中,緊跟在操作碼之后,作為指令的一部分,這種操作數(shù)稱(chēng)為立即數(shù)(im)立即數(shù)可以是8位(00H~FFH)也可以是16位(0000H~FFFFH)立即數(shù)尋址方式 (Immediateaddressing)例3.1

MOVBL,80H MOVAX,0102H指令執(zhí)行后的結(jié)果為:

BL=80H; AX=0102H立即數(shù)尋址方式只能作為源操作數(shù),主要用來(lái)給寄存器或存儲(chǔ)單元賦值。演示操作數(shù)存放在指令指定的寄存器(reg)中可以8位寄存器(reg8)

:AH、AL、BH、BL、CH、CL、DH、DL可以16位寄存器(reg16)

:AX、BX、CX、DX、SI、DI、SP、BP及CS、DS、SS、ES寄存器名表示其內(nèi)容(操作數(shù))寄存器尋址方式(Registeraddressing)例3.2

MOVCL,DL MOVAX,BX如果 DL=50H,BX=1234H,則執(zhí)行結(jié)果為:

CL=50H,AX=1234H演示存儲(chǔ)器尋址方式操作數(shù)在主存儲(chǔ)器中,用主存地址表示程序設(shè)計(jì)時(shí),8088采用邏輯地址表示主存地址段地址在默認(rèn)的或用段超越前綴指定的段寄存器中指令中只需給出操作數(shù)的偏移地址(有效地址EA)1.直接尋址方式2.寄存器間接尋址方式3.寄存器相對(duì)尋址方式4.基址變址尋址方式5.相對(duì)基址變址尋址方式存儲(chǔ)器尋址方式又分為操作數(shù)的有效地址EA直接在指令中給出用中括號(hào)包含有效地址,表達(dá)存儲(chǔ)單元的內(nèi)容直接尋址方式的操作數(shù)默認(rèn)在存儲(chǔ)器的數(shù)據(jù)段,即默認(rèn)的段寄存器是DS允許使用段超越前綴改變段寄存器。在操作數(shù)的前面寫(xiě)上段寄存器名,再加上冒號(hào)“:”。直接尋址方式(Directaddressing)例3.3

MOVAX,[2000H]EA=2000H,如果當(dāng)前DS=1492H,則操作數(shù)存儲(chǔ)單元的物理地址為: 14920H+2000H=16920H若 [16920]=9078H執(zhí)行結(jié)果為:AX=9078H

演示MOVAX,ES:[2000H] ;AX←ES:[2000H]例如: MOVAL,VALUE

MOVAL,[VALUE]VALUE也稱(chēng)為為存放操作數(shù)單元的符號(hào)地址。在用匯編語(yǔ)言編程時(shí),常用符號(hào)地址代替數(shù)值地址。有效地址在指令中指定的寄存器SI、DI、BX

或BP中,操作數(shù)本身在存儲(chǔ)器中。若指定的寄存器為:SI、DI、BX,默認(rèn)的段寄存器是DS若指定的寄存器是BP,默認(rèn)的段寄存器是SS寄存器間接尋址方式(Registerindirectaddressing)書(shū)寫(xiě)指令時(shí),用作間址的寄存器必須加上方括弧,以免與寄存器尋址方式混淆允許使用段超越前綴改變段寄存器例3.4: MOVAX,[SI]如果

DS=3000H,SI=2000H

物理地址=30000H+2000H=32000H若

[32000H]=4050H執(zhí)行結(jié)果為:

AX

=4050H又:

MOV[BP],AL如果 SS=5000H,BP=1000H

物理地址=50000H+1000H=51000H執(zhí)行結(jié)果為:

[51000H]=50HMOVAX,[BX] ;AX←DS:[BX]演示例:段超越

MOVES:[DI],AXMOVDX,DS:[BP]ADDAL,ES:[BX]SUBCS:[SI],AX寄存器相對(duì)尋址方式(Registerrelativeaddressing)有效地址EA是一個(gè)由指令中指定的8位或16位位移量disp(displacement)與基址或變址寄存器的內(nèi)容之和,即EA=SIDIBXBP+disp

8disp16若指令中指定的寄存器是SI,DI,BX,則存放操作數(shù)的段寄存器默認(rèn)為DS若指令中指定BP寄存器,則默認(rèn)的段寄存器應(yīng)SS允許段超越前綴改變默認(rèn)段寄存器。位移量可常用符號(hào)表示例3.5:如果

DS=3000H

,

BX=1000H

COUNT=1050H對(duì)于指令: MOVCX,[BX+COUNT]物理地址=30000H+1000H+1050H=32050H若 [32050H]=4030H執(zhí)行后: CX=4030H以下三種指令的形式皆允許,它們完全等價(jià):

MOVAL,[BP+TABLE] MOVAL,[BP]+TABLE MOVAL,TABLE[BP]演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]基址變址尋址方式

(Basedindexedaddressing)有效地址是由指令指定的一個(gè)基址寄存器BX或BP和一個(gè)變址寄存器SI或DI的內(nèi)容之和。即:SIDIBXBPEA=+若基址寄存器為BX,默認(rèn)的段寄存器為DS

若基址寄存器為BP,默認(rèn)的段寄存器為SS允許段跨越演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]例3.6:MOV[BX+DI],AX若DS=3000H,BX=1000H,DI=1100H則

EA=1000H+1100H=2100H物理地址=30000H+2100H=32100H若

AX=0050H則執(zhí)行結(jié)果為:[32100H]=0050H。指令:

MOVAH,[BP][SI]如果

BP=2000H,SI=1200H, SS=4000H物理地址=40000H+2000H+1200H=43200H若 [43200H]=56H則執(zhí)行結(jié)果為:

AH=56H基址變址相對(duì)尋址方式

(Relativeindexedaddressing)有效地址是指令中指定的8位或16位位移量(disp)與一個(gè)基址寄存器和一個(gè)變址寄存器的內(nèi)容之和。即:SIDI

BXBPEA=++disp8disp16當(dāng)基址寄存器為BX時(shí),默認(rèn)為DS段寄存器當(dāng)基址寄存器為BP時(shí),默認(rèn)為SS段寄存器。允許段超越。演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOVAX,[BX+SI+COUNT]MOVAX,COUNT[BX][SI]MOVAX,[BX+COUNT][SI]MOVAX,[BX]COUNT[SI]MOVAX,[BX+SI]COUNTMOVAX,COUNT[SI][BX]基址加變址相對(duì)尋址方式的不同的書(shū)寫(xiě)形式:例3.7

MOVAX,MASK[BX][SI]如果

DS=3000H,BX=2000H, SI=1000H,MASK=0520H物理地址 =30000H+2000H+1000H+0520H =33520H若 [33520]=1234H執(zhí)行結(jié)果為

AX=1234H

3.28086的匯編指令系統(tǒng)數(shù)據(jù)傳送指令位操作指令程序控制指令8086的指令系統(tǒng)包括100多條指令,可分為以下六種類(lèi)型:算術(shù)運(yùn)算指令串操作指令處理器控制指令格式:MOVDST,SRC操作:dst←srcdst表示目的操作數(shù),src表示源操作數(shù)。MOV指令可以是字節(jié)(8位)操作,也可以是字(16位)操作。3.2.1數(shù)據(jù)傳送指令MOV(Move)數(shù)據(jù)傳送指令演示例:MOVAX,05H

;字操作

MOVBL,’A’

;字節(jié)操作不允許dst與src同時(shí)皆為‘mem’操作數(shù)目的操作數(shù)dst不允許是立即數(shù)‘im’、段寄存器‘CS’和‘IP’不允許將立即數(shù)直接傳送給段寄存器‘MOV’指令不影響標(biāo)志位。dst,src的具體格式為:dst

src說(shuō)明reg1reg2reg1不能是IP與CSregimreg不能是CS,DS,ES,SS和IPmimregmemreg不能是CS與IPmreg表中:reg為寄存器操作數(shù),mem代表存儲(chǔ)器操作數(shù),im代表立即數(shù)。例:合法指令 MOV[BX],AX MOVAX,DATA_SEG MOVDS,AX MOVAX,COUNT[BX][SI] MOVAL,‘E’ MOV[SI],DS

MOVAX,DS ;AX←DS MOVES,AX ;ES←AX←DS對(duì)段寄存器的操作不靈活MOV指令--立即數(shù)傳送mov

cl,4 ;cl←4,字節(jié)傳送mov

dx,0ffh ;dx←00ffh,字傳送mov

si,200h ;si←0200h,字傳送mov

bvar,0ah ;字節(jié)傳送;假設(shè)bvar是一個(gè)字節(jié)變量,定義如下:bvardb0mov

wvar,0bh ;字傳送;假設(shè)wvar是一個(gè)字變量,定義如下:wvar

dw0明確指令是字節(jié)操作還是字操作以字母開(kāi)頭的常數(shù)要有前導(dǎo)0MOV指令--寄存器傳送movah,al ;ah←al,字節(jié)傳送mov

bvar,ch

;bvar←ch

,字節(jié)傳送movax,bx

;ax←bx,字傳送mov

ds,ax ;ds←ax,字傳送mov[bx],al ;[bx]←al,字節(jié)傳送寄存器具有明確的字節(jié)和字類(lèi)型MOV指令--存儲(chǔ)器傳送moval,[bx] ;al←ds:[bx]mov

dx,[bp] ;dx←ss:[bp+0]mov

dx,[bp+4] ;dx←ss:[bp+4]mov

es,[si] ;es←ds:[si]不存在存儲(chǔ)器向存儲(chǔ)器的傳送指令MOV指令--段寄存器傳送mov[si],dsmovax,ds

;ax←dsmov

es,ax ;es←ax←ds對(duì)段寄存器的操作不靈活MOV指令的非法形式非法指令的主要現(xiàn)象:兩個(gè)操作數(shù)的類(lèi)型不一致無(wú)法確定是字節(jié)量還是字量操作兩個(gè)操作數(shù)都是存儲(chǔ)器段寄存器的操作有一些限制非法指令的主要現(xiàn)象:非法指令--兩個(gè)操作數(shù)類(lèi)型不一致非法指令:

moval,050ah修正:movax,050ah非法指令:

mov

si,dl修正:movdh,0

mov

si,dx在絕大多數(shù)雙操作數(shù)指令中,目的操作數(shù)和源操作數(shù)必須具有一致的數(shù)據(jù)類(lèi)型,或者同為字量,或者同為字節(jié)量,否則為非法指令非法指令--無(wú)法確定是字節(jié)量還是字量操作非法指令:mov[bx+si],255 修正: movbyteptr

[bx+si],255

;byteptr

說(shuō)明是字節(jié)操作 ;movwordptr

[bx+si],255

;wordptr

說(shuō)明是字操作當(dāng)無(wú)法通過(guò)任一個(gè)操作數(shù)確定是操作類(lèi)型時(shí),需要利用匯編語(yǔ)言的操作符顯式指明非法指令--兩個(gè)操作數(shù)都是存儲(chǔ)器

movbuf2,buf1 ;非法指令,修正:;假設(shè)buf2和buf1是兩個(gè)字變量;movax,buf1;movbuf2,ax;假設(shè)buf2和buf1是兩個(gè)字節(jié)變量;moval,buf1;movbuf2,al8088指令系統(tǒng)除串操作指令外,不允許兩個(gè)操作數(shù)都是存儲(chǔ)單元(存儲(chǔ)器操作數(shù))非法指令--段寄存器的操作有一些限制

mov

ds,es

;非法指令,修正:

;movax,es;mov

ds,ax

mov

ds,100h

;非法指令,修正:

;movax,100h;mov

ds,ax

mov

cs,[si]

;非法指令8088指令系統(tǒng)中,能直接對(duì)段寄存器操作的指令只有MOV等個(gè)別傳送指令,并且不靈活堆棧是一種按先進(jìn)后出的原則組織信息存取的特殊的存儲(chǔ)空間。用于存放暫時(shí)需要保存的數(shù)據(jù)8086系統(tǒng)的堆棧在存儲(chǔ)器中實(shí)現(xiàn)。8086系統(tǒng)堆棧的特點(diǎn):可以有多個(gè)堆棧,每個(gè)堆棧空間最大為64K。當(dāng)前正使用的堆棧稱(chēng)為現(xiàn)行堆棧。SS段寄存器存放現(xiàn)行堆棧的段基址。堆棧為16位寬,堆棧的存取操作總是以字為單位進(jìn)行。

堆棧向上生長(zhǎng)SP寄存器指示堆棧的頂部(當(dāng)堆棧中有信息時(shí))或底部(當(dāng)堆棧是空的)當(dāng)為空堆棧時(shí),SP指向棧底;當(dāng)要壓棧時(shí),先SP-2,然后將16位信息存入堆棧;當(dāng)要彈棧時(shí),先從棧頂取出16位信息,然后SP+2。·········SSSSSSSPSPSP6587658734123412空堆棧PUSHAX:(AX)=1234HPUSHBX:(AX)=8765HPOPAX格式: PUSHsrc操作: SP←SP-2 SS:[SP+1,SP]←srcPUSH(Pushontothestack)進(jìn)棧指令PUSH指令只允許是字(16位)操作src可以是reg16、mem,但不能是im例:合法指令

PUSHAXPUSHDSPUSH[BX]例:非法指令

PUSHAL ;不允許字節(jié)操作PUSH0FFA2H ;src不允許是im演示格式:POPdst操作:dst

←[SP+1,SP]

SP←SP+2POP指令只能字(16位)操作dst可以是mem,reg16,但不能是CS、IP、imPOP(Popfromstack)出棧指令PUSH,POP指令不影響標(biāo)志位例:合法指令 popax popwvar例:非法指令

popal

;al為reg8

popbvar

;bvar

為8位內(nèi)存操作數(shù)

popds

;dst為段寄存器演示格式:XCHGOPR1,OPR2操作:OPR1←→OPR2指令允許字或字節(jié)操作OPR1、OPR2是兩個(gè)操作數(shù)。它們可以是‘reg’或‘mem’,但二者中必有一個(gè)是寄存器不允許使用段寄存器和‘IP’不影響標(biāo)志位XCHG(Exchange)數(shù)據(jù)交換指令演示例3.8XCHGBX,[BP+SI]如指令執(zhí)行前

BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,[2F246H]=4154H。OPR2的物理地址=2F000H+0200H+0046H=2F246H則指令執(zhí)行后

BX=4154H,[2F246H]=6F30H格式:XLATsrc_table

或XLAT操作:AL←[BX+AL]

src_table是表格首地址(符號(hào)地址)XLAT(Translate)查表轉(zhuǎn)換指令XLAT指令用于查找代碼轉(zhuǎn)換前,預(yù)先要構(gòu)造一個(gè)字節(jié)表格表格的內(nèi)容是所要查找的代碼表格的首地址提前存入BX寄存器需要查找的代碼的序號(hào)是相對(duì)表格首地址的位移量,要提前存入AL寄存器中該指令執(zhí)行后可在AL中得到轉(zhuǎn)換后的代碼。演示指令XALT把

F0000+0040+0F=F004FH單元的內(nèi)容送AL寄存器執(zhí)行后

AL=2CH例3.9:

BX=0040H,AL=0FH,DS=F000H,所建表格如下圖:2C存儲(chǔ)器F0040HF004FH(BX)→(AL)=0FH···例3.10內(nèi)存數(shù)據(jù)段有一16進(jìn)制數(shù)的ASCII碼表,首地址為HEX-TABLE,如圖所示,欲查出第10個(gè)元素(元素序號(hào)從0開(kāi)始),即‘A’的ASCII碼。指令序列為:mov

bx,0ffsethex-table;(bx)←表首址moval,0ah;(al)←序號(hào)(位移量)xalthex-table;查表轉(zhuǎn)換執(zhí)行后,

al=41h

(‘A’的ASCII碼)‘’指令:

XLATHex_table執(zhí)行結(jié)果把‘A’的ASCII碼送入在AL中,即AL=41H存儲(chǔ)器30H(‘0’)31H(‘1’)39H(‘9’)41H(‘A’)46H(‘F’)Hex-tableHex-table+10Hex-table+9Hex-table+1Hex-table+15圖16進(jìn)制數(shù)的ASCII碼表··················IN(Input)輸入指令直接尋址方式格式: INAL,PORT;(字節(jié))

INAX,PORT;(字)操作:AL←[PORT] ;(字節(jié))AX←[PORT+1,PORT] ;(字)PORT是I/O端口地址(0~255)間接尋址方式格式: INAL,DX;(字節(jié))

INAX,DX;(字)操作: AL←[DX] ;(字節(jié)) AX←[DX+1,DX] ;(字) DX內(nèi)容是I/O端口地址(0~65535)OUT(Output)輸出指令直接尋址方式格式: OUTPORT,AL;(字節(jié)) OUTPORT,AX;(字)操作: [PORT]←AL

;(字節(jié))

[PORT+1,PORT]←AX

;(字)PORT是I/O端口地址(0~255)間接尋址方式格式:OUTDX,AL;(字節(jié))

OUTDX,AX;(字)操作:字節(jié) [DX]←AL字 [DX+1,DX]←AXDX內(nèi)容是I/O端口地址(0~65535)IN和OUT(輸入輸出)指令專(zhuān)用于CPU與外設(shè)(I/O端口)之間傳送信息。數(shù)據(jù)必須經(jīng)由累加器(AX或AL)傳送。直接尋址方式的指令只能尋址256個(gè)I/O端口(端口號(hào):0~255或0~FFH)。間接接尋址方式的指令可以尋址64K個(gè)I/O端口(端口號(hào):0~65535或0~FFFFH)。IN和OUT指令提供了字與字節(jié)兩種使用方式,選用哪一種,取決于外設(shè)端口的寬度。例3.11

inax,28h

mov

data_word,ax(把端口28h的內(nèi)容經(jīng)ax傳送到存儲(chǔ)單元data_word)

例3.12

mov

dx,3fch

inax,dx(從端口03fch取一個(gè)字送到ax寄存器)

例3.13

out5,al

(從al寄存器輸出一個(gè)字節(jié)到端口5)目的地址傳送指令LEA(Loadeffectiveaddress)取有效地址指令格式: LEAreg16,mem操作: 把源操作數(shù)的EA,傳送到目標(biāo)寄存器reg16

中源操作數(shù)mem必須是內(nèi)存操作數(shù)reg16必須是一個(gè)16位的通用寄存器例3.14

LEABX,BUFFER MOVBX,BUFFER

前者是把BUFFER的有效地址‘EA’傳送給BX,后者把存儲(chǔ)單元BUFFEER的內(nèi)容傳送給BX。例3.15

LEABX,MAX[BX][SI]若執(zhí)行前:

BX=0400H,SI=003CH,MAX=0F62H則

EA=0400+003C+0F62=139EH指令執(zhí)行后:

BX=139EHLES

(LoadESwithpointer)指針?biāo)虴S指令格式: LESreg16,mem32操作: reg16←[mem32] ES)←[mem32+2]LDS(LoadDSwithpointer)指針?biāo)虳S指令格式: LDSreg16,mem32操作: reg16←[mem32] DS←[mem32+2]源操作數(shù)mem32是32位的內(nèi)存操作數(shù)。目的操作數(shù)reg16是16位的通用寄存器。指令將源操作數(shù)指定的存儲(chǔ)器中的連續(xù)4字節(jié)傳送給指定的reg16和DS,低2位字節(jié)給reg16,高2位字節(jié)給DS。LEA、LDS、LES三條指令不影響標(biāo)志位。例3.17: LESDI,[BX]執(zhí)行前

DS=B000H,BX=O80AH,[B080AH]=05AEH,[B080CH]=4000H執(zhí)行后

DI=05AEH,ES=4000H例3.16

LDSSI,[10H]執(zhí)行前

DS=C000H,SI=0010H,[C0010H]=0180H,[C0012H]=2000H執(zhí)行后

SI=0180H,DS=2000H。標(biāo)志傳送指令LAHF(LoadAHwithflags)標(biāo)志送AH指令格式:LAHF操作:AH←FLAG的低字節(jié)位只傳送了SF、ZF、AF、PF、CF五個(gè)標(biāo)志位SAHF(StoreAHintoflags)AH送標(biāo)志寄存器格式:SAHF操作:FLAG的低字節(jié)←AH

PUSHF(Pushtheflags)標(biāo)志進(jìn)棧指令格式:PUSHF操作:SP←SP-2[SP+1,SP]←FLAGS格式:

POPF操作:

FLAG←[SP+1,SP] SP←SP+2POPF(Poptheflags)標(biāo)志出棧指令LAHF和PUSHF不影響標(biāo)志位SAHF和POPF由裝入的值來(lái)確定標(biāo)志位3.2.2算術(shù)指令加法指令A(yù)DD(add)加法格式:ADDdst,src操作:dst

←src+dstADC(addwithcarry)帶進(jìn)位加法格式:ADCdst,src操作:dst←src+dst+CFINC(increment)加1格式:INCdst操作:dst

←dst+1dst為寄存器或存儲(chǔ)器操作數(shù)。src是寄存器、存儲(chǔ)器操作數(shù)或立即數(shù)src和dst不能同為存儲(chǔ)器操作數(shù)不允許段寄存器參與運(yùn)算。允許字節(jié)操作或字操作。上述指令對(duì)條件標(biāo)志位產(chǎn)生影響,但I(xiàn)NC指令對(duì)CF位無(wú)影響。例如:

addcl,10

adc

dx,si addax,mem

adc

alpha[di],30h incsi以上指令皆合法。例3.18:

moval,7eh

mov

bl,5bh addal,bl執(zhí)行后, al=7eh+5bh=d9h各狀態(tài)標(biāo)志位為:SF=1,ZF=0,AF=1 PF=0,CF=0,OF=1例3.19:要求計(jì)算兩個(gè)多字節(jié)的16進(jìn)制數(shù)之和: 3B74AC60F8H+20D59E36C1H=?式中被加數(shù)和加數(shù)均有五個(gè)字節(jié),假設(shè)它們已分別存入從DATA1和DATA2開(kāi)始的兩個(gè)內(nèi)存區(qū),且均為低位字節(jié)在前,高位字節(jié)在后,如圖3.8所示。要求相加所得結(jié)果仍存回以DATA1為首址的內(nèi)存區(qū)。本例可用循環(huán)程序來(lái)實(shí)現(xiàn)。運(yùn)算程序流程圖見(jiàn)圖3.8。mov

cx,0;設(shè)置循環(huán)次數(shù)mov

si,0;置位移量初值clc

;清進(jìn)位(CF=0)looper:inccxmoval,data2[si];取一個(gè)加數(shù)adcdata1[si],al;和另一個(gè)加數(shù)相加incsi;位移量加1cmp

cx,5;循環(huán)次數(shù)減1jnz

looper ;未完,轉(zhuǎn)loper處繼續(xù)hlt

;程序暫停

減法指令SUB(subtract)減法格式:SUBdst,src操作:dst

←dst-srcSBB(subtractwithborrow)帶借位減法格式:SBBdst,src操作:dst←dst-src-CF其中,CF為借位標(biāo)志位的值例3.22

SUB[SI+14H],0136H指令執(zhí)行前DS=3000H,SI=0040H,30054H=4336H指令執(zhí)行后

4336H0100001100110110

-0136H

-0000000100110110

4200H

0100001000000000

0100001100110110或補(bǔ)碼相減

+1111111011001010

1←0100001000000000

所以[30054H]=4200H,SF=0,ZF=0,CF=0,OF=0

例3.23

SUBDH,[BP+4]指令執(zhí)行前DH=41H,SS=0000H,BP=00E4H,[000E8H]=5AH指令執(zhí)行后

41H0100000101000001-5AH

-01011010

+10100110

E7H1→1110011111100111

所以

DH=0E7H,SF=1,ZF=0,CF=1,OF=0DEC(Decrement)減1格式:DECdst操作:dst

←dst

-1CMP(Compare)比較格式:CMPdst,src操作:dst-srcCMP不保存運(yùn)算結(jié)果,但影響條件標(biāo)志位。大小關(guān)系兩個(gè)無(wú)符號(hào)數(shù)比較若CF=0,則被減數(shù)大,若CF=1,則被減數(shù)小。兩個(gè)有符號(hào)數(shù)比較1.若兩個(gè)數(shù)符號(hào)相同,可用SF來(lái)判斷若SF=0,表示被減數(shù)大,SF=1則反之。2.若兩個(gè)數(shù)符號(hào)不同OF⊕SF=0時(shí),被減數(shù)大.OF⊕SF=1時(shí),減數(shù)大.若兩個(gè)所比較的數(shù)相等,則ZF=1,否則ZF=0

NEG(Negate)求補(bǔ)格式:NEGdst操作:dst←0-dst例如若原來(lái)

AL=0FFH(-1的補(bǔ)碼)執(zhí)行指令 NEGAL后

AL=01(-1的絕對(duì)值)dst,

src的意義與加法指令意義相同;可進(jìn)行字節(jié)(8位)或字(16位)運(yùn)算;以上指令對(duì)狀態(tài)標(biāo)志位有影響,但DEC指令對(duì)CF位無(wú)影響例如:SUBAL,37HSBBCX,DXSUBARRAY[DI],AXSBB[SI+6],97DECBLDECWORDPTR[BP][DI]NEGAXNEGBYTEPTR[BX]CMPAL,0AHCMP[BXF5],SI皆為合法指令例3.20內(nèi)存數(shù)據(jù)存放了100個(gè)帶符號(hào)數(shù),首地址為AREA1,要求將各數(shù)取絕對(duì)值后存入以AREA2為首址的內(nèi)存區(qū)。由于100個(gè)帶符號(hào)數(shù)中可能既有正數(shù),又有負(fù)數(shù),因此先要判斷正負(fù)。如為正數(shù),可以原封不動(dòng)的傳送到另一內(nèi)存區(qū);如為負(fù)數(shù),則須先求補(bǔ)即可得到負(fù)數(shù)的絕對(duì)值,然后再傳送。程序如下: LEASI,AREA1 ;SI←原地址指針

LEADI,AREA2 ;DI←目的地址指針 MOVCX,100 ;CX←循環(huán)次數(shù)CHECK: MOVAL,[SI] ;取一個(gè)帶符號(hào)數(shù)到AL CMPAL,0 ;AL內(nèi)容不變,但影響標(biāo)志

JNSNEXT

;若SF=0,則轉(zhuǎn)NEXT NEGAL ;否則求補(bǔ)NEXT: MOV[DI],AL ;傳送到目的地址 INCSI ;源地址加1

INCDI ;目的地址加1 DECCX ;循環(huán)次數(shù)減1

JNZCHECK

;如不等于零,則轉(zhuǎn)CHECK HLT ;停止例3.21在數(shù)據(jù)段從DATA開(kāi)始的存儲(chǔ)單元中分別存放了兩個(gè)8位無(wú)符號(hào)數(shù)。比較他們的大小,并將大者傳送到MAX單元。編程如下:LEABX,DATA;DATA偏移地址送BXMOVAL,[BX];第一個(gè)無(wú)符號(hào)數(shù)送ALINCBX;BX指向第二個(gè)無(wú)符號(hào)數(shù)CMPAL,[BX];兩數(shù)比較JNCDONE

;如CF=0,則轉(zhuǎn)到DONEMOVAL,[BX];否則,第二個(gè)無(wú)符號(hào)數(shù)送ALDONE:

MOVMAX,AL ;較大的無(wú)符號(hào)送MAX單元HLT;停止

IMUL(SignedMultiple)帶符號(hào)數(shù)乘法格式:IMULsrc操作:與MUL相同,但操作數(shù)是帶符號(hào)數(shù)乘法指令MUL(UnsignedMultiple)無(wú)符號(hào)數(shù)乘法格式:MULsrc操作:字節(jié)運(yùn)算AX←AL×src

字運(yùn)算

DX,AX←AX×src

乘法指令是單操作數(shù)指令,隱含的目的操作數(shù)必須是累加器src為寄存器或存儲(chǔ)器操作數(shù),不能是立即數(shù)可進(jìn)行字節(jié)或字運(yùn)算。字節(jié)運(yùn)算時(shí),結(jié)果為16位,字運(yùn)算時(shí),結(jié)果為32位。本指令對(duì)CF和OF位有影響,對(duì)其他條件標(biāo)志位為無(wú)定義對(duì)于MUL指令,如果乘積的高半部分(字節(jié)運(yùn)算的AH,字運(yùn)算時(shí)的DX)為0,則CF=OF=0,否則,CF=OF=1對(duì)于IMUL指令,如果乘積的高半部分僅僅是乘積低半部分的符號(hào)擴(kuò)展,則CF=OF=0,否則,CF=OF=1。符號(hào)擴(kuò)展就是將乘積的低半部分中的最高位之值送入乘積的高半部分的每一位。例如,字節(jié)運(yùn)算,若:AL<80H,經(jīng)符號(hào)擴(kuò)展后

AH=0若:AL≥80H,符號(hào)擴(kuò)展后

AH=FFH字運(yùn)算,若:AX<8000H

,符號(hào)擴(kuò)展后,

DX=0若:AX≥8000H

,符號(hào)擴(kuò)展后,

DX=FFFFH。除法指令8086CPU執(zhí)行除法時(shí)規(guī)定:當(dāng)被除數(shù)為字時(shí),除數(shù)應(yīng)為字節(jié);當(dāng)被除數(shù)為雙字位時(shí),除數(shù)應(yīng)為字。DIV(Unsigneddivide)除法格式:DIVsrc操作:字節(jié)運(yùn)算

AL←AX/src

的商

AH←AX/src

的余數(shù)

字運(yùn)算

AX←DX,AX/src

的商

DX←DX,AX/src

的余數(shù)操作數(shù)被認(rèn)為是無(wú)符號(hào)數(shù),商和余數(shù)皆為無(wú)符號(hào)數(shù)。IDIV(Signeddivide)帶符號(hào)數(shù)除法格式:IDIVsrc操作:與DIV相同,但操作數(shù)被認(rèn)為是帶符號(hào)數(shù),商和余數(shù)也是帶符號(hào)數(shù)src的類(lèi)型與乘法指令中的一樣;除法指令對(duì)條件標(biāo)志為無(wú)定義(值不確定);若除數(shù)為0,或執(zhí)行除法時(shí),商超出范圍,CPU自動(dòng)產(chǎn)生類(lèi)型號(hào)為0的內(nèi)部中斷,作中斷處理。CWD

字?jǐn)U展指令格式:CWD操作:若AX<8000H,則DX←0000H,

否則DX←FFFFH符號(hào)擴(kuò)展指令CBW字節(jié)擴(kuò)展指令格式:CBW操作:若AL<80H,則AH←

00H,

否則AH←FFH例如:moval,64h ;AL=64H(機(jī)器數(shù)), ;表示10進(jìn)制數(shù)100(真值)cbw

;將符號(hào)0擴(kuò)展,AX=0064H, ;仍然表示100movax,0ff00h

;AX=FF00H, ;表示有符號(hào)10進(jìn)制數(shù)-256cwd

;將符號(hào)位“1”擴(kuò)展, ;DX.AX=FFFFFF00H

;仍然表示-256BCD碼(BinaryCodedDecimal)BCD碼是一種用二進(jìn)制編碼表示的十進(jìn)制數(shù),又稱(chēng)二-十進(jìn)制數(shù)它用4位二進(jìn)制碼表示1位十進(jìn)制數(shù)碼,這4位二進(jìn)制數(shù)的權(quán)為8421,所以又稱(chēng)8421碼。十進(jìn)制調(diào)整指令

表3.2BCD碼

十進(jìn)制

數(shù)碼

0

1

2

3

4

5

6

7

8

9

BCD碼

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

非壓縮的BCD碼(unpackedBCDformat)以8位二進(jìn)制數(shù)為一組表示1位十進(jìn)制數(shù);8位中的低4位表示8421的BCD碼,而高4位則無(wú)意義。壓縮的BCD碼(packedBCDformat)用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)位,整個(gè)十進(jìn)制數(shù)形式為一個(gè)順序的以4位為一組的數(shù)串。例如:9502d的壓縮的BCD碼形式為:

1001010100000010

非壓縮的BCD碼形式為:uuuu1001uuuu0101uuuu0000uuuu0010數(shù)字的ASCⅡ碼就是一種非壓縮的BCD碼形式例如:9d的ASCⅡ碼為:39H=00111001其低4位是8421BCD碼(9),高4位無(wú)意義。真值(十進(jìn)制) 8 64二進(jìn)制編碼 08H 40H壓縮BCD碼 08H 64H非壓縮BCD碼 08H 0604HASCII碼 38H 3634H編碼的比較調(diào)整的意義算術(shù)運(yùn)算指令都是二進(jìn)制運(yùn)算指令,若作BCD碼的運(yùn)算,會(huì)出現(xiàn)錯(cuò)誤,必須進(jìn)行調(diào)整才能得到正確的BCD碼運(yùn)算結(jié)果。在進(jìn)行十進(jìn)制數(shù)算術(shù)運(yùn)算時(shí)應(yīng)分兩步進(jìn)行:①先按二進(jìn)制數(shù)運(yùn)算規(guī)則運(yùn)算,得到中間結(jié)果;②再用十進(jìn)制調(diào)整指令對(duì)中間結(jié)果進(jìn)行修正,得到正確的結(jié)果。例如 34+23=57

00110100

34的BCD碼

+ 0010001123的BCD碼

01010111

57的BCD碼

結(jié)果正確,不作調(diào)整。例如:7+6=13

00000111;7的BCD碼

+ 00000110;6的BCD碼

00001101;結(jié)果錯(cuò)(和>9,AF=0)

+ 00000110

;加6調(diào)整

00010011 ;13的BCD碼,正確

兩個(gè)4位二進(jìn)制數(shù)之和>9,應(yīng)作加6調(diào)整例如:48+29=77

01001000 ;48的BCD碼+ 00101001

;29的BCD碼

01110001

;錯(cuò)誤(有進(jìn)位,AF=1)+ 00000110

;加6調(diào)整

01110111

;77的BCD碼,正確

兩個(gè)4位二進(jìn)制數(shù)之和<9,但有

AF=1,應(yīng)作加6調(diào)整。例如57+46=103

01010111

+01000110

10011101

;中間結(jié)果,低4位>9

+00000110

;加6調(diào)整

10100011

;中間結(jié)果,高4位>9

+01100000

;加60H調(diào)整

CF←1

00000011;正確結(jié)果CF=1加法運(yùn)算后,低4位>9時(shí),調(diào)整指令需作加06H調(diào)整;高4位>9時(shí),調(diào)整指令需作加60H調(diào)整。

例如:72+91=163

01110010

+10010001

CF←1

00000011 ;中間結(jié)果,CF=1

+01100000 ;加60H調(diào)整

01100011 ;正確結(jié)果加法運(yùn)算后,當(dāng)CF=1(有進(jìn)位產(chǎn)生)時(shí),調(diào)整指令應(yīng)作加60H處理。DAA(decimaladjustforaddition)加法的十進(jìn)制調(diào)整格式:DAA操作:將AL中的和調(diào)整成壓縮的BCD格式。壓縮的BCD碼調(diào)整指令調(diào)整方法:若AL的低4位>9或AF=1,則AL←AL+06H,AF←1若AL的高4位>9或CF=1,則AL←AL+60H,CF←1DAA指令之前必須先執(zhí)行ADD或ADC指令加數(shù)和被加數(shù)都必須是2位的壓縮BCD數(shù)和要存入AL寄存器。

DAA指令對(duì)OF無(wú)定義,但影響其他標(biāo)志位。例3.27

ADDAL,BL

DAA執(zhí)行前, AL=28H,BL=68H執(zhí)行ADD后,AL=90H,AF=1,CF=0和不是正確的BCD碼形式。執(zhí)行DAA指令,因?yàn)锳F=1,CF=0

而作調(diào)整:

AL←AL+06H

得到 AL=96H,CF=0,AF=1DAS(decimaladjustforsubtraction)減法的十進(jìn)制調(diào)整指令格式:DAS操作:把AL中的差調(diào)整成壓縮的BCD碼格式調(diào)整方法:若AL的低4位>9或AF=1,則AL←AL-06H,AF←1若AL的高4位>9或CF=1,則AL←AL-60H,CF←1DAS指令僅對(duì)AL內(nèi)容作調(diào)整,不改變AH的內(nèi)容。在DAS指令之前必須先執(zhí)行SUB或SBB指令減數(shù)和被減數(shù)都必須是2位的壓縮BCD數(shù)DAS指令對(duì)OF位無(wú)影響,對(duì)其他條件標(biāo)志位產(chǎn)生影響。AAA(ASCIIadjustforaddition)加法的ASCII調(diào)整指令格式:AAA操作:將AL中的和調(diào)整到非壓縮的BCD碼格式,AH←AH+調(diào)整產(chǎn)生的進(jìn)位值非壓縮的BCD碼調(diào)整指令調(diào)整方法:若AL

∧0FH>09H

或AF=1,則AL←AL+06H,AH←AH+1,AF←1,CF←1,AL←AL∧0FH否則AL←AL∧0FH,CF←0,AF←0AAA指令之前必須先執(zhí)行ADD或ADC指令加數(shù)和被加數(shù)都必須是1位壓縮BCD數(shù)和要存入AL寄存器。AAA指令影響AF和CF標(biāo)志,對(duì)其他標(biāo)志無(wú)定義例3.30

ADDAL,BL AAA如指令執(zhí)行前,AX=0535H(5的ASCII碼)BL=39H(9的ASCII碼)ADD指令執(zhí)行完后AL=6EH,BL=39H,AH=05H,AF=CF=0執(zhí)行AAA,因AL∧0FH=0EH>9H作調(diào)整:AL←AL+06H,得

AL=74HAH←AH+1,得AH=06HAF←1,CF←1AL←AL∧0FH,得AL=04H最終結(jié)果為AH=06H,AL=04H,即AX=0604H,CF=AF=1AAS(ASCIIadjustforsubtraction)減法的ASCII碼調(diào)整指令格式:AAS操作:把AL中的差調(diào)整到非壓縮的BCD碼格式,AH←AH-調(diào)整產(chǎn)生的借位值。調(diào)整方法:若AL∧0FH>9

或AF=1,則AL←AL-6,AH←AH-1AF←1,CF←1,AL←AL∧0FH否則AL←AL∧0FHAAS指令的使用要求和對(duì)標(biāo)志位的影響與AAA指令類(lèi)似。AAM(ASCIIadjustformultiplication)乘法的ASCII調(diào)整指令格式:AAM操作:對(duì)AL中的乘積進(jìn)行調(diào)整,方法為:AH←AL/0AH的商;AL←AL/0AH的余數(shù)AAM指令之前必須執(zhí)行MUL指令;乘數(shù)與被乘數(shù)是高4位為0的1位非壓縮型BCD碼對(duì)SF,ZF和PF位有影響,對(duì)AF,CF和OF位無(wú)定義AAD(ASCIIadjustfordivision)除法的ASCII調(diào)整指令格式:AAD操作:AL←AH×0AH+AL; AH←0AAD指令是用在DIV指令之前,對(duì)AX中的被除數(shù)進(jìn)行調(diào)整;被除數(shù)是存放在AX中的2位非壓縮BCD數(shù),除數(shù)是1位非壓縮BCD數(shù),每個(gè)BCD數(shù)的高4位全為0;指令據(jù)AL的結(jié)果設(shè)置SF、ZF、PF位,對(duì)OF、CF和AF無(wú)定義。

3.2.3邏輯運(yùn)算和移位指令共有五條:AND(and)邏輯與OR(or)邏輯或XOR(exclusive)異或NOT(not)邏輯非TEST(test)測(cè)試邏輯運(yùn)算指令NOT邏輯非指令格式:NOTdst操作:dst

←dstAND

邏輯與指令格式:ANDdst,src操作:dst

dst∧srcOR

邏輯或指令格式:ORdst,src操作:dst

←dstVsrcTEST測(cè)試指令格式:

TESTdst,src操作:

dst

src

結(jié)果影響狀態(tài)標(biāo)志位XOR異或指令格式:

XORdst,src操作:

dst

←dst

src以上指令可進(jìn)行字節(jié)或字操作dst與src的意義與算術(shù)運(yùn)算指令的類(lèi)似除NOT指令外,其余四條指令都對(duì)條件標(biāo)志位產(chǎn)生影響為:CF=OF=0AF位無(wú)定義SF、ZF、PF據(jù)運(yùn)算結(jié)果而定。例3.35判斷一個(gè)從端口地址為PORT的外設(shè)輸入的數(shù)據(jù),若數(shù)據(jù)的第1、3、5位中的任一位不為零,則轉(zhuǎn)移到NEXT。程序段為:

IN AL,PORT

TEST AL,00101010B JNZ NEXT . . .

NEXT:SHL/SAL邏輯左移/算術(shù)左移(shiftlogicalleft/shiftarithmeticleft)格式: SHL/SALdst,1/CL

操作:將dst順序向左移1位或移CL寄存器中指定的位數(shù),低位補(bǔ)00LHdstCF移位和循環(huán)指令演示SHR邏輯右移指令格式:SHRdst,1/CL0CFLHdstSAR算術(shù)右移指令格式:SARdst,1/CLLHCFdst演示演示ROL循環(huán)左移指令格式:ROLdst,1/CLROR循環(huán)右移指令格式:RORdst,1/CL

LHLHdstCFLHCFdst演示演示RCR帶進(jìn)位循環(huán)右移指令格式:RCRdst,1/CLLHLHdstCFLHCFdstRCL帶進(jìn)位循環(huán)左移指令格式:RCLdst,1/CL演示演示移位和循環(huán)指令可進(jìn)行字節(jié)和字操作dst可以是reg和mem操作數(shù)移位次數(shù)可以是1或由CL中內(nèi)容來(lái)確定指令對(duì)條件標(biāo)志位的影響移位指令:影響除AF位以外的其他標(biāo)志位循環(huán)指令:只影響CF和OF位對(duì)OF位的影響僅當(dāng)移為次數(shù)為1時(shí)才有意義,該位設(shè)置規(guī)則為:指令執(zhí)行前后,最高位相同時(shí)OF=0,否則OF=1例如:以下均為移位指令的合法形式SHLBL,1SHRWORD

PTR

BLOCK,CLSARDI,CLROLBYTE

PTR[DI],1RORBH,CLRCLAL,CLRCRWORD

PTR

TABLE[BX],1例如;將DX.AX中32位數(shù)值左移一位

shl ax,1

rcl

dx,1DXAXCF0例3.38要求測(cè)試AL寄存器中的第5位的狀態(tài)是“0”還是“1”,則可利用以下指令實(shí)現(xiàn):MOVCL,5

;CL←移位次數(shù)RORAL,CL ;CF←AL的第5位JNCZERO ;若CF=0,轉(zhuǎn)ZERO

:

ZERO:

:3.2.4串操作指令有5條指令MOVS(Movestring)串傳送CMPS(Comparestring)串比較SCAS(Scanstring)串掃描LODS(Loadfromstring)從串取STOS(Storeintostring)存入串MOVS串傳送格式:[REP]MOVS

dst-string,src-string

[REP]MOVSB

[REP]MOVSW操作:[ES:DI]←[DS:SI] SI←SI+1,DI←DI+1(字節(jié)操作)

SI←SI+

2,DI←DI+

2(字操作)當(dāng)方向標(biāo)志DF=0時(shí)用“+”,DF=1時(shí)用“-”。目的串在附加段,段基值在ES中;源串通常在數(shù)據(jù)段,段基值由DS提供。源串可以段超越,目的串則不允許;在第一種格式中,應(yīng)表明操作數(shù)是字還是字節(jié),指令中的dst和src只提供給匯編檢查之用,并不允許用其他尋址方式來(lái)確定操作數(shù)。第二、三種格式則明確指定是字節(jié)或字操作,不用寫(xiě)操作數(shù)。傳送指令不影響狀態(tài)標(biāo)志位。方括號(hào)項(xiàng)[REP]是可選項(xiàng),REP為重復(fù)性前綴。重復(fù)性前綴REP的使用格式:REP

stringprimitive其中stringprimitive

代表串指令(MOVS,STOS)操作:①如CX=0則退出REP,否則執(zhí)行指令②CX←CX-1③執(zhí)行其后串指令④重復(fù)①~③例3.39將數(shù)據(jù)段中首地址為BUFFER1的200個(gè)字節(jié)傳送到附加段首地址位BUFFER2的內(nèi)存區(qū)中。用MOV指令編程如下:對(duì)DS,ES初始化LEASI,BUFFER1 ;SI←源串首地址指針LEADI,BUFFER2 ;DI←目的串首地址指針MOVCX,200 ;CX←字節(jié)串長(zhǎng)度AGA:

;標(biāo)號(hào),即為轉(zhuǎn)移的目的地址MOVAL,[SI]

;AL←從源串取1個(gè)字節(jié)MOVES:[DI],AL

;目的串←ALINCSI

;源串地址指針+1INCDI

;目的串地址指針+1DECCX

;循環(huán)次數(shù)-1JNZ

AGA

;未完,轉(zhuǎn)移到AGA處繼續(xù)…用MOVSB指令編程如下:…LEASI,BUFFER1 ;(SI)←源串首地址指針LEADI,BUFFER2 ;(DI)←目的串首地址指針MOVCX,200 ;(CX)←字節(jié)串長(zhǎng)度CLD

;使DF=0,則地址自動(dòng)增量AGA:

MOVSB

;傳送1個(gè)字節(jié),并地址自動(dòng)+1DECCX

;計(jì)數(shù)-1JNZ

AGA

;未傳送完繼續(xù)…用REPMOVSB格式編程如下:…對(duì)DS,ES初始化LEASI,BUFFER1 ;SI←源串首地址LEADI,BUFFER2 ;DI←目的串首地址MOVCX,200 ;CX←字節(jié)串長(zhǎng)度CLD

;使DF=0,則地址自動(dòng)增量REPMOVSB

;傳送200個(gè)字節(jié)…LODS從串取指令格式:

LODSsrc_string LODSB/LODSW操作字節(jié)操作: AL←[DS:SI],SI←SI+

1字操作:

AX←[DS:SI],SI←SI+

2LODS指令不影響狀態(tài)標(biāo)志位,而且一般不帶重復(fù)前綴。例3.40內(nèi)存中以BUFFER為首址的緩沖區(qū)內(nèi)有10個(gè)非壓縮型BCD碼形式的十進(jìn)制數(shù),將這些十進(jìn)制數(shù)順序顯示在屏幕上。編程如下:LEASI,BUFFER;(SI)←緩沖區(qū)首址MOVCX,10;(CX)←字符串長(zhǎng)度CLD

;

DF=0MOVAH,02H ;(AH)←功能號(hào)GET:

LODSB

;取一個(gè)BCD碼到AL

ORAL,30H;BCD碼轉(zhuǎn)換為ASCII碼MOV DL,AL ;(DL)←字符INT 21H ;顯示DEC CX ;(CX)←(CX)-1JNZ GET

;未完成10個(gè)字符則繼續(xù)…STOS存入串指令格式:

[REP]STOS[ES:]dst_string

[REP]STOSB/ [REP]STOSW操作字節(jié)操作:

[ES:DI]←AL,DI←DI+1字操作:

[ES:DI]←AX,DI←DI+2STOS指令對(duì)狀態(tài)標(biāo)志無(wú)影響,指令通常與REP配合使用。例3.41數(shù)據(jù)塊BLOCK1由英文字母、數(shù)字和各種其它符號(hào)組成,其結(jié)束符是回車(chē)符CR(ASCII碼為0DH)。將該數(shù)據(jù)塊傳送到以BLOCK2為首址的內(nèi)存區(qū),并將其中所有的英文小寫(xiě)字母(a~z)轉(zhuǎn)換成相應(yīng)的大寫(xiě)字母(A~Z),其余不變。英文大、小寫(xiě)字母的ASCII碼為:

‘a(chǎn)’=61H

‘A’=41H

‘b’=62H

‘B’=42H

‘z’=7AH

‘Z’=5AH即大、小寫(xiě)字母的ASCII碼相差20H編程如下:LEA SI,BLOCK

;(SI)←源地址指針LEA DI,BLOCK2

;(DI)←目的地址指針CLD

;DF=0NEXT:LODSB

;取1個(gè)字符到ALCMP AL,0DH

;是否回車(chē)符JZ DONE

;是,轉(zhuǎn)DONE

CMP AL,61H

;是否小于‘a(chǎn)’JC OK

;是,則轉(zhuǎn)OKCMPAL,7AH ;是否大于‘z’JNCOK

;是,則轉(zhuǎn)OKSUBAL,20H ;否則,A減20HOK:

STOSB

;送入存儲(chǔ)器JMPNEXT

;轉(zhuǎn)移到NEXTDONE:

HLT ;停止CMPS串比較指令格式:[REPE/REPNE]CMPSsrc_string,dst_string[REPE/REPNE]CMPSB(字節(jié))[REPE/REPNE]CMPSW(字)操作:[DS:SI]-[ES:DI] SI←SI+1,DI←DI+1(字節(jié)操作) SI←SI+2,DI←DI+2(字操作)運(yùn)算結(jié)果影響狀態(tài)標(biāo)志位REPE

(當(dāng)相等/為零

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論