匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯編語(yǔ)言程序設(shè)計(jì)

“學(xué)校應(yīng)用型特色觀燈伙材

匯編語(yǔ)言程序設(shè)計(jì)朱耀庭

HUIBIANYUYAN

CHENGXUSHE.JI

第6章數(shù)據(jù)傳送與順序程序設(shè)評(píng)

?:?從本章開始將詳細(xì)介紹各種指令的格式、功能和用法,而

且配有實(shí)例以便讀者更容易掌握各種指令的用法。

。本章將重點(diǎn)介紹各種數(shù)據(jù)傳送指令和順序程序設(shè)計(jì)方法。

希望讀者在學(xué)習(xí)傳送指令的同時(shí),進(jìn)一步掌握尋址規(guī)則,

并將其正確地運(yùn)用于今后的程序設(shè)計(jì)中。

?80X86有4類數(shù)據(jù)傳送指令:

通用數(shù)據(jù)傳送指令

輸入輸出指令

地址目標(biāo)傳送指令

標(biāo)志位傳送指令

南開大學(xué)朱耀庭

第6章數(shù)據(jù)傳送與順序程序設(shè)評(píng)

*(1)通用數(shù)據(jù)傳送指令

MOV字節(jié)或字傳送

PUSH字進(jìn)棧

POP字退棧

XCHG字節(jié)或字交換

XLAT字節(jié)換碼

(2)輸入輸出指令

IN端口輸入字節(jié)或字

OUT端口輸出字節(jié)或字

南開大學(xué)朱耀庭

第6章數(shù)據(jù)傳送與順序程序設(shè)評(píng)

?(3)地址目標(biāo)傳送指令

LEA取有效地址到指定寄存器

LDS取段地址到DS,有效地址到指定寄存器

LES取段地址到ES,有效地址到指定寄存器

(4)標(biāo)志位傳送指令

LAHF取標(biāo)志寄存器到AH

SAHF存AH到標(biāo)志寄存器

PUSHF標(biāo)志進(jìn)棧

POPF標(biāo)志退棧

南開大學(xué)朱耀庭

第6章數(shù)據(jù)傳送與順序程序設(shè)訐

6」MOV指令與順序程序設(shè)計(jì)

6.2堆棧操作

6.3數(shù)據(jù)交換指令

6.4查表轉(zhuǎn)換指令

6.5地址目標(biāo)傳送指令

6.6標(biāo)志傳送指令

6?7端口輸入輸出指令

6.8順序程序設(shè)計(jì)

南開大學(xué)朱耀庭

6.1MOV指令與順序程序設(shè)計(jì)

AkMOV指令與順序程序?qū)嵗?/p>

(2)指令功能與應(yīng)用實(shí)例

南開大學(xué)朱耀庭

1.MOV指令與順序程序?qū)嵗?/p>

?:?傳送指令MOV是使用最頻繁的指令,在每個(gè)程序中都會(huì)用

到此指令。

格式:MOV目的操作數(shù),源操作數(shù)

功能:把一個(gè)字節(jié)或一個(gè)字從源操作數(shù)傳送至目的操作數(shù)。

說明:其中源操作數(shù)可以是立即數(shù)、通用寄存器、存儲(chǔ)器

以及段寄存器,目的操作數(shù)可以是通用寄存器、存儲(chǔ)器和

除CS外的段寄存器,目的操作數(shù)不能是立即數(shù)。傳送方

向搭配如圖6?1所示。其中虛線表示通用寄存器傳送至段

寄存器時(shí)CS不能作目的操作數(shù)。

南開大學(xué)朱耀庭

1.MOV指令與順序程序?qū)嵗?/p>

圖6」數(shù)據(jù)傳送方向搭配圖

南開大學(xué)朱耀庭

1.MOV指令與順序程序?qū)嵗?/p>

?例6-MOV指令與順序程序?qū)嵗?/p>

源程序EX61asm如下:

.MODELSMALL

.DATA

ADB16;定義內(nèi)存變量,并且賦初值16

CDB?;定義內(nèi)存變量,保留存儲(chǔ)單元

.CODE

BEGIN:

MOVAX,@DATA;裝填數(shù)據(jù)段寄存器

MOVDS,AX;DS指向.DATA

MOVAH,1門是立即數(shù)

INT21H;DOS1號(hào)功能調(diào)用,等待鍵盤輸入一個(gè)ASCH字符值到AL中

MOVDL,A;A是內(nèi)存變量,通過DS和A變量相對(duì)于DS的位移0對(duì)A尋址

ADDDL,AL;輸入的ASCII字符值與A變量值相加送入DL中,同時(shí)

MOVC,DL;送入變量C,C通過DS以及C變量對(duì)于段首的位移。對(duì)C尋址

MOVAH,2;以DL的內(nèi)容作為ASCII字符值

INT21H;DOS2號(hào)功能調(diào)用輸出該字符

MOVDL,C;取內(nèi)存變量C的值送入DL中

ADDDL,1;DL值力口1送入DL中

INT21H;以DL值作為ASCH值,輸出該字符

MOVAH,4CH;DOS4cH功能調(diào)用,結(jié)束程序

INT21H

ENDBEGIN

南開大學(xué)朱耀庭

1.MOV指令與順序程序?qū)嵗?/p>

?:?程序說明:執(zhí)行時(shí)輸入1,顯示:1AB。

。這里輸入1,由于DOS1號(hào)功能調(diào)用從鍵盤讀入一個(gè)字符

的ASCH值49到AL,并且回顯該字符,所以顯示器首先輸

出1,然后1的ASCH值49與A變量的值16相加為65送入DL

和C變量中,2號(hào)功能調(diào)用輸出DL中的字符A,其后取C變

量值65到DL寄存器,DL的內(nèi)容再加1送入DL中,值為66,

以其值用2號(hào)功能調(diào)用輸出字符B。所以輸入1,顯示為

1ABo如果輸入5,應(yīng)該顯示:5EF,請(qǐng)解釋一下這是為

什么?如果輸入6、7或8,結(jié)果又如何?

這是一個(gè)MOV指令應(yīng)用實(shí)例,同時(shí)也是一個(gè)順序程序?qū)嵗?/p>

順序程序也稱作直接程序。所謂順序程序是指程序在執(zhí)行

過程中,從第一人可執(zhí)行語(yǔ)句開始執(zhí)行,依次順序執(zhí)行,

直到程序結(jié)束,中間沒有分支、沒有循環(huán)。順序程序是相

對(duì)于分支和循環(huán)程序而言的,軀序程序在執(zhí)行過程中其行

號(hào)的運(yùn)行軌跡是一個(gè)有限遞增序列。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?:?MOV指令是最常用的匯編指令

*它用來實(shí)現(xiàn):

寄存器與寄存器

寄存器與立即數(shù)

寄存器與存儲(chǔ)器操作數(shù)

立即數(shù)與存儲(chǔ)器操作數(shù)之間的數(shù)據(jù)傳送

存儲(chǔ)器操作數(shù)可以采用各種內(nèi)存尋址方式

*其功能如下所述

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(1)寄存器與寄存器之間的數(shù)據(jù)傳送

?:?例如:

MOVAX,BX;(BX)一AX

MOVDL,AH;(AH)一DL

MOVDX,ES;(ES)一DX

MOVDS,AX;(AX)->DS

MOVAX,CS;(CS)一AX

。注意:源操作數(shù)和目的操作數(shù)的數(shù)據(jù)類型必須一致,可以

日一

同時(shí)T是H主節(jié)寄存器或字奇有器,不能同時(shí)為段寄杳器。代

碼段寄存器CS不能為目的榛作數(shù),指令指針I(yè)P不能作為

操作數(shù)。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(2)立即數(shù)傳送到通用寄存器

。立即數(shù)傳送到通用寄存器是指立即數(shù)傳送給AX,BX,CX,

DX,BP,SP,SLDI以及AH,AL,BH,BL,CH,

CL,DH,DL寄存器,但不能傳送到段寄存器。

。例如:

MOVAX,100Q;100Q->AX

MOVBX,OFFFFH;0FFFFH一BX

MOVAL,-2;0FFFEH->AL

MOVCH,100B;100B->CH

MOVDLJA';65TDL

MOVSI,OFFSETTABLE;OFFSETTABLE一SI

?:?注意:立即數(shù)與寄存器數(shù)據(jù)類型必須一致,立即數(shù)可以是

二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制的常數(shù),可以是帶符

號(hào)或無符號(hào)的整數(shù),也可以是ASCH字符。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(3)寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送

。寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送是指除了CS和IP以外的

所有寄存器與內(nèi)存儲(chǔ)器之間的數(shù)據(jù)傳送。

例如:

MOVAL,BUFFER;(BUFFER)tAL

MOVAX,[SI];((DS)X10H+(SI))->AX

MOV[DI],DX;(DXH(DS)X10H+(DI)

MOV[BX]+[DI],DL;(DL)->(DS)X10H+(BX)+(DI)

MOVSLES:[BP];((ES)X10H+(BP)HSI

MOVAX,A[BX+SI];((DS)X10H+(BX)+(SI)+A位

移)一AX

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(4)立即數(shù)傳送到存儲(chǔ)器

?:?立即數(shù)的數(shù)據(jù)類型與存儲(chǔ)器變量的類型一致。

。例如:

MOVA,3;3同A的類型一致

MOVBYTEPTR[SI],3;3為一個(gè)字節(jié)

MOVWORDPTR[BX],3;3為一個(gè)字

MOVB1[BX][DI+1],30H;30H同B1變量的類型一致

*存儲(chǔ)器操作數(shù)可以采用各種存儲(chǔ)器尋址方式。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(4)立即數(shù)傳送到存儲(chǔ)器

*注意:

?標(biāo)操作數(shù)和目的操作數(shù)不能同時(shí)為段寄存器。

?代碼段寄存器CS不能為目的操作數(shù),指令指針I(yè)P既不

能為源操作數(shù)也不能為目的操作數(shù)。

?MOV指令中源操作數(shù)和目的操作數(shù)不能同時(shí)是存儲(chǔ)器。

。如果要在兩個(gè)存儲(chǔ)器單元之間進(jìn)行數(shù)據(jù)傳送,可以借助通

用寄存器。

。例如:

MOVAL,A

MOVB,AL

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

(4)立即數(shù)傳送到存儲(chǔ)器

?這種方法同樣也適用于段寄存器

。例如:

MOVAX,CS

MOVDS,AX

?源操作數(shù)和目的操作數(shù)的類型一致,即同時(shí)為字節(jié)或同

時(shí)為字

?MOV指令不改變?cè)床僮鲾?shù),也不影響狀態(tài)標(biāo)志

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例^^1

?例6-2MOV指令程序設(shè)計(jì)實(shí)例一

?:?題目:將變量S1中的字符串傳送到同數(shù)據(jù)段的S2變量存儲(chǔ)單元中,并將S1

和S2的字符串分別輸出。

?設(shè)計(jì)思路:訪問S1和S2中的字節(jié)用類似高級(jí)語(yǔ)言的下標(biāo)變量法,例如

S1[SI],SI初值為0。

源程序EX6-2.asm如下:

DATASEGMENT

S1DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;設(shè)置數(shù)據(jù)段的段地址DS

MOVSI,OH;0送入SI中

MOVCX,14;設(shè)置循環(huán)次數(shù)

MOVAH,02H;調(diào)用DOS2#功能輸出字符

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?例6-2MOV指令程序設(shè)計(jì)實(shí)例一

L1:MOVDL,S1[SI];將51網(wǎng)]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中的內(nèi)容

MOVS2[SI],DL;WDL4'的內(nèi)容送入S2[SI]中

INCSI;SI=SI+1

LOOPL1;跳至L1處循環(huán)執(zhí)行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,輸出回車換行

MOVSI,OH;0送入SI中

MOVCX,14;設(shè)置循環(huán)次數(shù)

L2:MOVDL,S2[SI];將520]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中的內(nèi)容

INCSI

LOOPL2

MOVAH,4CH;結(jié)束程序,返回DOS功能調(diào)用

INT21H

CODEENDS;代碼段結(jié)束

ENDSTART;匯編結(jié)束,程序起始點(diǎn)為START

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

程序說明:

?數(shù)據(jù)段中定義字符串有不同的方法,該程序中是用DB偽指令來定

義字符串。其中字符串可以用單引號(hào)也可以用雙弓號(hào)。

例如:

S1DB?ABCDEFG,

DB“1234567”

同樣也可以用DB偽指令按如下方式定義字符串,其結(jié)果與前一種方

法等效。

例如:

S1DB-A,,,B,,,C,,,D',,E,,,F,,,G,

DB1,2,3,4,5,6,7

還可以用DW偽指令來定義字符串,每次分配兩個(gè)字符。由于

8086/8088微處理器的存儲(chǔ)方式是反字存儲(chǔ),即高位字節(jié)存放在低

地址,低位字節(jié)存放在高地址,與以上兩種數(shù)據(jù)定義等效,則數(shù)據(jù)應(yīng)

該寫成如下形式。

S1DW,BA,,,DC',,FE,,,1G','32','54','76'

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?該程序中調(diào)用DOS2#功能輸出字符

?在宏匯編語(yǔ)言里,要想輸出一人字符需要請(qǐng)求DOS的功能

調(diào)用,顯示一個(gè)字符的功能調(diào)用號(hào)為02H,將02H送入AH

中,發(fā)出21H類中斷,此時(shí)在屏幕上的當(dāng)前位置將顯示寄

存器DL中的一個(gè)字符

?因此,事先必須將要顯示的字符的ASCH碼送入DL寄存器

?:?例如:要想顯示輸出A,需要寫指令序列如下:

MOVAH,02H

MOVDLJA'

INT21H

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?:?又如本例中的輸出回車換行指令序列如下:

MOVAH,02H

MOVDL,ODH;回車符的ASCH碼是ODH

INT21H

MOVDL,OAH;換行符的ASCH碼是OAH

INT21H

?:?在輸出回車換行符時(shí),AH寄存器中的內(nèi)容沒有改變,還

是02H,所以就不用再寫一遍指令MOVAH,02H。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?例6?3MOV指令程序設(shè)計(jì)實(shí)例二

?題目:程序功能同EX62asm

設(shè)計(jì)思路:與例6-2的區(qū)別是訪問S1、S2中的字節(jié)用相對(duì)位移法。

?源程序EX6-3.asm如下:

DATASEGMENT

DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;設(shè)置數(shù)據(jù)段的段地址DS

MOVSI,OFFSETS1;S1相對(duì)段首位移送入SI中

MOVDI,OFFSETS2;S2相對(duì)段首位移送入DI中

MOVCX,14;設(shè)置循環(huán)次數(shù)

MOVAH,02H;調(diào)用DOS2#功能輸出字符

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

?:?例6?3MOV指令程序設(shè)計(jì)實(shí)例二

L1:MOVDL,[SI];將口5:冏]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中的內(nèi)容

MOV[DI],DL;將口1_中的內(nèi)容送入DS:[DI]中

INCSI;SI=SI+1

INCDI;DI=DI+1

LOOPL1;跳至L1處循環(huán)執(zhí)行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,輸出回車換行

MOVSI,OH;0送入SI中

MOVCX,14;設(shè)置循環(huán)次數(shù)

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

。例6?3MOV指令程序設(shè)計(jì)實(shí)例二

L2:MOVDL,S2[SI];^S2[SI]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中的內(nèi)容

INCSI

LOOPL2

MOVAH,4CH;結(jié)束程序,返回DOS功能調(diào)用

INT21H

CODEENDS;代碼段結(jié)束

ENDSTART;匯編結(jié)束,程序起始點(diǎn)為START

程序說明:試比較本例與EX6?2.asm的區(qū)別,特別要注意黑

體字,然后結(jié)合不同的尋址方式說明它們之間的異同。

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

例6?4MOV指令程序設(shè)計(jì)實(shí)例三

?題目:程序功能同EX62asm。

設(shè)計(jì)思路:與例6?3的區(qū)別是訪問S2中的字節(jié)時(shí)利用它與S1中相應(yīng)字節(jié)的位

移,而不是相對(duì)S2首的位移。

。源程序EX64asm如下:

DATASEGMENT

DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;設(shè)置數(shù)據(jù)段的段地址DS

MOVSI,OFFSETS1;S1相對(duì)段首位移送入SI中

MOVCX,14;設(shè)置循環(huán)次數(shù)

MOVAH,02H;調(diào)用DOS2#功能輸出字符

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

。例6?4MOV指令程序設(shè)計(jì)實(shí)例三

L1:MOVDL,[SI]/^DS:[SI]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中的內(nèi)容

MOV[SI+14],DL;將口1,中的內(nèi)容送入DSRSI+14]即S2

INCSI;SI=SI+1

LOOPL1;跳至L1處循環(huán)執(zhí)行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,輸出回車換行

MOVSI,OH;0送入SI

MOVCX,14;設(shè)置循環(huán)次數(shù)

南開大學(xué)朱耀庭

2.MOV指令功能與應(yīng)用實(shí)例

。例6?4MOV指令程序設(shè)計(jì)實(shí)例三

L2:MOVDL,S2[SI];^S2[SI]中的內(nèi)容送入DL中

INT21H;AH=02H,輸出DL中內(nèi)容

INCSI

LOOPL2

MOVAH.4CH;結(jié)束程序返回DOS功能調(diào)用

INT21H

CODEENDS;代碼段結(jié)束

ENDSTART;匯編結(jié)束,程序起始點(diǎn)為START

程序說明:試比較本例與EX62asm、EX63asm的區(qū)別,特別要注

意黑體字,結(jié)合不同的尋址方式說明它們之間的異同。

南開大學(xué)朱耀庭

(2)旨令POP

南開大學(xué)朱耀庭

1.進(jìn)棧指令PUSH

。格式:PUSH源操作數(shù)(字)

功能:把源操作數(shù)壓入堆棧,源操作數(shù)只能是字。該操作

首先將棧頂指針值減2,然后將源操作數(shù)送入SS:SP所指

儲(chǔ)的器棧頂。。源操作數(shù)可以是字通用寄存器、段寄存器和字存

。例如:

PUSHAX(SP)?2一SP且((SP),(SP)+1)一(AX)

PUSHBX將(BX)壓入堆棧

PUSHSS將(SS)壓入堆棧

PUSHCS將(CS)壓入堆棧(這是合法的)

PUSHBETA將BETA存儲(chǔ)字的內(nèi)容壓入堆棧

PUSHBETA[BX]將BETA[BX]一個(gè)字的內(nèi)容壓入堆棧

PUSHBETA[BX][SI]將BETA[BX+SI]一個(gè)字的內(nèi)容壓入堆

南開大學(xué)朱耀庭

2.出棧指令POP

。格式:POP目的操作數(shù)

。功能:從棧頂彈出一個(gè)字?jǐn)?shù)據(jù)到目的操作數(shù)。首先將堆棧

頂由SS:SP所指向的字送入目的操作數(shù);然后將堆棧指針

SP加2,即(SP)+2一SP。每次操作完,SP總是指向棧頂。

目的操作數(shù)可以是通用寄存器、段寄存器(除CS外)和

字存儲(chǔ)單元。

。例如,恢復(fù)上面程序段保存的寄存器、存儲(chǔ)器的內(nèi)容的程

序段為:

POPBETA[BX][SI]

POPBETA[BX]

POPBETA

POPA;因?yàn)镻OPCS是非法的

POPSS

POPBX

POPAX

南開大學(xué)朱耀庭

2.出棧指令POP

?:?堆棧操作指令PUSH和POP的操作示意圖如圖6?2所示,

假設(shè)AX=4243H,執(zhí)行指令“PUSHAX”,進(jìn)棧前后堆棧

段的情況如圖6?2(a)(b)所示,執(zhí)行指令"POPBX”,

堆棧段情況如圖6?2(b)、(c)所示。

低地址低地址

AX:4243H

BX

BX:4243H

PUSHAX

spPOPBX

4=JPOPBX

43

42

SP-

高地址高地址

(a)進(jìn)棧前堆棧段(b)進(jìn)棧后和出棧前堆棧段(c)出棧后堆棧段

圖6-2進(jìn)棧和出棧示意圖演示動(dòng)畫

南開大學(xué)朱耀庭

2.出棧指令POP

???注思:

(1)因?yàn)槎褩V羔楽P總是指向已經(jīng)存入數(shù)據(jù)的棧頂,所以

PUSH指令是先(SP)?2一SP,然后將內(nèi)容壓棧,即先修改

SP使之指向堆般中削剛釋放的空閑單元,后將內(nèi)容壓棧。

而POP是先從棧頂彈出一個(gè)字,然后將堆棧指針(SP)

+2-SP以便使剛剛彈出的堆棧字空間釋放。

(2)因?yàn)镾P總是指向棧頂,而用PUSH和POP指令存取數(shù)

時(shí)都是在棧頂進(jìn)行的,所以堆棧是“先進(jìn)后出”或稱作

“后進(jìn)先出”。棧底在高地址,堆棧是從高地址向低地址

延伸的,所以棧底就是最初的棧頂。

南開大學(xué)朱耀庭

2.出棧指令POP

。注意:

(3)PUSHCS是合法的,但POPCS是非法的

(4)PUSH和POP的操作數(shù)都不能是立即數(shù)

(5)用PUSH指令和POP指令時(shí)只能按字訪問堆棧,不

能按字節(jié)訪問堆棧

(6)PUSH和POP指令者B不影響標(biāo)志

南開大學(xué)朱耀庭

2.出棧指令POP

。例6?5堆棧操作實(shí)例

。題目:從鍵盤輸入一串字符,然后按輸入的相反順序輸出至屏幕。

設(shè)計(jì)思路:每輸入一個(gè)字符,用PUSH指令將其壓入堆棧,遇到回車

符結(jié)束輸入,用POP指令將堆棧中的字符逐個(gè)輸出。

源程序EX6?5.asm如下:

MYSTACKSEGMENTPARASTACK'STACK'

DW50DUP(?)

STACKTOPLABELWORD

MYSTACKENDS

MYCODESEGMENT

ASSUMECS:MYCODE,SS:MYSTACK;確定CS/SS指向的邏輯

START:MOVAX,MYSTACK

MOVSS,AX;設(shè)置堆棧段的段地址SS

MOVSP,OFFSETSTACKTOP;SP始終指向棧頂,所以該指令可去掉

MOVSI,0;用51來計(jì)數(shù)

南開大學(xué)朱耀庭

2.出棧指令POP

。例6?5堆棧操作實(shí)例

L1:MOVAH,01H

INT21H;從鍵盤輸入一個(gè)字符

CMPAL,0DH;遇到回車符,結(jié)束輸入

JEL2

PUSHAX;將輸入的字符壓入堆棧

INCSI;SI加1

LOOPL1

L2:MOVAH,02H

MOVDLQDH

INT21H

MOVDL,0AH

INT21H;輸出回車換行

MOVCX,SI

MOVAH,02H

南開大學(xué)朱耀庭

2.出棧指令POP

。例6?5堆棧操作實(shí)例

L3:POPDX

INT21H;從堆棧中彈出字符并輸出

LOOPL3

MOVAH,4CH

INT21H;結(jié)束程序返回DOS功能調(diào)用

MYCODEENDS;代碼段結(jié)束

ENDSTART;匯編結(jié)束

程序說明:

?從鍵盤輸入字符采用DOS的1號(hào)功能調(diào)用,將01H送入AH中,發(fā)出

中斷21H請(qǐng)求DOS功能調(diào)用,指令如下:

MOVAH,01H

INT21H

當(dāng)CPU執(zhí)行該兩條指令時(shí),等待鍵盤輸入一個(gè)字符,輸入的字符

的ASCH碼存入寄存器AL中。

南開大學(xué)朱耀庭

5M

z

2.出棧指令POP

。例6?5堆棧操作實(shí)例

。程序說明:

?PUSH的源操作數(shù)和POP的目的操作數(shù)都是一個(gè)字。該程

序中鍵盤輸入的字符存放在AL寄存器中,執(zhí)行指令

“PUSHAX”,則AX中的低八位AL存放的是輸入的字符,

然而高八位AH中是01H,這個(gè)沒有關(guān)系,因?yàn)樵趫?zhí)行指

令“POPDX”時(shí),DH為01H,DL為所需的字符,然后用

DOS2號(hào)功能輸出字符,DOS2號(hào)功能是將DL中的內(nèi)容

輸出,仍然能輸出正確結(jié)果。

?比較指令CMP可以對(duì)字節(jié)或字進(jìn)行比較,條件轉(zhuǎn)移指令

JE表示相等時(shí)轉(zhuǎn)移到其后的標(biāo)號(hào)處,功能和用法將在第9

章中詳細(xì)介紹。

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令^^1

。數(shù)據(jù)交換指令XCHG,可以方便地實(shí)現(xiàn)通用寄存器與通用

寄存器或存儲(chǔ)單元之間的數(shù)據(jù)交換。

?:?格式:XCHG目的操作數(shù),源操作數(shù)

?:?功能:將源操作數(shù)和目的操作數(shù)相互交換。目的操作數(shù)和

源操作數(shù)同時(shí)為字節(jié)或字。

?:?例如:

XCHGAX,BX;AX與BX寄存器內(nèi)容交換

XCHGSI,AX;SI與AX內(nèi)容交換

XCHGAL,BL;AL與BL內(nèi)容交換

XCHGWORDVAR,CX;變量WORD_VAR與CX寄存器內(nèi)容交

XCHGDH,BYTE_VAR;DH與變量BYTE_VAR內(nèi)容交換

XCHG[SI+3],AL;DS:[SI+3]所指的內(nèi)容與AL內(nèi)容交換

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令^^1

。注意:

⑴XCHG指令不影響狀態(tài)標(biāo)志。

0)操作數(shù)可以是通用寄存器和存儲(chǔ)器,但不包括段寄存

翱,也不能為立即數(shù)。

(3)源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲(chǔ)器,因此不能

直接實(shí)現(xiàn)兩個(gè)存儲(chǔ)器單元的內(nèi)容交換。若要進(jìn)行存儲(chǔ)器

(字)變量A和存儲(chǔ)器(字)變量B的內(nèi)容交換,可以借用一個(gè)

a用寄存器來實(shí)現(xiàn):

MOVAX,B

XCHGAX,A

MOVB,AX

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

?:?如果只用MOV指令則需要用4條指令占用兩個(gè)通用寄存器

才能實(shí)現(xiàn):

MOVAX,A

MOVBX,B

MOVA,BX

MOVB,AX

。利用堆棧交換存儲(chǔ)器變量A和B的內(nèi)容也是很方便的。利

用下列4條指令即可實(shí)現(xiàn):

PUSHA

PUSHB

POPA

POPB

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

例6?6數(shù)據(jù)交換程序?qū)嵗?/p>

題目:將字符串S1與S2的內(nèi)容進(jìn)行交換

設(shè)計(jì)思路:用XCHG指令實(shí)現(xiàn)S1和S2中內(nèi)容的互換

O源程序EX66asm如下:

DATASEGMENT

DB'ABCDEFG'

S2DB'0123456,

NDW$-OFFSETS2;N為字符串長(zhǎng)度

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

START:MOVAX,DATA

MOVDS,AX

MOVSI,0

MOVCX,N;將字符的個(gè)數(shù)送至CX中

南開大學(xué)朱耀庭

0

6.3數(shù)據(jù)交換指令

。例6?6數(shù)據(jù)交換程序?qū)嵗?/p>

L1:MOVAL,S1[SI]

XCHGAL,S2[SI]

MOVS1[SI],AL;借助寄存器AL將S1[SI]與S2[SI]交換

INCSI

LOOPL1;循環(huán)N次

MOVCX,N

MOVSI,0

MOVAH,02H

L2:MOVDL,S1[SI];輸出S1串

INT21H

INCSI

LOOPL2

MOVDL:'

INT21H

MOVCX,N

MOVSI,0

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

?:?例6?6數(shù)據(jù)交換程序?qū)嵗?/p>

L3:MOVDL,S2[SI];輸出S2串

INT21H

INCSI

LOOPL3

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

南開大學(xué)朱耀庭

0

6.3數(shù)據(jù)交換指令

。程序說明:

?使用XCHG指令,源操作數(shù)和目的操作數(shù)不能同時(shí)為存

儲(chǔ)器,要實(shí)現(xiàn)S1和S2中的內(nèi)容交換需要借用一個(gè)通用寄

存器來實(shí)現(xiàn),如:jiHr

MOVAL,S1[SI]

XCHGAL,S2[SI]

MOVS1[SI],AL

?該程序中N定義為一個(gè)字,該字為字符串S2的長(zhǎng)度,定

義方法為:

NDW$-OFFSETS2,也可以使用EQU語(yǔ)句定義一

個(gè)符號(hào)常量

例如,NEQU$-OFFSETS2O

南開大學(xué)朱耀庭

0

6.3數(shù)據(jù)交換指令

。例6?7數(shù)據(jù)交換程序?qū)嵗?/p>

。題目:從鍵盤輸入10個(gè)字符或數(shù)字。?9,利用冒泡排序法

進(jìn)行排序輸出。例如,輸入6738421905,貝"輸出

0123456789o

。燧計(jì)思蹬*冒想走序算滿期1型簟盾”實(shí)現(xiàn),送入內(nèi)層

宿環(huán)芝前需要先蔣ex中的制容保存,內(nèi)層循環(huán)解泉后再

恢復(fù)CX中的內(nèi)容,可以使用PUSH和POP指令來實(shí)現(xiàn),也

可以將CX中的內(nèi)容先保存在其他寄存器中。

源程序EX6?7.asm如下:

DATASEGMENT

S1DB10DUP(?)

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA;確定CS/DS指向的邏輯段

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

。例6?7數(shù)據(jù)交換程序?qū)嵗?/p>

START:MOVAX,DATA

MOVDS,AX;設(shè)置數(shù)據(jù)段的段地址DS

MOVSI,OFFSETS1

MOVCX,10

MOVAH,01H;將1送入AH中,請(qǐng)求DOS功能調(diào)用

L1:INT21H;從鍵盤讀入一個(gè)字符,并存放在AL中

MOV[SI],AL;AL中的內(nèi)容送入[SI]

INCSI;SI加1

LOOPL1

MOVAH,2

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,輸出回車換行

MOVCX,9;只需要進(jìn)行9次循環(huán)

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

。例6?7數(shù)據(jù)交換程序?qū)嵗?/p>

L2:MOVBX,CX的內(nèi)容保存至BX

MOVSl,0;從數(shù)組的第一個(gè)開始

L3:MOVAL,S1[SI]

CMPS1[SI+1],AL;兩個(gè)數(shù)比較

JGEL4;大于等于則轉(zhuǎn)到L4

XCHGS1[SI+1],AL;兩數(shù)交換

MOVS1[SI],AL

L4:INCSI

LOOPL3

MOVCX,BX;恢復(fù)外層循環(huán)的CX

LOOPL2

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

。例6?7數(shù)據(jù)交換程序?qū)嵗?/p>

MOVCX,10;循環(huán)輸出排序后的結(jié)果

MOVSI,0

MOVAH,2

L5:MOVDL,S1[SI]

INT21H

INCSI

LOOPL5

MOVAH,4CH;結(jié)束程序,返回DOS功能調(diào)用

INT21H

CODEENDS;代碼段結(jié)束

ENDSTART;匯編結(jié)束,程序起始點(diǎn)為

START

南開大學(xué)朱耀庭

6.3數(shù)據(jù)交換指令

。程序說明:

?輸入的字符或數(shù)字先存放在S1所指的10個(gè)字節(jié)的存儲(chǔ)

單元中,利用DOS1#功能調(diào)用從鍵盤讀入字符。

?該程序中用到了比較指令CMP和條件轉(zhuǎn)移指令JGE,

CMP指令可以對(duì)字節(jié)或字進(jìn)行比較,JGE表示大于等于則

轉(zhuǎn)移到其后邊的標(biāo)號(hào)處,如程序中:

CMPS1[SI+1],AL

JGEL4

*表示對(duì)S1[SI+1]和寄存器AL中的內(nèi)容進(jìn)行比較,如果目

的操作數(shù)S1[SI+1]大于等于源操作數(shù)AL,則指令跳

轉(zhuǎn)到標(biāo)號(hào)L4如,否則繼續(xù)執(zhí)行JGEL4后繼指令。CMP指

令和條件轉(zhuǎn)移指令的功能和用法將在第9章中詳細(xì)

介紹。

南開大學(xué)朱耀庭

6.4查表轉(zhuǎn)換指令

?:?查表轉(zhuǎn)換指令XLAT的格式和功能如下所示:

。格式:XLAT換碼表

。功能:換碼表中的一個(gè)字節(jié),稱為換碼字節(jié),用換碼字節(jié)

來置換累加器AL中的內(nèi)容。此指令要求換碼表的表首由

DS:BX指向,要換的碼在表中的位移由寄存器AL中的內(nèi)

容指出。即執(zhí)行該指令前換碼表的表頭起始地址在DS段

的位移是BX的位置,換碼字節(jié)在表中的位移在AL中,執(zhí)

行指令后即將表中要換的碼置入AL中,即

DS:[BX+AL]一AL。換碼過程示意圖如圖6?3所示。換碼

表長(zhǎng)度不得超過256個(gè)字節(jié)。

南開大學(xué)朱耀庭

6.4查表轉(zhuǎn)換指令

執(zhí)行前:執(zhí)行后:

DS:BX

AL—?演示動(dòng)畫

AAL

圖6-3XLAT指令功能示意圖

南開大學(xué)朱耀庭

0

6.4查表轉(zhuǎn)換指令

。例6?8查表轉(zhuǎn)換實(shí)例一

。題目:輸出十六進(jìn)制對(duì)應(yīng)的ASCH碼

設(shè)計(jì)思路:利用XLAT指令將計(jì)算機(jī)機(jī)內(nèi)二進(jìn)制表示的十

六進(jìn)制轉(zhuǎn)換成ASCH碼并顯示輸出

源程序EX6?8.asm如下:

DATASEGMENT

HEX_NUMDB0,1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FH

TABLEDB'0123456789ABCDEF'

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

START:MOVAX,DATA

MOVDS,AX

MOVCX,16

MOVBX.OFFSETTABLE

MOVSI.OFFSETHEX_NUM

南開大學(xué)朱耀庭

0

6.4查表轉(zhuǎn)換指令

。例6?8查表轉(zhuǎn)換實(shí)例一

L:MOVAL,[SI]

XLATTABLE嵌碼DSRBX+AL]一AL

MOVDL,AL

MOVAH,02H;顯示輸出

INT21H

MOVDL,"

INT21H

INCSI

LOOPL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

南開大學(xué)朱耀庭

0

6.4查表轉(zhuǎn)換指令

?:?程序說明:

?數(shù)據(jù)段中定義換碼表TABLE為十六進(jìn)制的ASCH碼。0,

1,???,16對(duì)應(yīng)的ASCH碼表為30H,31H,32H,33H,

34H,35H,36H,37H,38H,39H,41H,42H,43H,

44H,45H,46Ho

或簡(jiǎn)寫成'0123456789ABCDEF'。

?為了在AL中能得到0,1,2,…9,A,…,F(xiàn),也需要在

數(shù)據(jù)段中定義,該程序在HEX_NUM中依次存放。

?進(jìn)行換碼之前,換碼表的表頭整始地址在BX中,如程序中:

MOVBX,OFFSETTABLE,換碼字節(jié)在表中的位移在

AL中,如程序中:MOVAL,[SI],然后再進(jìn)行換碼轉(zhuǎn)換

XLATTABLEo

南開大學(xué)朱耀庭

0

6.4查表轉(zhuǎn)換指令

。例6?9查表轉(zhuǎn)換實(shí)例二

。題目:編寫一個(gè)程序從鍵盤讀入4位原碼,然后輸出其相

應(yīng)的密碼。例如,輸入9357,輸出應(yīng)該為6209。

。設(shè)計(jì)思路:已知一個(gè)漢字的電報(bào)碼由4位數(shù)字組成,現(xiàn)在

已經(jīng)知道有一種簡(jiǎn)單的加密方法是利用如下對(duì)應(yīng)關(guān)系進(jìn)行

加密的。

。原碼0,1,2,3,4,5,6,7,8,9分別對(duì)應(yīng)密碼3,7,

4,2,1,0,5,9,8,6(當(dāng)然也可以是其他的一一對(duì)

應(yīng)關(guān)系)。將密碼表存放在MIMAB字段,用XLAT指令實(shí)

現(xiàn)原碼到密碼的轉(zhuǎn)換,原碼到密碼查表轉(zhuǎn)換過程如圖6?4

所示。

南開大學(xué)朱耀庭

0

6.4查表轉(zhuǎn)換指令

。例6?9查表轉(zhuǎn)換實(shí)例二

。題目:編寫一個(gè)程序從鍵盤讀入4位原碼,然后輸出其相

應(yīng)的密碼。例如,輸入9357,輸出應(yīng)該為6209。

。設(shè)計(jì)思路:已知一個(gè)漢字的電報(bào)碼由4位數(shù)字組成,現(xiàn)在

已經(jīng)知道有一種簡(jiǎn)單的加密方法是利用如下對(duì)應(yīng)關(guān)系進(jìn)行

加密的。

。原碼0,1,2,3,4,5,6,7,8,9分別對(duì)應(yīng)密碼3,7,

4,2,1,0,5,9,8,6(當(dāng)然也可以是其他的一一對(duì)

應(yīng)關(guān)系)。將密碼表存放在MIMAB字段,用XLAT指令實(shí)

現(xiàn)原碼到密碼的轉(zhuǎn)換,原碼到密碼查表轉(zhuǎn)換過程如圖6?4

所示。

南開大學(xué)朱耀庭

6.4查表轉(zhuǎn)換指令

演示動(dòng)畫

圖6?4原碼到密碼轉(zhuǎn)換過程示意圖

南開大學(xué)朱耀庭

6.4查表轉(zhuǎn)換指令

源程序EX6?9.asm如下:

.MODELSMALL

.DATA

MIMABDB'3742105986'

MIMADB4DUP(?)

.CODE

BEGIN:MOVAX,@DATA

MOVDS,AX

MOVCX,4

LEABX,MIMABMMIMAB的有效地址傳送到BX中

LEASI,MIMAd^MIMA的有效地址傳送到SI中

L1:MOVAH,1

INT21H

ANDAL,0FH;高位清零

南開大學(xué)朱耀庭

6.4查表轉(zhuǎn)換指令

?:?源程序EX6?9.asm如下:

XLATMIMAB

MOV[SI],AL;將密碼存入MIMA所在的存儲(chǔ)單元中

INCSI

LOOPL1

MOVCX,4

LEASI,MIMA

MOVAH,2

MOVDL,0DH

INT21H

MOVDL.OAH

INT21H

L2:MOVDL,[SI];循環(huán)輸出密碼

INT21H

INCSI

LOOPL2

MOVAH,4CH

INT21H

ENDBEGIN

南開大學(xué)朱耀庭

6.5地址目標(biāo)傳送指令

LEA指令(LoadEffectiveAddress)

LDS指令(LoadpointerintoDS)

LES指令(LoadpointerintoES)

南開大學(xué)朱耀庭

1.LEA指令(LoadEffectiveAddress)

。該指令稱為有效地址傳送指令

格式:LEA目的操作數(shù),源操作數(shù)

功能:把源操作數(shù)的有效地址傳送至目的操作數(shù)寄存器

說明:其中,目的操作數(shù)為16位的通用寄存器(即AX,BX,

CX,DX,SP,BP,SI,DI之一);源操作數(shù)是存儲(chǔ)器操作數(shù),

如變量、標(biāo)號(hào)或地址表達(dá)式

?:?例如:

LEABX,BUFFER;將變量BUFFER的位移量送入BX中

LEADX,BUFARRAY[BX][SI];將數(shù)組元素的位移量送入DX中

LEAAX,[BP][DI];將有效地址(BP)+(DI)送入AX中

南開大學(xué)朱耀庭

1.LEA指令(LoadEffectiveAddress)

?:?注意:

(1)LEA指令是處理變量的地址(即變量的位移量),而不是

變量的內(nèi)容(即變量的值)。

(2)LEA指令和MOV指令有本質(zhì)上的區(qū)別。假設(shè)變量

BUFFER的偏移是1000H,該字變量的值是4243H,貝U指

令“LEAAX,BUFFER”是將偏移1000H送入AX中,而

指令“MOVAX,BUFFER”是將值4243H送入AX中。

MOV指令也可以傳送有效地址(位移量),但必須用

OFFSET操作符作用于變量,"MOVAX,OFFSET

BUFFER”將變量BUFFER的位移量送入AX中。

南開大學(xué)朱耀庭

1.LEA指令(LoadEffectiveAddress)

?:?注意:

(3)LEA指令的源操作數(shù)可以帶下標(biāo),即LEA指令可以傳

送任意數(shù)組元素的位移量。例如指令“LEADX,

BUFARRAY[BX][S『是將數(shù)組元素BUFARRAY[BX][SI]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論