汇编语言程序设计_第1页
汇编语言程序设计_第2页
汇编语言程序设计_第3页
汇编语言程序设计_第4页
汇编语言程序设计_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计

“学校应用型特色观灯伙材

汇编语言程序设计朱耀庭

HUIBIANYUYAN

CHENGXUSHE.JI

第6章数据传送与顺序程序设评

♦:♦从本章开始将详细介绍各种指令的格式、功能和用法,而

且配有实例以便读者更容易掌握各种指令的用法。

。本章将重点介绍各种数据传送指令和顺序程序设计方法。

希望读者在学习传送指令的同时,进一步掌握寻址规则,

并将其正确地运用于今后的程序设计中。

♦80X86有4类数据传送指令:

通用数据传送指令

输入输出指令

地址目标传送指令

标志位传送指令

南开大学朱耀庭

第6章数据传送与顺序程序设评

*(1)通用数据传送指令

MOV字节或字传送

PUSH字进栈

POP字退栈

XCHG字节或字交换

XLAT字节换码

(2)输入输出指令

IN端口输入字节或字

OUT端口输出字节或字

南开大学朱耀庭

第6章数据传送与顺序程序设评

❖(3)地址目标传送指令

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

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

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

(4)标志位传送指令

LAHF取标志寄存器到AH

SAHF存AH到标志寄存器

PUSHF标志进栈

POPF标志退栈

南开大学朱耀庭

第6章数据传送与顺序程序设讦

6」MOV指令与顺序程序设计

6.2堆栈操作

6.3数据交换指令

6.4查表转换指令

6.5地址目标传送指令

6.6标志传送指令

6・7端口输入输出指令

6.8顺序程序设计

南开大学朱耀庭

6.1MOV指令与顺序程序设计

AkMOV指令与顺序程序实例

(2)指令功能与应用实例

南开大学朱耀庭

1.MOV指令与顺序程序实例

♦:♦传送指令MOV是使用最频繁的指令,在每个程序中都会用

到此指令。

格式:MOV目的操作数,源操作数

功能:把一个字节或一个字从源操作数传送至目的操作数。

说明:其中源操作数可以是立即数、通用寄存器、存储器

以及段寄存器,目的操作数可以是通用寄存器、存储器和

除CS外的段寄存器,目的操作数不能是立即数。传送方

向搭配如图6・1所示。其中虚线表示通用寄存器传送至段

寄存器时CS不能作目的操作数。

南开大学朱耀庭

1.MOV指令与顺序程序实例

图6」数据传送方向搭配图

南开大学朱耀庭

1.MOV指令与顺序程序实例

♦例6-MOV指令与顺序程序实例。

源程序EX61asm如下:

.MODELSMALL

.DATA

ADB16;定义内存变量,并且赋初值16

CDB?;定义内存变量,保留存储单元

.CODE

BEGIN:

MOVAX,@DATA;装填数据段寄存器

MOVDS,AX;DS指向.DATA

MOVAH,1门是立即数

INT21H;DOS1号功能调用,等待键盘输入一个ASCH字符值到AL中

MOVDL,A;A是内存变量,通过DS和A变量相对于DS的位移0对A寻址

ADDDL,AL;输入的ASCII字符值与A变量值相加送入DL中,同时

MOVC,DL;送入变量C,C通过DS以及C变量对于段首的位移。对C寻址

MOVAH,2;以DL的内容作为ASCII字符值

INT21H;DOS2号功能调用输出该字符

MOVDL,C;取内存变量C的值送入DL中

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

INT21H;以DL值作为ASCH值,输出该字符

MOVAH,4CH;DOS4cH功能调用,结束程序

INT21H

ENDBEGIN

南开大学朱耀庭

1.MOV指令与顺序程序实例

♦:♦程序说明:执行时输入1,显示:1AB。

。这里输入1,由于DOS1号功能调用从键盘读入一个字符

的ASCH值49到AL,并且回显该字符,所以显示器首先输

出1,然后1的ASCH值49与A变量的值16相加为65送入DL

和C变量中,2号功能调用输出DL中的字符A,其后取C变

量值65到DL寄存器,DL的内容再加1送入DL中,值为66,

以其值用2号功能调用输出字符B。所以输入1,显示为

1ABo如果输入5,应该显示:5EF,请解释一下这是为

什么?如果输入6、7或8,结果又如何?

这是一个MOV指令应用实例,同时也是一个顺序程序实例。

顺序程序也称作直接程序。所谓顺序程序是指程序在执行

过程中,从第一人可执行语句开始执行,依次顺序执行,

直到程序结束,中间没有分支、没有循环。顺序程序是相

对于分支和循环程序而言的,躯序程序在执行过程中其行

号的运行轨迹是一个有限递增序列。

南开大学朱耀庭

2.MOV指令功能与应用实例

♦:♦MOV指令是最常用的汇编指令

*它用来实现:

寄存器与寄存器

寄存器与立即数

寄存器与存储器操作数

立即数与存储器操作数之间的数据传送

存储器操作数可以采用各种内存寻址方式

*其功能如下所述

南开大学朱耀庭

2.MOV指令功能与应用实例

(1)寄存器与寄存器之间的数据传送

♦:♦例如:

MOVAX,BX;(BX)一AX

MOVDL,AH;(AH)一DL

MOVDX,ES;(ES)一DX

MOVDS,AX;(AX)->DS

MOVAX,CS;(CS)一AX

。注意:源操作数和目的操作数的数据类型必须一致,可以

日一

同时T是H主节寄存器或字奇有器,不能同时为段寄杳器。代

码段寄存器CS不能为目的榛作数,指令指针IP不能作为

操作数。

南开大学朱耀庭

2.MOV指令功能与应用实例

(2)立即数传送到通用寄存器

。立即数传送到通用寄存器是指立即数传送给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

♦:♦注意:立即数与寄存器数据类型必须一致,立即数可以是

二进制、八进制、十进制、十六进制的常数,可以是带符

号或无符号的整数,也可以是ASCH字符。

南开大学朱耀庭

2.MOV指令功能与应用实例

(3)寄存器与存储器之间的数据传送

。寄存器与存储器之间的数据传送是指除了CS和IP以外的

所有寄存器与内存储器之间的数据传送。

例如:

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

南开大学朱耀庭

2.MOV指令功能与应用实例

(4)立即数传送到存储器

♦:♦立即数的数据类型与存储器变量的类型一致。

。例如:

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

MOVBYTEPTR[SI],3;3为一个字节

MOVWORDPTR[BX],3;3为一个字

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

*存储器操作数可以采用各种存储器寻址方式。

南开大学朱耀庭

2.MOV指令功能与应用实例

(4)立即数传送到存储器

*注意:

・标操作数和目的操作数不能同时为段寄存器。

•代码段寄存器CS不能为目的操作数,指令指针IP既不

能为源操作数也不能为目的操作数。

•MOV指令中源操作数和目的操作数不能同时是存储器。

。如果要在两个存储器单元之间进行数据传送,可以借助通

用寄存器。

。例如:

MOVAL,A

MOVB,AL

南开大学朱耀庭

2.MOV指令功能与应用实例

(4)立即数传送到存储器

❖这种方法同样也适用于段寄存器

。例如:

MOVAX,CS

MOVDS,AX

•源操作数和目的操作数的类型一致,即同时为字节或同

时为字

•MOV指令不改变源操作数,也不影响状态标志

南开大学朱耀庭

2.MOV指令功能与应用实例^^1

♦例6-2MOV指令程序设计实例一

♦:♦题目:将变量S1中的字符串传送到同数据段的S2变量存储单元中,并将S1

和S2的字符串分别输出。

♦设计思路:访问S1和S2中的字节用类似高级语言的下标变量法,例如

S1[SI],SI初值为0。

源程序EX6-2.asm如下:

DATASEGMENT

S1DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;设置数据段的段地址DS

MOVSI,OH;0送入SI中

MOVCX,14;设置循环次数

MOVAH,02H;调用DOS2#功能输出字符

南开大学朱耀庭

2.MOV指令功能与应用实例

♦例6-2MOV指令程序设计实例一

L1:MOVDL,S1[SI];将51网]中的内容送入DL中

INT21H;AH=02H,输出DL中的内容

MOVS2[SI],DL;WDL4'的内容送入S2[SI]中

INCSI;SI=SI+1

LOOPL1;跳至L1处循环执行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,输出回车换行

MOVSI,OH;0送入SI中

MOVCX,14;设置循环次数

L2:MOVDL,S2[SI];将520]中的内容送入DL中

INT21H;AH=02H,输出DL中的内容

INCSI

LOOPL2

MOVAH,4CH;结束程序,返回DOS功能调用

INT21H

CODEENDS;代码段结束

ENDSTART;汇编结束,程序起始点为START

南开大学朱耀庭

2.MOV指令功能与应用实例

程序说明:

•数据段中定义字符串有不同的方法,该程序中是用DB伪指令来定

义字符串。其中字符串可以用单引号也可以用双弓号。

例如:

S1DB•ABCDEFG,

DB“1234567”

同样也可以用DB伪指令按如下方式定义字符串,其结果与前一种方

法等效。

例如:

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

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

还可以用DW伪指令来定义字符串,每次分配两个字符。由于

8086/8088微处理器的存储方式是反字存储,即高位字节存放在低

地址,低位字节存放在高地址,与以上两种数据定义等效,则数据应

该写成如下形式。

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

南开大学朱耀庭

2.MOV指令功能与应用实例

•该程序中调用DOS2#功能输出字符

・在宏汇编语言里,要想输出一人字符需要请求DOS的功能

调用,显示一个字符的功能调用号为02H,将02H送入AH

中,发出21H类中断,此时在屏幕上的当前位置将显示寄

存器DL中的一个字符

・因此,事先必须将要显示的字符的ASCH码送入DL寄存器

♦:♦例如:要想显示输出A,需要写指令序列如下:

MOVAH,02H

MOVDLJA'

INT21H

南开大学朱耀庭

2.MOV指令功能与应用实例

♦:♦又如本例中的输出回车换行指令序列如下:

MOVAH,02H

MOVDL,ODH;回车符的ASCH码是ODH

INT21H

MOVDL,OAH;换行符的ASCH码是OAH

INT21H

♦:♦在输出回车换行符时,AH寄存器中的内容没有改变,还

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

南开大学朱耀庭

2.MOV指令功能与应用实例

♦例6・3MOV指令程序设计实例二

♦题目:程序功能同EX62asm

设计思路:与例6-2的区别是访问S1、S2中的字节用相对位移法。

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

DATASEGMENT

DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;设置数据段的段地址DS

MOVSI,OFFSETS1;S1相对段首位移送入SI中

MOVDI,OFFSETS2;S2相对段首位移送入DI中

MOVCX,14;设置循环次数

MOVAH,02H;调用DOS2#功能输出字符

南开大学朱耀庭

2.MOV指令功能与应用实例

♦:♦例6・3MOV指令程序设计实例二

L1:MOVDL,[SI];将口5:冏]中的内容送入DL中

INT21H;AH=02H,输出DL中的内容

MOV[DI],DL;将口1_中的内容送入DS:[DI]中

INCSI;SI=SI+1

INCDI;DI=DI+1

LOOPL1;跳至L1处循环执行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,输出回车换行

MOVSI,OH;0送入SI中

MOVCX,14;设置循环次数

南开大学朱耀庭

2.MOV指令功能与应用实例

。例6・3MOV指令程序设计实例二

L2:MOVDL,S2[SI];^S2[SI]中的内容送入DL中

INT21H;AH=02H,输出DL中的内容

INCSI

LOOPL2

MOVAH,4CH;结束程序,返回DOS功能调用

INT21H

CODEENDS;代码段结束

ENDSTART;汇编结束,程序起始点为START

程序说明:试比较本例与EX6・2.asm的区别,特别要注意黑

体字,然后结合不同的寻址方式说明它们之间的异同。

南开大学朱耀庭

2.MOV指令功能与应用实例

例6・4MOV指令程序设计实例三

♦题目:程序功能同EX62asm。

设计思路:与例6・3的区别是访问S2中的字节时利用它与S1中相应字节的位

移,而不是相对S2首的位移。

。源程序EX64asm如下:

DATASEGMENT

DB'ABCDEFG'

DB'1234567,

S2DB14DUP(?)

DATAENDS

CODESEGMENT

ASSUMEDS:DATA,CS:CODE

START:MOVAX,DATA

MOVDS,AX;设置数据段的段地址DS

MOVSI,OFFSETS1;S1相对段首位移送入SI中

MOVCX,14;设置循环次数

MOVAH,02H;调用DOS2#功能输出字符

南开大学朱耀庭

2.MOV指令功能与应用实例

。例6・4MOV指令程序设计实例三

L1:MOVDL,[SI]/^DS:[SI]中的内容送入DL中

INT21H;AH=02H,输出DL中的内容

MOV[SI+14],DL;将口1,中的内容送入DSRSI+14]即S2

INCSI;SI=SI+1

LOOPL1;跳至L1处循环执行

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,输出回车换行

MOVSI,OH;0送入SI

MOVCX,14;设置循环次数

南开大学朱耀庭

2.MOV指令功能与应用实例

。例6・4MOV指令程序设计实例三

L2:MOVDL,S2[SI];^S2[SI]中的内容送入DL中

INT21H;AH=02H,输出DL中内容

INCSI

LOOPL2

MOVAH.4CH;结束程序返回DOS功能调用

INT21H

CODEENDS;代码段结束

ENDSTART;汇编结束,程序起始点为START

程序说明:试比较本例与EX62asm、EX63asm的区别,特别要注

意黑体字,结合不同的寻址方式说明它们之间的异同。

南开大学朱耀庭

(2)旨令POP

南开大学朱耀庭

1.进栈指令PUSH

。格式:PUSH源操作数(字)

功能:把源操作数压入堆栈,源操作数只能是字。该操作

首先将栈顶指针值减2,然后将源操作数送入SS:SP所指

储的器栈顶。。源操作数可以是字通用寄存器、段寄存器和字存

。例如:

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

PUSHBX将(BX)压入堆栈

PUSHSS将(SS)压入堆栈

PUSHCS将(CS)压入堆栈(这是合法的)

PUSHBETA将BETA存储字的内容压入堆栈

PUSHBETA[BX]将BETA[BX]一个字的内容压入堆栈

PUSHBETA[BX][SI]将BETA[BX+SI]一个字的内容压入堆

南开大学朱耀庭

2.出栈指令POP

。格式:POP目的操作数

。功能:从栈顶弹出一个字数据到目的操作数。首先将堆栈

顶由SS:SP所指向的字送入目的操作数;然后将堆栈指针

SP加2,即(SP)+2一SP。每次操作完,SP总是指向栈顶。

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

字存储单元。

。例如,恢复上面程序段保存的寄存器、存储器的内容的程

序段为:

POPBETA[BX][SI]

POPBETA[BX]

POPBETA

POPA;因为POPCS是非法的

POPSS

POPBX

POPAX

南开大学朱耀庭

2.出栈指令POP

♦:♦堆栈操作指令PUSH和POP的操作示意图如图6・2所示,

假设AX=4243H,执行指令“PUSHAX”,进栈前后堆栈

段的情况如图6・2(a)(b)所示,执行指令"POPBX”,

堆栈段情况如图6・2(b)、(c)所示。

低地址低地址

AX:4243H

BX

BX:4243H

PUSHAX

spPOPBX

4=JPOPBX

43

42

SP-

高地址高地址

(a)进栈前堆栈段(b)进栈后和出栈前堆栈段(c)出栈后堆栈段

图6-2进栈和出栈示意图演示动画

南开大学朱耀庭

2.出栈指令POP

♦♦♦注思:

(1)因为堆栈指针SP总是指向已经存入数据的栈顶,所以

PUSH指令是先(SP)・2一SP,然后将内容压栈,即先修改

SP使之指向堆般中削刚释放的空闲单元,后将内容压栈。

而POP是先从栈顶弹出一个字,然后将堆栈指针(SP)

+2-SP以便使刚刚弹出的堆栈字空间释放。

(2)因为SP总是指向栈顶,而用PUSH和POP指令存取数

时都是在栈顶进行的,所以堆栈是“先进后出”或称作

“后进先出”。栈底在高地址,堆栈是从高地址向低地址

延伸的,所以栈底就是最初的栈顶。

南开大学朱耀庭

2.出栈指令POP

。注意:

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

(4)PUSH和POP的操作数都不能是立即数

(5)用PUSH指令和POP指令时只能按字访问堆栈,不

能按字节访问堆栈

(6)PUSH和POP指令者B不影响标志

南开大学朱耀庭

2.出栈指令POP

。例6・5堆栈操作实例

。题目:从键盘输入一串字符,然后按输入的相反顺序输出至屏幕。

设计思路:每输入一个字符,用PUSH指令将其压入堆栈,遇到回车

符结束输入,用POP指令将堆栈中的字符逐个输出。

源程序EX6・5.asm如下:

MYSTACKSEGMENTPARASTACK'STACK'

DW50DUP(?)

STACKTOPLABELWORD

MYSTACKENDS

MYCODESEGMENT

ASSUMECS:MYCODE,SS:MYSTACK;确定CS/SS指向的逻辑

START:MOVAX,MYSTACK

MOVSS,AX;设置堆栈段的段地址SS

MOVSP,OFFSETSTACKTOP;SP始终指向栈顶,所以该指令可去掉

MOVSI,0;用51来计数

南开大学朱耀庭

2.出栈指令POP

。例6・5堆栈操作实例

L1:MOVAH,01H

INT21H;从键盘输入一个字符

CMPAL,0DH;遇到回车符,结束输入

JEL2

PUSHAX;将输入的字符压入堆栈

INCSI;SI加1

LOOPL1

L2:MOVAH,02H

MOVDLQDH

INT21H

MOVDL,0AH

INT21H;输出回车换行

MOVCX,SI

MOVAH,02H

南开大学朱耀庭

2.出栈指令POP

。例6・5堆栈操作实例

L3:POPDX

INT21H;从堆栈中弹出字符并输出

LOOPL3

MOVAH,4CH

INT21H;结束程序返回DOS功能调用

MYCODEENDS;代码段结束

ENDSTART;汇编结束

程序说明:

・从键盘输入字符采用DOS的1号功能调用,将01H送入AH中,发出

中断21H请求DOS功能调用,指令如下:

MOVAH,01H

INT21H

当CPU执行该两条指令时,等待键盘输入一个字符,输入的字符

的ASCH码存入寄存器AL中。

南开大学朱耀庭

5M

z

2.出栈指令POP

。例6・5堆栈操作实例

。程序说明:

•PUSH的源操作数和POP的目的操作数都是一个字。该程

序中键盘输入的字符存放在AL寄存器中,执行指令

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

然而高八位AH中是01H,这个没有关系,因为在执行指

令“POPDX”时,DH为01H,DL为所需的字符,然后用

DOS2号功能输出字符,DOS2号功能是将DL中的内容

输出,仍然能输出正确结果。

•比较指令CMP可以对字节或字进行比较,条件转移指令

JE表示相等时转移到其后的标号处,功能和用法将在第9

章中详细介绍。

南开大学朱耀庭

6.3数据交换指令^^1

。数据交换指令XCHG,可以方便地实现通用寄存器与通用

寄存器或存储单元之间的数据交换。

♦:♦格式:XCHG目的操作数,源操作数

♦:♦功能:将源操作数和目的操作数相互交换。目的操作数和

源操作数同时为字节或字。

♦:♦例如:

XCHGAX,BX;AX与BX寄存器内容交换

XCHGSI,AX;SI与AX内容交换

XCHGAL,BL;AL与BL内容交换

XCHGWORDVAR,CX;变量WORD_VAR与CX寄存器内容交

XCHGDH,BYTE_VAR;DH与变量BYTE_VAR内容交换

XCHG[SI+3],AL;DS:[SI+3]所指的内容与AL内容交换

南开大学朱耀庭

6.3数据交换指令^^1

。注意:

⑴XCHG指令不影响状态标志。

0)操作数可以是通用寄存器和存储器,但不包括段寄存

翱,也不能为立即数。

(3)源操作数和目的操作数不能同时为存储器,因此不能

直接实现两个存储器单元的内容交换。若要进行存储器

(字)变量A和存储器(字)变量B的内容交换,可以借用一个

a用寄存器来实现:

MOVAX,B

XCHGAX,A

MOVB,AX

南开大学朱耀庭

6.3数据交换指令

♦:♦如果只用MOV指令则需要用4条指令占用两个通用寄存器

才能实现:

MOVAX,A

MOVBX,B

MOVA,BX

MOVB,AX

。利用堆栈交换存储器变量A和B的内容也是很方便的。利

用下列4条指令即可实现:

PUSHA

PUSHB

POPA

POPB

南开大学朱耀庭

6.3数据交换指令

例6・6数据交换程序实例一

题目:将字符串S1与S2的内容进行交换

设计思路:用XCHG指令实现S1和S2中内容的互换

O源程序EX66asm如下:

DATASEGMENT

DB'ABCDEFG'

S2DB'0123456,

NDW$-OFFSETS2;N为字符串长度

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

START:MOVAX,DATA

MOVDS,AX

MOVSI,0

MOVCX,N;将字符的个数送至CX中

南开大学朱耀庭

0

6.3数据交换指令

。例6・6数据交换程序实例一

L1:MOVAL,S1[SI]

XCHGAL,S2[SI]

MOVS1[SI],AL;借助寄存器AL将S1[SI]与S2[SI]交换

INCSI

LOOPL1;循环N次

MOVCX,N

MOVSI,0

MOVAH,02H

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

INT21H

INCSI

LOOPL2

MOVDL:'

INT21H

MOVCX,N

MOVSI,0

南开大学朱耀庭

6.3数据交换指令

♦:♦例6・6数据交换程序实例一

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

INT21H

INCSI

LOOPL3

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

南开大学朱耀庭

0

6.3数据交换指令

。程序说明:

•使用XCHG指令,源操作数和目的操作数不能同时为存

储器,要实现S1和S2中的内容交换需要借用一个通用寄

存器来实现,如:jiHr

MOVAL,S1[SI]

XCHGAL,S2[SI]

MOVS1[SI],AL

・该程序中N定义为一个字,该字为字符串S2的长度,定

义方法为:

NDW$-OFFSETS2,也可以使用EQU语句定义一

个符号常量

例如,NEQU$-OFFSETS2O

南开大学朱耀庭

0

6.3数据交换指令

。例6・7数据交换程序实例二

。题目:从键盘输入10个字符或数字。〜9,利用冒泡排序法

进行排序输出。例如,输入6738421905,贝"输出

0123456789o

。燧计思蹬*冒想走序算满期1型簟盾”实现,送入内层

宿环芝前需要先蒋ex中的制容保存,内层循环解泉后再

恢复CX中的内容,可以使用PUSH和POP指令来实现,也

可以将CX中的内容先保存在其他寄存器中。

源程序EX6・7.asm如下:

DATASEGMENT

S1DB10DUP(?)

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA;确定CS/DS指向的逻辑段

南开大学朱耀庭

6.3数据交换指令

。例6・7数据交换程序实例二

START:MOVAX,DATA

MOVDS,AX;设置数据段的段地址DS

MOVSI,OFFSETS1

MOVCX,10

MOVAH,01H;将1送入AH中,请求DOS功能调用

L1:INT21H;从键盘读入一个字符,并存放在AL中

MOV[SI],AL;AL中的内容送入[SI]

INCSI;SI加1

LOOPL1

MOVAH,2

MOVDL,ODH

INT21H

MOVDL,OAH

INT21H;AH=02H,输出回车换行

MOVCX,9;只需要进行9次循环

南开大学朱耀庭

6.3数据交换指令

。例6・7数据交换程序实例二

L2:MOVBX,CX的内容保存至BX

MOVSl,0;从数组的第一个开始

L3:MOVAL,S1[SI]

CMPS1[SI+1],AL;两个数比较

JGEL4;大于等于则转到L4

XCHGS1[SI+1],AL;两数交换

MOVS1[SI],AL

L4:INCSI

LOOPL3

MOVCX,BX;恢复外层循环的CX

LOOPL2

南开大学朱耀庭

6.3数据交换指令

。例6・7数据交换程序实例二

MOVCX,10;循环输出排序后的结果

MOVSI,0

MOVAH,2

L5:MOVDL,S1[SI]

INT21H

INCSI

LOOPL5

MOVAH,4CH;结束程序,返回DOS功能调用

INT21H

CODEENDS;代码段结束

ENDSTART;汇编结束,程序起始点为

START

南开大学朱耀庭

6.3数据交换指令

。程序说明:

•输入的字符或数字先存放在S1所指的10个字节的存储

单元中,利用DOS1#功能调用从键盘读入字符。

•该程序中用到了比较指令CMP和条件转移指令JGE,

CMP指令可以对字节或字进行比较,JGE表示大于等于则

转移到其后边的标号处,如程序中:

CMPS1[SI+1],AL

JGEL4

*表示对S1[SI+1]和寄存器AL中的内容进行比较,如果目

的操作数S1[SI+1]大于等于源操作数AL,则指令跳

转到标号L4如,否则继续执行JGEL4后继指令。CMP指

令和条件转移指令的功能和用法将在第9章中详细

介绍。

南开大学朱耀庭

6.4查表转换指令

♦:♦查表转换指令XLAT的格式和功能如下所示:

。格式:XLAT换码表

。功能:换码表中的一个字节,称为换码字节,用换码字节

来置换累加器AL中的内容。此指令要求换码表的表首由

DS:BX指向,要换的码在表中的位移由寄存器AL中的内

容指出。即执行该指令前换码表的表头起始地址在DS段

的位移是BX的位置,换码字节在表中的位移在AL中,执

行指令后即将表中要换的码置入AL中,即

DS:[BX+AL]一AL。换码过程示意图如图6・3所示。换码

表长度不得超过256个字节。

南开大学朱耀庭

6.4查表转换指令

执行前:执行后:

DS:BX

AL—►演示动画

AAL

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

南开大学朱耀庭

0

6.4查表转换指令

。例6・8查表转换实例一

。题目:输出十六进制对应的ASCH码

设计思路:利用XLAT指令将计算机机内二进制表示的十

六进制转换成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

南开大学朱耀庭

0

6.4查表转换指令

。例6・8查表转换实例一

L:MOVAL,[SI]

XLATTABLE嵌码DSRBX+AL]一AL

MOVDL,AL

MOVAH,02H;显示输出

INT21H

MOVDL,"

INT21H

INCSI

LOOPL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

南开大学朱耀庭

0

6.4查表转换指令

♦:♦程序说明:

・数据段中定义换码表TABLE为十六进制的ASCH码。0,

1,・・・,16对应的ASCH码表为30H,31H,32H,33H,

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

44H,45H,46Ho

或简写成'0123456789ABCDEF'。

・为了在AL中能得到0,1,2,…9,A,…,F,也需要在

数据段中定义,该程序在HEX_NUM中依次存放。

・进行换码之前,换码表的表头整始地址在BX中,如程序中:

MOVBX,OFFSETTABLE,换码字节在表中的位移在

AL中,如程序中:MOVAL,[SI],然后再进行换码转换

XLATTABLEo

南开大学朱耀庭

0

6.4查表转换指令

。例6・9查表转换实例二

。题目:编写一个程序从键盘读入4位原码,然后输出其相

应的密码。例如,输入9357,输出应该为6209。

。设计思路:已知一个汉字的电报码由4位数字组成,现在

已经知道有一种简单的加密方法是利用如下对应关系进行

加密的。

。原码0,1,2,3,4,5,6,7,8,9分别对应密码3,7,

4,2,1,0,5,9,8,6(当然也可以是其他的一一对

应关系)。将密码表存放在MIMAB字段,用XLAT指令实

现原码到密码的转换,原码到密码查表转换过程如图6・4

所示。

南开大学朱耀庭

0

6.4查表转换指令

。例6・9查表转换实例二

。题目:编写一个程序从键盘读入4位原码,然后输出其相

应的密码。例如,输入9357,输出应该为6209。

。设计思路:已知一个汉字的电报码由4位数字组成,现在

已经知道有一种简单的加密方法是利用如下对应关系进行

加密的。

。原码0,1,2,3,4,5,6,7,8,9分别对应密码3,7,

4,2,1,0,5,9,8,6(当然也可以是其他的一一对

应关系)。将密码表存放在MIMAB字段,用XLAT指令实

现原码到密码的转换,原码到密码查表转换过程如图6・4

所示。

南开大学朱耀庭

6.4查表转换指令

演示动画

图6・4原码到密码转换过程示意图

南开大学朱耀庭

6.4查表转换指令

源程序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;高位清零

南开大学朱耀庭

6.4查表转换指令

♦:♦源程序EX6・9.asm如下:

XLATMIMAB

MOV[SI],AL;将密码存入MIMA所在的存储单元中

INCSI

LOOPL1

MOVCX,4

LEASI,MIMA

MOVAH,2

MOVDL,0DH

INT21H

MOVDL.OAH

INT21H

L2:MOVDL,[SI];循环输出密码

INT21H

INCSI

LOOPL2

MOVAH,4CH

INT21H

ENDBEGIN

南开大学朱耀庭

6.5地址目标传送指令

LEA指令(LoadEffectiveAddress)

LDS指令(LoadpointerintoDS)

LES指令(LoadpointerintoES)

南开大学朱耀庭

1.LEA指令(LoadEffectiveAddress)

。该指令称为有效地址传送指令

格式:LEA目的操作数,源操作数

功能:把源操作数的有效地址传送至目的操作数寄存器

说明:其中,目的操作数为16位的通用寄存器(即AX,BX,

CX,DX,SP,BP,SI,DI之一);源操作数是存储器操作数,

如变量、标号或地址表达式

♦:♦例如:

LEABX,BUFFER;将变量BUFFER的位移量送入BX中

LEADX,BUFARRAY[BX][SI];将数组元素的位移量送入DX中

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

南开大学朱耀庭

1.LEA指令(LoadEffectiveAddress)

♦:♦注意:

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

变量的内容(即变量的值)。

(2)LEA指令和MOV指令有本质上的区别。假设变量

BUFFER的偏移是1000H,该字变量的值是4243H,贝U指

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

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

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

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

BUFFER”将变量BUFFER的位移量送入AX中。

南开大学朱耀庭

1.LEA指令(LoadEffectiveAddress)

♦:♦注意:

(3)LEA指令的源操作数可以带下标,即LEA指令可以传

送任意数组元素的位移量。例如指令“LEADX,

BUFARRAY[BX][S『是将数组元素BUFARRAY[BX][SI]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论