文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言程序设计

汇编语言程序设计



第4章 汇编语言程序设计基本方法

4.1 学习指导


详细介绍8086、8088 CPU指令系统的使用,包括指令的功能、寻址方式及其书写格式、
对标志位的影响、使用注意事项。对汇编程序设计所必需的伪指令进行详细讨论,说明了汇
编程序的完整结构。通过由易到难、由浅到深的大量例子介绍了顺序结构、分支结构、循环
结构和子程序设计的基本方法,通过学习掌握变量、常量及伪指令的使用和一些常用的基本
程序设计方法。在分支程序设计中,要特别注意每个分支的完整性和分支条件的合理使用;
在循环程序设计中,掌握循环程序的基本结构,特别注意应避免出现死循环;在子程序设计
中,着重掌握参数的各种传递方式及其实现,对堆栈这种特殊的存储区域进行了详细的描述,
切实掌握堆栈的使用。宏指令与字符串操作是汇编语言设计中的两个难点,教材中对此也作
了详细的介绍,要求掌握正确使用宏指令和字符串操作指令。

教材中简要介绍了DOS功能调用的使用方法和常用的一些DOS功能,要求能熟练使用
INT 21H 的01,02,09,0AH,4CH号等功能。

4.2 补充知识


1. 伪指令DW,DD的特殊用法
变量名1 DW 标号(或变量名2)±常数

变量名3 DD 标号(或变量名4)±常数




定义的<变量名1>为字型地址指针,其内容为<标号±常数>或<变量名2±常数>的段内偏移
地址;定义的<变量名3>为双字型地址指针,其内容为<标号±常数>或<变量名4±常数>的
段内偏移地址和段地址, 例如:

AD1 DB 100 DUP(?) ;设变量AD1逻辑地址为0100:2157

AD2 DW AD1 ;变量AD2内容为:2157H

AD3 DD AD1 ;变量AD3内容为:2157H,0100H

2. MOV指令传送图
MOV指令可在立即数、通用寄存器、段寄存器、存储器之间传送数据,其传送路径可参
见教材的图4.3。



需要特别注意的是,利用MOV指令不能直接传送的路径有5条:(1)立即数→段寄存
器;(2)存储单元→存储单元;(3)段寄存器→段寄存器;(4)其它→CS;(5)其它
→立即数。除最后两条路径外,前三条路径可分两步实现,例如要将立即数12A6H传
送到段寄存器DS,应分两步:

MOV AX,12A6H

MOV DS,AX




需要说明的是,MOV指令的这种传送路径也适用于其它的双操作数指令,如ADD,ADC,
SUB,SBB等指令。

3. 操作数类型



对于一个操作数的类型,下列几点值得注意:

(1)立即数无类型;

(2)不含变量名的直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、
基址变址且相对寻址的操作数为无类型;

(3)利用PTR操作符可暂时改变存储单元的类型。

对于

双操作数指令,两个操作数的类型必须匹配:

(1)两者都指定了类型,则必须一致,否则指令出错(类型不一致);

(2)两者之一指定了类型,一般指令无错;

(3)两者都无类型,则指令出错(类型不定)。


4. 汇编语言指令




在汇编语言程序设计中,有三类指令:指令、伪指令和宏指令。

指令:汇编后形成一条机器语言指令,指示CPU进行各种操作。它在程序执行时得到运
行,它与机器语言指令一一对应。

伪指令:它只告诉汇编程序(MASM.EXE)应如何汇编,而本身并不形成机器语言指令。
它在源程序汇编的过程中运行。

宏指令:这是用户自己定义的指令,它由指令、伪指令构成,并在汇编过程中进行宏展
开。它也是一种伪指令,没有对应的机器语言指令。

5. 汇编语言程序设计的一般步骤


(1)分析问题:从实际问题中提取数学模型,明确任务要求及目的;

(2)确定算法:根据问题确定算法,画出程序流程框图;

(3)编写程序:根据流程框图和CPU的指令系统,利用汇编语言编写程序;

(4)调试程序:通过在计算机上汇编、连接后得到可执行文件,选取一组典型的数据,
在DEBUG下调试程序,如有错则返回修改源程序;直至程序运行得到正确的结果;

(5)编写说明:对每个程序都应该编写其说明文件,包括程序使用的前提、用法、典
型示例等。

6. 分支条件的合理选择


条件转移指令的转移范围为-128~+127,因此经常会遇到转移超出范围的错误,这时
应与JMP(无条件转移)指令配合使用。例如:

CMP AL,BL

JG great

MOV AL,BL

……

但标号great与指令JG great之间的距离超出条件转移指令的转移范围,这时应找出JG
指令的相反指令JNG或JBE,采用下列方法实现:

CMP AL,BL

JBE middle

JMP graet

Middle:

MOV AL,BL

……




4.3 典型例题


例4.1 写出下列变量的内容:

VAR1 DB 125,125/3, -1, -10H

VAR2 DW 125, 125/3, -1, -10H

VAR3 DB ‘AB’, ‘CD’

VAR4 DW ‘AB’, ‘CD’

解:按十六进制数依次写出各个变量的内容为:

VAR1:7D,29,FF,F0

VAR2:007D,0029,FFFF,FFF0

VAR3:41,42,43,44

VAR4:4142,4344

按内存存储顺序给出:

7D,29,FF,F0,7D,00,29,00,FF,FF,F0,FF,41,42,43,44,42,41,44,43

例4.2 设有下列伪指令:

START DB 1,2,3,4,’ABCD’

DB 3 DUP(?,1)

BUF DB 10 DUP (?),15

L EQU BUF-START

求L的值。

解:由EQU伪指令知,L的值为BUF的偏移地址减去START的偏移地址,而变量START
共占用8个字节,第2

行定义的变量(无变量名)共占用6个字节,因此,L的值为8+6=14=0EH。

例4.3 在缓冲区DATABUF中保存有一组无符号数据(8位),其数据个数存放在DATABUF
的第1、2个字节中,要求编写程序将数据按递增顺序排列。(与教材p.114例4.3.10类似,
但方法不同)

解:这里采用双重循环实现数据的排序,这可使程序变得简单。

N=100 ;设有100个数据

STACK SEGMENT STACK ‘STACK’

DW 100H DUP(?)

TOP LABEL WORD

STACK ENDS

DATA SEGMENT

DATABUF DW N

DB N DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

LEA SP,TOP

; 取出随机数据

MOV CX,DATABUF

LEA SI,DATABUF+2

MOV BL,23

MOV AL,11

LP:


MOV [SI],AL

INC SI

ADD AL,BL

LOOP LP

; 数据排序

MOV CX,DATABUF

DEC CX

LEA SI,DATABUF+2

ADD SI,CX

LP1:

PUSH CX

PUSH SI

LP2:

MOV AL,[SI]

CMP AL,[SI-1]

JAE NOXCHG

XCHG AL,[SI-1]

MOV [SI],AL

NOXCHG:

DEC SI

LOOP LP2

POP SI

POP CX

LOOP LP1

;数据排序结束

MOV AH,4CH ;返回DOS

MOV AL,0

INT 21H

CODE ENDS

END START



例4.4 (97年考研题)有一组数据(16位而进制数)存放在缓冲区BUF1中, 数据个
数保存在BUF1的头两个字节中。要求编写程序实现在缓冲区中查找某一数据,如果缓冲区
中没有该数据,则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的数据,则只保留
第一个,将其余的删除。

解:在缓冲区BUF中搜索指定的数据,当没有找到时,插入该数据;当找到时,进入
搜索多余的重复数据,每找到一个就删除它(将缓冲区的剩余数据向前移动一个字)。当然
应注意更新缓冲区的长度单元。

STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)

TOP LABEL WORD

STACK ENDS

; 设缓冲区原有10个字,指定的数据为(NEW)=56AAH

DATA SEGMENT

BUF DW 10

DW 1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H,10A7H,0B612H

DW 10 DUP(?)

NEW DW 56AAH

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX


MOV AX,STACK

MOV SS,AX

LEA SP,TOP

;搜索指定的数据

MOV CX,BUF

LEA SI,BUF+2

MOV AX,NEW

L1:

CMP AX,[SI]

JZ L2

.......INC SI

INC SI

LOOP L1

;没有找到,则插入数据

MOV [SI],AX

INC BUF

JMP OK

;找到后,在剩余部分搜索重复的数据

L2:

DEC CX

INC SI

INC SI

L3:

CMP AX,[SI]

JZ L4

INC SI

INC SI

LOOP L3

JMP OK

;找到一个重复数据,则删除它

L4:

PUSH SI

DEC CX

PUSH CX

MOV DI,SI

INC SI

INC SI

CLD

REP MOVSW

DEC BUF

POP CX

POP SI

JMP L3 ;删除后,返回继续搜索重复的数据

OK:

MOV AH,4CH ;返回DOS

MOV AL,0

INT 21H

CODE ENDS

END START



例4.5 (98年考研题)在缓冲区DAT1和DAT2中,存放着两组递增有序的8位二进
制无符号数,其中前两个字节保存数组的长度,要求编程实现将它们合并成一组递增有序的
数据DAT,DAT的前两个字节仍用于保存数组长度。

解:这里要用到3个指针的使用。对于写指针首选使用DI,两个读指针可采用SI和
BX,分别指示DAT1和DAT2。这样可适时使用字符串指令,以简化程序设计。

在设计中,将用BX指示的缓冲区DAT2内容读入AL,这样,当要将DAT1的内容传送到
DAT时,可采用MOVSB指令;当要将DAT2的内容传送到DAT时,可采用STOSB指令。


STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)

TOP LABEL WORD

STACK ENDS

;设DAT1中有10个数据,DAT2中有13个数据

DATA SEGMENT

DAT1 DW 10

DB 10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6H

DAT2 DW 13

DB 05,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEH

DAT DW ?

DB 200 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

LEA SP,TOP

MOV CX,DAT1

MOV DX,DAT2

MOV DAT,CX

ADD DAT,DX

LEA SI,DAT1+2

LEA BX,DAT2+2

LEA DI,DAT+2

CLD

L1:

MOV AL,[BX]

INC BX

L2:

CMP AL,[SI]

JB L3

MOVSB ;DAT1区中的数据传送到DAT区

DEC CX

JZ L4

JMP L2

L3:

STOSB ;DAT2区中的数据传送到DAT区

DEC DX

JZ L5

JMP L1

L4:

MOV SI,BX

DEC SI

MOV CX,DX

L5:

REP MOVSB

MOV AH,4CH ;返回DOS

MOV AL,0

INT 21H

CODE ENDS

END START

例4.6 (99年考研题)已知缓冲区BUFA内有20个互不相等的整数(其序号从0
到19),缓冲区BUFB内有30个互不相等的整数(其序号从0到29)。编写程序完成:将既


在BUFA中出现又在BUFB中出现的整数(设为x)存放在缓冲区BUFC中,并将x在BUFA和
BUFB中的序号分别存放于缓冲区BUFCA和BUFCB中。

解:这里需要5个指针,但BUFC、BUFCA和BUFCB为同步操作,只需要一个指针,寻
址方式为寄存器相对寻址,即(设AL为找到的值,DL、BL为序号)

MOV BUFC[DI],AL

MOV BUFCA[DI],DL

MOV BUFCB[DI],BL

对序号也应小心处理,我们采用寄存器相对寻址,例如MOV AL,BUFA[SI],其中SI即
为序号。

STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)

TOP LABEL WORD

STACK ENDS

N1=20

N2=30

DATA SEGMENT

BUFA DB 10H,25H,67H,26H,68H,73H,83H,58H,0,06H,12H,0CDH,95H

DB 0A8H,

0C2H,48H,0E6H,0F1H,1AH,0F5H

BUFB DB 05,12H,26H,45H,53H,60H,6AH,7FH,76H,88H,92H,0C1H,0DEH,0E1H,0F5H

DB 09,17H,23H,48H,58H,65H,67H,70H,7CH,82H,96H,0CDH,0D1H,0F1H,0FEH

BUFC DB 20 DUP(?)

BUFCA DB 20 DUP(?)

BUFCB DB 20 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

LEA SP,TOP

;以BUFA为外循环,每个字节与BUFB的所有字节比较(构成内循环),

;以确定是否存在相同的值。

MOV CX,N1

XOR SI,SI

XOR DI,DI

L1:

MOV AL,BUFA[SI]

PUSH CX

MOV CX,N2

XOR BX,BX

L2:

CMP AL,BUFB[BX]

JZ L3

INC BX

LOOP L2

JMP L4

;找到相同的值后,进行值传送和序号保存。

L3:

MOV BUFC[DI],AL

MOV DX,SI

MOV BUFCA[DI],DL

MOV BUFCB[DI],BL

INC DI


L4:

POP CX

INC SI

LOOP L1

MOV AH,4CH ;返回DOS

MOV AL,0

INT 21H

CODE ENDS

END START





4.4 习 题


1. 写出完成下列要求的变量定义语句:
(1)在变量var1中保存6个字变量:4512H,4512,-1,100/3,10H,65530;

(2)在变量var2中保存字符串:’BYTE’, ’word’, ’WORD’;

(3)在缓冲区buf1中留出100个字节的存储空间;

(4)在缓冲区buf2中,保存5个字节的55H,再保存10个字节的240,并将这一过
程重复7次;

(5)在变量var3中保存缓冲区buf1的长度;

(6)在变量pointer中保存变量var1和缓冲区buf1的偏移地址。


2. 设变量var1的逻辑地址为0100:0000,画出下列语句定义的变量的存储分配图:




var1 DB 12,-12,20/6,4 DUP(0,55H)

var2 DB ‘Assemble’

var3 DW ‘AB’, ‘cd’, ‘E’

var4 DW var2

var5 DD var2

3. 指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因(设
VAR1, VAR2为字变量, L1为标号):


(1)MOV SI,100 (2)MOV BX,VAR1[SI]

(3)MOV AX, [BX] (4)MOV AL, [DX]

(5)MOV BP, AL (6)MOV VAR1, VAR2

(7)MOV CS, AX (8)MOV DS, 0100H

(9)MOV [BX][SI], 1 (10)MOV AX, VAR1+VAR2

(11)ADD AX, LENGTH VAR1 (12)OR BL, TYPE VAR2

(13)SUB [DI], 78H (14)MOVS VAR1, VAR2

(15)PUSH 100H (16)POP CS

(17)XCHG AX, ES (18)MOV DS, CS

(19)JMP L1+5 (20)DIV AX, 10

(21)SHL BL, 2 (22)MOV AL, 15+23

(23)MUL CX (24)XCHG CL, [SI]

(25)ADC CS:[0100], AH (26)SBB VAR1-5,154

4. 说明下列指令对的区别:
(1)MOV AX,VAR1 与 MOV AX,OFFSET VAR1
(2)MOV AX,VAR2 与 LEA AX,VAR2
(3)MOV AL,LENGTH VAR1 与 MOV AL,SIZE VAR1
(4)MOV AL,ES: [DI] CMP AL, [SI]
与 CMPSB







(5)SHR AL,1 与 SAR AL,1
(6)SHR AL,1 与 ROR AL,1

(7)ROL BX,1 与 RCL BX,1


5. 写出下列转移指令的寻址方式(设L1为标号,VAR1为字型变量,DVAR1为双字型变
量):


(1)JMP L1 (2)JMP NEAR L1

(3)JNZ L1 (4)JMP BX

(5)JG L1 (6)JMP VAR1[SI]

(7)JMP FAR PTR L1 (8)JMP DVAR1

6. 设(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=3412H,(20102)=
7856H,(21200)=4C2AH,(21202)=65B7H,求下列指令执行后AX寄存器的内容:


(1)MOV AX,1200H; (2)MOV AX,BX; (3)MOV AX, [1200H];

(4)MOV AX, [BX]; (5)MOV AX,1100[BX];(6)MOV AX, [BX][SI];

(7)MOV AX,1100[BX][SI]

7. 执行下列指令后,DX寄存器中的内容是多少?
TABLE DW 25,36,-1,-16,10000,13

PYL DW 7

……

MOV BX,OFFSET TABLE

ADD BX,PYL

MOV DX,[BX]


8. 如果堆栈的起始地址为2200:0000,栈底为0100H,(SP)=00A8H,求
(1)栈顶地址;

(2)SS的内容;




(3)再存入数据5678H,3AF2H后,SP的内容。

9. 设已用伪指令EQU定义了4个标识符:
N1 EQU 2100

N2 EQU 10

N3 EQU 20000

N4 EQU 25000




下列指令是否正确?并说明原因。

(1)ADD AL,N1-N2; (2)MOV AX,N3+N4;

(3)SUB BX,N4-N3; (4)SUB AH,N4-N3-N1;

(5)ADD AL,N2; (6)MOV AH,N2*N2

10. 按下列要求写出指令:
(1)将AX寄存器的低4位清零,其余位不变;

(2)将BX寄存器的低4位置1,其余位不变;

(3)将AL寄存器的低4位保持不变,高4位取反;

(4)测试BX中的位1和位2,当这两位同时为0时将AL置0FFH,否则AL清零;

(5)测试BX中的位1和位2,当这两位有一位为0时将AL置0FFH,否则AL清零;

(6)将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码;

(7)将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码;

(8)将AX中的各位取反;

(9)将DX中的低7位取反,高9位不变;





(10)将CX中的低8位与高8位互换。

11. 写出完成下述功能的程序段:
(1)传送40H到AL寄存器;

(2)将AL的内容乘以2;

(3)传送16H到AH寄存器;

(4)AL的内容加上AH的内容。

计算最后结果(AL)=?


12. 写出完成下述功能的程序段:
(1)从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器;

(2)将AX寄存器的内容右移2位;

(3)将AX内容与BUF的0006偏移地址处的一个字相乘;

(4)相乘结果存入BUF的0020H偏移地址处(低位在前)。


13. 设(BX)=11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX
的内容:
(1)XOR BX,VAR; (2)AND BX,VAR;

(3)OR BX,VAR; (4)XOR BX,11110000B;

(5)AND

BX,00001111B; (6)TEST BX,1。


14. 设(DX)=10111011B,(CL)=3,(CF)=1,求下列指令单独执行后DX的内容:
(1)SHR DX,1; (2)SAR DX,CL; (3)SHL DX,CL;

(4)SHL DX,1; (5)ROR DX,CL; (6)ROL DL,CL;

(7)SAL DH,1; (8)RCL DX,CL; (9)RCR DL,1


15. 选择题(各小题只有一个正确答案)
(1)执行下列三条指令后:




MOV SP,1000H

PUSH AX

CALL BX

a. (SP)=1000H; b. (SP)=0FFEH;

c. (SP)=1004H; d. (SP)=0FFCH;

(2)要检查寄存器AL中的内容是否与AH相同,应使用的指令为:

a. AND AL, AH b. OR AL, AH

c. XOR AL, AH d. SBB AL, AH

(3)指令JMP NEAR PTR L1与CALL L1(L1为标号)的区别在于:

a. 寻址方式不同; b. 是否保存IP的内容;

c. 目的地址不同; d. 对标志位的影响不同。

16. 寄存器DX:AX组成32位数,DX为高位,编写程序段实现:
(1)DX:AX右移3位,并将移出的低3位保存在CL中;

(2)DX:AX左移3位,并将移出的高3位保存在CL中;


17. 已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字
符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。
18. 利用移位、传送和相加指令实现AX的内容扩大10倍。
19. 在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;



如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。
20. 编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL=01011101B时,得到的(DX)=0F0FH,(AX)=0FF0FH。
21. 编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例
如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=10110110 10011001B。
22. 在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实
现:
(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;




(2)当两数均为奇数时,两个变量的内容不变;

(3)当两数均为偶数时,两数缩小一倍后存入原处。

23. 已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写
程序段找出这个错码,并将它送AX,其地址送SI;如果3个代码都相同,则在AX中
置-1标志。
24. 分析下列程序段的功能:
MOV CL,04

SHL DX,CL

MOV BL,AH

SHL AX,CL

SHR BL,CL

OR DL,BL


25. 下列程序段执行后,求BX寄存器的内容:
MOV CL,3

MOV BX,0B7H

ROL BX,1

ROR BX,CL


26. 下列程序段执行后,求BX寄存器的内容:
MOV CL,5

MOV BX,7D5CH

SHR BX,CL




27. 设数组ARRAY的第1个字节存放数组的长度(<256),从第2个字节开始存放无符号
8位数,求数组元素之和(结果放在AX中)。如果计算的和超出16位数的范围,则给
出溢出标志DX=-1。
28. 设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)
和最大值(存入DX)。
29. 设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的
0元素抹去,并更新其长度。
30. 编写程序实现N个字乘以或除以1个字,设BUFN存放N个字,BUF1存放乘数或除
数,PRODUCT存放乘积,QUOTIENT存放商,REMAINDER存放余数。
31. 编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个
数相等的元素个数。
32. 设有n(设为17)个人围坐在圆桌周围,按顺时针给他们编号(1,2,…,n),从第1个



人开始按顺时针方向加1报数,当报数到m(设为11)时,该人出列,余下的人继续
进行,直到所有人出列为止。编写程序模拟这一过程,求出出列人的编号顺序。
33. 编写子程序实现以十六进制数在屏幕上显示AL的内容。
34. 从键盘上读入一个正整数N(0≤N≤65535),转换成十六进制数存入AX,并在屏幕上
显示出来。
35. 在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字
符的ASCII码,编写子程序完成在最高位给字符加上偶校验。
36. 编写程序完成求多位数(N个字)的绝对值。
37. 已知斐波那契数列的定义为:)3(,1,12121≥+===..iFFFFFiii,编写求该
数列前n项的子程序。
38. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。
39. 编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负
数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。
40. 编写程序实现求缓冲区BUFFER100个字中的最小偶数(存入AX)。
41. 编写程序实现求级数LL++++22221n的前n项和刚大于2000的项数n。
42. 已知数组A中包含有15个互不相等的整数,数组B中包含有20个互不相等的整数,
编写程序实现将既在数组A中出现又在数组B中出现的整数存放于数组C中。
43. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能。
44. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H的09号功能)。
45. 定义一条宏指令,实现在屏幕上显示出指定的字符串。
46. 定义一条宏指令,实现在屏幕上输出回车、换行。
47. 利用其它指令完成与下列指令一样的功能:
(1)REP MOVSB; (2)REP LODSB;

(3)REP STOSB; (4)REP SCASB。


48. 设在数据段中定义了:
S

TR1 DB ‘ASSEMBLE LANGUAGE’




STR2 DB 20 DUP(?)

利用字符串指令编写程序段实现:

(1)从左到右将STR1中的字符串传送到STR2;

(2)从右到左将STR1中的字符串传送到STR2;

(3)将STR1中的第6个和第7个字节装入DX;

(4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI。

49. 设在数据段中定义了:
STRING DB ‘Today is Sunday & July 16, 2000’

编写程序实现将STRING中的’&’用’/’代替。


50. 分析下列程序段完成的功能:
MOV CX,100





LEA SI,FIRST

LEA DI,SECOND

REP MOVSB


51. 分析下列程序段:
LEA DI,STRING

MOV CX,200

CLD

MOV AL,20H

REPZ SCASB

JNZ FOUND

JMP NOT_FOUND




问:转移到FOUND的条件。

52. 设在数据段的变量OLDS和NEWS中保存有5个字节的字符串,如果OLDS字符串不
同于NEWS字符串,则执行NEW_LESS,否则顺序执行程序。
53. 编程实现将STRING字符串中的小写字母变换成大写字母。
54. 设在数据段中定义了:
STUDENT_NAME DB 30 DUP(?)

STUDENT_ADDR DB 9 DUP(?)

STUDENT_PRINT DB 50 DUP(?)

编写程序实现:

(1)用空格符清除缓冲区STUDENT_PRINT;

(2)在STUDENT_ADDR中查找第一个’_’字符;

(3)在STUDENT_ADDR中查找最后一个’_’字符;

(4)如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入’*’;

(5)将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中,将
STUDENT_ADDR传送到STUDENT_PRINT的后9个字节中。


55. 在DS:X_BUF为起始地址的表中存有按由小到大顺序排列的一组16位无符号数,其中
该表的第一、二两字节存放数据个数。现在DS:X_KEY中存有一个关键字(16位无符
号数),要求从上述表中查找第一个此关键字,若找到此关键字,则DI中存放该关键
字在该表中的偏移量;若无此关键字,则将该关键字插入X_BUF表中,使该表仍有序,
并将该关键字在表中的偏移量存放在DI中。
56. 分析下列子程序FUNC1,并回答相应的问题。
FUNC1 PROC NEAR

XOR CX,CX

MOV DX,01

MOV CL,X

JCXZ A20

INC DX

INC DX

DEC CX

JCXZ A20

A10: MOV AX,02

SHL AX,CL





ADD DX,AX

LOOP A10

A20: MOV Y,DX

RET

FUNC1 ENDP




若该子程序的入口参数为X(0≤X≤10),其输出参数为Y,则:

(1) 该子程序的功能是Y=f(X)= ;

(2) 若X=0 , 则Y= ;

若X=3 , 则Y= ;

若X=5 , 则Y= 。



57. 已知N(3从第二个字节开始存放数据,下列的FUNC2子程序完成对这N个数据按由大到小排序,
在划线处填入必要指令,使以下子程序完

整。
FUNC2 PROC NEAR

LEA SI,INX

XOR CX, CX

MOV CL, [SI]

DEC CX

B10: INC SI

MOV DI,SI

PUSH SI



MOV AL,[SI]

B20: INC SI

CMP AL,[SI]



MOV AL,[SI]

MOV DI,SI

B30: LOOP B20

POP CX

POP SI

MOV AH,[SI]

MOV [SI],AL

MOV [DI],AH

LOOP B10



FUNC2 ENDP




58. 假设X和X+2单元的内容为双精度数P,Y和Y+2单元的内容为双精度数Q (P,Q
均为无符号数,其中X,Y为低位数),下列的子程序FUNC3完成使 2P>Q时,(AX)
=1;2P<=Q时,(AX)=-1 ,在划线处填入必要指令,使以下子程序完整。
FUNC3 PROC NEAR

MOV DX,X+2

MOV AX,X

ADD AX,AX

ADC DX,DX





JC C10

CMP DX,Y+2

C20

C10

CMP AX,Y

C20

C10: MOV AX,1

C30

C20: MOV AX,-1

C30: RET

FUNC3 ENDP




59. (上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺
序显示:
数据1 <原序号>

数据2 <原序号>




……

60. (上机题)按同余法产生一组随机数N(1程的成绩,要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各
等级的人数(A:90~100,B:80~89,C:70~79,D:66~69,E:60~65,F:60
分以下),按下列格式显示:
Total <总人数>

A: <人数1>

B: <人数2>

C: <人数3>

D: <人数4>

E: <人数5>

F: <人数6>


61. (上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:
(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大
小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:




<原字符串>例如:abcdgyt0092

<新字符串> ABCDGYT0092

按任一键重做;按Esc键返回主菜单。

(2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字

0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:

<原字符串> The maximum is <最大值>.

按任一键重做;按Esc键返回主菜单。

(3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255),

然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:

<原数值串>


<新数值串>

按任一键重做;按Esc键返回主菜单。

(4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器

HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时

间:HH:MM:SS。

按任一键重新对时;按Esc键返回主菜单。



(5)按数字键“5”,结束程序的运行,返回操作系统。


第5章 多模块程序设计

5.1 学习指导


介绍汇编语言多模块程序设计的基本方法, 要求重点掌握模块间段与段的关系、数据的
交叉访问和标号的交叉引用,了解两种新的数据类型:结构与记录类型。另外,还介绍了汇
编语言程序与BASIC语言、C语言程序的连接问题。这一章为了解的内容,考试时不作要求。

5.2 习 题


1. 有下面两个源程序模块:


模块1:

SSEG SEGMENT STACK

DW 100 DUP(?)

TOP LABEL WORD

SSEG ENDS

DSEG SEGMENT COMMON

VAR DB 50 DUP(?)

DSEG ENDS

ESEG SEGMENT AT 1000H

AREA DW 70 DUP(?)

ESEG ENDS

CSEG SEGMENT PUBLIC

…… } 300H个字节

CSEG ENDS

模块2:

SSEG SEGMENT STACK

DW 50 DUP(?)

TOP LABEL WORD

SSEG ENDS

DSEG SEGMENT COMMON

VECT DB 10

DSEG ENDS

CSEG SEGMENT PUBLIC

…… } 200H个字节

CSEG ENDS

假定连接程序按SSEG、DSEG和CSEG的次序安排各段,栈底从20000H地址开始,请说
明连接后程序在内存中的配置情况。

2. 写出一组语句,指出变量VAR1和远程标号LAB1是外部标识符,变量VAR2和标号LAB2
是本模块定义的、可供其它模块访问的标识符。
3. 在什么情况下EXTRN语句中的标号应赋予NEAR属性?
4. 假设(1)双字变量VAR1、字节变量VAR2和近程标号LAB1在模块1中定义,但供模块
2和模块3使用;(2)字变量VAR3和远程标号LAB2在模块2中定义,而VAR3供模块1
使用,LAB2供模块3使用;(3)远程标号LAB3在模块3中定义,供模块2使用。写出
每个模块必需的EXTRN和PUBLIC语句。
5. 编写程序段实现,模块1中访问模块2中定义的字变量NUM1、NUM2、NUM3和NUMB4。
6. 在单独的模块中编写一远程过程:SEARCH,完成在一个字节数组中查找给定的字节,如
找到则将其在数组中的下标(即数组中的偏移量)返回给变量VAR1;如没有找到则给
变量VAR1返回-1。变量VAR1和数组均为外部标识符(可在主程序模块中定义)。请同
时写出调用此过程的主程序模块。




相关文档
相关文档 最新文档