汇编语言实验指导

更新时间:2024-04-29 23:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇 编 语 言 实 验 习 题 指 导

张彩虹 闫冬梅

长春理工大学计算机科学与技术系

0

目 录

实 验 须 知 .................................................................... 2 实 验 一 DEBUG调试程序的使用 .......................................... 3 实验二 用DEBUG程序调试程序功能段 ............................... 12 实验三 数据串传送和查表程序 ............................................. 19 实验四 汇编语言上机过程及屏幕字符显示程序 .......................... 22 实验五 条件转移指令 ....................................................... 27 实验六 循环程序是设计 ..................................................... 30 实验七 子程序设计 .......................................................... 33 附录:汇编语言试卷一 ...................................................... 34 2004年10月汇编语言试题.................................................. 39 浙江省2004年1月汇编语言程序设计试题 ................................ 45 全国2005年10月汇编语言程序设计试题 ................................. 50 汇编语言试卷一答案 ......................................................... 57

1

实 验 须 知

一、 预习要求

1. 实验前认真阅读实验教程中有关内容,明确实验目的和实验任务。 2. 每次实验前应有预习报告,未预习者不允许参加实验。

预习报告中:对程序设计实验,要求画出程序流程图,编好上机程序;

二、 实验要求

1. 实验是学习“汇编语言程序设计”这门课程的重要环节,实验课请

勿迟到,缺席。

2. 上机时要遵守实验室的规章制度,爱护实验设备。要熟悉与实验相

关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在程序的调试过程中,有意识地学习及掌握DEBUG程序的各种操作命令,以便掌握程序的调试方法及技巧。 3. 程序调试完后,须由实验辅导教师在机器上检查运行结果。 4. 每个实验完成后,结果写入预习报告,完成分析,上交实验教师。

三、 报告要求

每次实验后,应递交一份实验报告,报告中应包括下列内容: 1. 实验名称、实验人姓名、学号、班级、所用的设备号。 2. 实验目的、任务。

3. 各任务程序流程图、程序清单(应加适量注释)。 4. 记录和分析实验结果。

5.据实验目的认真做小结。

2

实 验 一 DEBUG调试程序的使用

一、 实验目的

1. 学习使用DEBUG程序的各种命令。

2. 利用DEBUG学习了解计算机取指令、执行指令的工作过程。 3. 掌握用DEBUG调试自编程序的方法。

二、 实验准备

预备知识:DEBUG的使用.在以后的所有实验中,都将用到DEBUG程序,首先学习一下他的主要用法。

(一)什么是debug?

Debug 是DOS、WINDOWS都提供的实模式(8086方式)程序的调试工具。使用它,可以调试CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序运行。

(二) 我们用到的DEBUG功能

? 用DEBUG的R命令查看、改变CPU中寄存器的内容; ? 用DEBUG的D命令查看内存的内容; ? 用DEBUG的E命令改写内存的内容;

? 用DEBUG的U命令将内存中的机器指令翻译成汇编指令; ? 用DEBUG的T命令执行一条机器指令;

? 用DEBUG的A命令以汇编指令的格式在内存中写入一条机器指令;

DEBUG的命令比较多,有20多个,这是常用的6个。

(三) 进入DEBUG

DEBUG是在DOS方式下使用的程序。我们在进入DEBUG前,应先进入到DOS方式。在WINDOWS下进入DOS方式的方法:

3

在【开始】菜单选择运行命令,如图1.1,打开【运行】框如图1.2输入COMMAND,点击确定按钮

图1.1 选择【运行】命令

图1.2在文本框中输入COMMAND命令

进入DOS后运行DEBUG程序如图1-3

图1.3运行DEBUG程序

图1.4 DEBUG编辑界面

启动成功,显示连接符“-”

(四) 关于使用DEBUG命令的几点说明

(1)在提示符“-”下才能输入命令,在按“回车”后该命令才开始执行;

4

(2)命令是单个字母,命令和参数的大小写可混合输入;

(3)可用F1 、F2 、F3 、INS、DEL、?、?等编辑键,编辑本行命令 (4) 当命令出现语法错误时,将在出错位置显示“?ERROR”

(5) 可用ctrl+c 或ctrl+break 来终止当前命令的执行,还可以用ctrl+s 来暂停屏幕显示(当连续不断地显示信息时) (6)DEBUG使用的数以十六进制来表示; (7)DEBUG中的命令不区分大小写;

(五)几个常用命令

1、R 命令(Register)

格式1:R

功能1:显示所有寄存器中的内容.

图1.5 用R命令显示寄存器的内容

格式2: R 寄存器名

功能2: 显示修改寄存器的内容 例如打入:-R AX

系统将响应如下:AX 0000

表示AX当前内容为0000,此时若不对其作修改,可按ENTER键,否则,打入修改后内容。如图1-6:

图1.6用R命令修改寄存器的内容

5

2、 D 命令

用DEBUG的D命令查看内存的内容; 功能: 显示内存单元内容

输入D命令,执行结果如图1.7

图1.7 D命令执行结果

说明:

(1) XXXX:YYYY-----前者是内存单元的段地址,后者是内存单元的

偏移量;

(2) 中间显示区域时内存单元内容(十六进制形式),每行显示16个

字节的内容;

(3) 右边以“字符”形式显示内存单元值。 格式一:D起始位置

DEBUG从起始位置显示128个字节的内容。输入命令D 0C0B:100 执行结果如图:1.8

图1.8 D 0C0B:100命令的执行结果

格式二:D 起始位置 结束位置

DEBUG 从起始位置一直显示到结束位置。输入命令D DS:100 11F,执行结果如图1.9 所示

6

图1.9命令 D DS:100 11F 执行结果

格式三: D 起始位置 L 长度

DEBUG 从起始位置开始显示指定长度的内容。输入命令D DS:100 L10 执行结果如图1.10

图1.10命令 D DS:100 L1命令执行结果

3.E 命令

用DEBUG的E命令改写内存的内容; 格式一:E 起始地址 字节值表

功能:用字节值表中的值替换从“起始地址”开始的内存单元内容 或 E 起始地址

输入命令:E1AF5:0100,连续输入12、34(空格)、56(空格)、(空格)、78(回车);在输入命令D1AF5:0100 ,执行结果如下图1.11:

图1.11命令D 1AF5:0100 ,执行结果

7

格式二:E 起始地址

功能:采用提问的方式一个一个地改写内存单元的内容

图1.12 命令 E 1AF5:0100执行结果

(4)A命令

功能:输入汇编指令。 格式:A 起始地址

首先用A命令以汇编语言的形式输入程序,以D命令显示内存,从下图可以看到我们输入的是汇编指令,DEBUG 把它们翻译成机器指令,以机器码写入内存。

图1.13 用A命令写入程序

图1.14 从一个预设的地址开始输入指令

(5)U 命令

功能:反汇编,显示机器码所对应的汇编指令

格式1:U[地址]

功能1:从指定地址开始反汇编

8

图1.15 U命令执行结果

格式2:U 地址范围

功能2:对指定的地址范围进行反汇编.

图1.16 U100 108 命令执行结果

(6)T命令

格式:T[=地址] 功能:从指定地址起执行一条语句后停下来,显示所有寄存器的内容及标志位的值与下一条将要执行的指令

9

图1.17 T命令执行结果

格式:T[=地址][x]

功能:从指定的地址开始跟踪x 条指令

图1.18 命令T=100 2 执行结果

(7)Q 命令

功能:退出DEBUG程序,返回DOS

图1.19 Q命令执行结果

三、实验任务

1、 2、

参照实验准备,掌握DEBUG程序的各种命令,重点是命令R,D ,A,

U,T,E命令的使用

按照以下步骤输入一系列的命令和指令,编写出简单的汇编语言指令,

并完成指定任务。

??debug -e200

XXXX:0200 XX.10 XX.20 XX.30 XX.. 40 (将200H~203H 内容改为

10H~40H )

10

-e150

XXXX:0150 XX.00 XX.01 -a100

XXXX:0100 MOV AX,CS (01) XXXX:0102 MOV DS,AX (02) XXXX:0104 MOV BX,100 (03) XXXX:0107 MOV AX,[150] (04) XXXX:010A ADD BX, ,AX (05) XXXX:010C MOV AL,[BX] (06) XXXX:010E ADD AL, [BX+1] (07) XXXX:0111 MOV SI,2 (08) XXXX:0114 MOV AL,[BX+SI] (09) XXXX:0116 MOV AH,0 (10) XXXX:0118 MOV CH,0 (11) XXXX:011A MOV CL,[BX+SI+1] (12) XXXX:011D ADD AX,CX (13) XXXX:011F INT 20

(1) 用D命令显示XXXX:0200 ---XXXX:0203单元内容

(2) 指出以上汇编语言指令中源操作数使用的是什么寻址方式? (3) 用T命令单步跟踪,观察指令的执行结果,并记录

3、 查看内存单元内容,pc机主板上的ROM中写有一个生产日期,在内存

FFF00H-FFFFFH 的某几个单元中,请找到这个生产日期并试图改变它 4、 向内存从B8100H开始的单元中填写数据,如:

-e b810:0000 01 01 02 02 03 03 04 04

四、 实验报告要求

把实验任务中要求的各项记录到预习报告上,完成预习报告,作为实验报告上交

五、 实验小结

实验报告的最后一项,写出本次实验小结

11

实验二 用DEBUG程序调试程序功能段

一 、实验目的

1. 继续学习使用DEBUG程序的各种命令。

2. 利用DEBUG学习了解计算机取指令、执行指令的工作过程。 3. 掌握8086/8088基本指令的使用方法和功能。

二 、实验准备

1.DEBUG命令学习 1).G 命令

格式:G[=起始地址] [断点地址]

功能:从起始地址开始执行到断点地址,如不设断点地址,则程序一直执行

到终止指令才停止。

图2.1 命令G=100执行结果

2)。 P命令

功能:执行汇编程序,单步跟踪。

与T命令不同的是:P 命令不会跟踪进入子程序或软中断。其使用方式与T相同

12

图2.2P命令执行结果

从结果中可以看出P命令不会进入INT 21 H 软中断 3)。N命令

功能:指定文件名。为读/写文件做准备 D200 20F U100 10C

N E:\\first.com R CX :110

第一、二条命令的作用是检查一下刚才编写的汇编指令,第三条命令的作用是设置存盘文件名为FIRST。COM,第四条命令的作用是设置存盘文件大小为110H个字节,最后一条命令是将文件存盘。执行结果如图

图2.3 N E:\\first.com执行结果

文件存盘后,在DOS环境下执行FIRST。COM。观看运行结果,如图2.4

13

图2.4 文件FIRST。COM文件执行结果

4)。W命令

功能:向磁盘写内容 见“N命令” 5)。L命令

功能:从磁盘将文件或扇区内容读入内存

注意:使用该命令前,必须用N命令设定文件名 N E:\\first.com L

在文件读入内存后,可用U100 命令查看调入程序的汇编代码,执行结果如图2.5

图2.5 用L命令跳入程序

三、 实验任务

1. 按照下列给定步骤完成求累加和程序:

程序:

MOV MOV MOV LOP: ADD

INC J: LOOP

INT3

步骤:

BX,1000 CX,10 AL,0 AL,[BX] BX LOP

1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替。

14

2)用命令N AA将此程序命名为文件AA(文件名可任取)。

3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址) ,用R命令把BX设为:0000H,CX 设为文件长度。 4)用命令W 100将此程序存到AA命名的磁盘文件中。 5)用命令Q退出DEBUG。

6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序。 若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入。 7)用E命令在内存地址1000H处键入16个数字

8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查

AX,BX的值是否符合你的预计值。

9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样, 若不一样,检查程序是否有错。

10)重复G J与T,再检查AX是否正确。 (J为断点地址) 11)用G命令使程序运行到结束,检查AX值是否正确。 2.用命令A汇编下列指令,判断指令正误并说明原因。

(1) LEA DI,[AX] (2) MOV DS,2010 (3) PUSH AL

(4) OUT 900,AL (5) MOV [BX],0

3.利用T,P,G命令,执行下列指令段,注意它们的不同之处。

(6) MOV DI,300

MOV SI,400 MOV CX,3 CLD

REP MOVSB INT 3

(7) MOV AH,2

MOV DL,41 INT 21 INT 3

4.程序: MOV DI,1000

MOV CX,8

15

MOV SI,2000 CLC

LOP: MOV ADC [DI],AL INC SI INC DI LOOP LOP INT 20

AL,[SI]

步骤:

1)用A命令键入此程序

2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。

3)用G命令运行此程序,并用D命令检查其结果(存放在哪里?),是否正确?

4)将INT 20H指令改为INT 3,有何区别?若这条指令不加,行不行?试 试。

5)请说明这个程序完成的功能是什么?

四、 实验说明

1. 初学者在使用DEBUG命令修改内存或执行程序时,由于多种原因,

出现死机是较经常的现象,可按RESET复位按钮,重新启动系统。 2. 用连续执行命令G执行程序时,注意给出执行的首地址,或查看当

前CS和IP值是否为要执行程序段的首地址,并注意查看执行的指令流程中有无返回DEBUG功能的程序段,如指令INT 20T或断点设置INT3,否则发出命令后,很容易出现死机,原因是如无程序段使系统返回命令接受状态,CPU将不断到内存取指令、执行指令,使作户失去对系统的控制,出现死机。为避免这种情况,可在用户程序段的最后加上一条INT 20H指令,或用断点方式执行。避免出现死机。

3. 关于任务2,在命令A下汇编各条指令,对于错误的指令,DEBUG

指令出其错误位置,对于正确的指令,将其汇编到相应内存,据此可判断指令正误,而具体原因需自己分析。

4. 关于任务3,用A命令汇编好后,用T,P,G命令分别执行,记录

指令执行前后各寄存器(包括标志寄存器各标志位值)、堆栈指针及堆栈内容变化情况,以及与指令有关内存单元的内容,总结T和P执行某些指令的不同之处及适用场合。 5. DEBUG下不支持符号地址,如任务1中的标号LOP和J 等,在命令

16

A下输入程序时,不输入标号(如next:),在用到标号的指令(如LOOP,JNZ等),在其后直接输入要跳转的目的地址。 6. 对向前跳转的指令,输入程序的过程如下: -A ↙

1270:0100 MOV CX,10 ↙ 1270:0103 MOV AL,0 ↙ 1270:0105 MOV BX,1000 ↙ 1270:0108 ADD AL,[BX] ↙ 1270:010A INC BX ↙ 1270:010B DEC CX

1270:010C JNZ 0108 ↙ 1270:101E MOV [BX],AL ↙ 1270:0110 INT 3 1270:0112 ↙

用目的地址0108代替标号LOP在LOOP指令中的位置,而在输入ADD AL,[BX]这条指令时,不输入标号LOP.

对向后跳转的指令,由于目的地址尚未确定,可先随意输入一个地址,若是条件转移指令,注意跳转范围应在-128~127之间,待程序输入完毕,目的地址明确后,再用命令A修改跳转指令。

如下程序段,功能是比较AX和CX中的两符号数,将较大的数放在AX和BX中,较小的数放在CX中。

CMP AX,CX JX continue XCHG AX,CX continue: MOV BX,AX

用命令A输入程序的过程如下: -A ↙

1270:0100 CMP AX,CX ↙ 1270:0102 JG 0102 ↙ 输入本条指令的地址0102代替标号continue

1270:0104 XCHG AX,CX ↙ 1270:0106 MOV BX,AX ↙ 1270:0108 ↙

-A 102↙ 修改跳转指令的目的地址

1270:0102 JG 0106 ↙ 输入目的地址0106 1270:0104 ↙

17

-U 1270:0100 L 0 A ↙ 用命令U查看程序,跳转

正确

1270:0100 39C8 CMP AX,CX 1270:0102 7F02 JG 0106 1270:0104 87C1 XCHG AX,CX 1270:0106 89C3 MOV BX,AX

五、 问题思考

1. 假设某内存单元的内容为CCH,试问该内容如看作一条指令、看

作无符号数、看作带符号数,那将分别表示什么?不查看教材中的指令系统代码,如何在DEBUG下知道CCH表示一条什么指令?

2.在指令MOV[BX],AX中,操作数[BX]的寻址方式是什么?在

DEBUG下执行完该指令后,如何查看执行结果?

3.可否随意在DEBUG提示符“-”后不带参数发出命令G?什么情

况下使用命令G时,可不用“=”给出执行的首地址?

4.分析出现死机的几种情况。如何理解死机现象?试从计算机的工

作原理进行解释。

六、 实验报告

1. 分析任务2中各条指令错误原因。

2.说明命令T和P的差别。 3.回答问题思考。

4. 针对实验目的认真做小结。

18

实验三 数据串传送和查表程序

一、实验目的

1、堆栈。堆栈指示器SP和堆栈操作指令PUSH。POP。 2、段寄存器和物理地址计算。 3、查表法和查表指令XLAT。

4、数据串传送程序和数据串传送指令MOVS。STOS及重复前辍REP。 5、循环指令ROL。逻辑与指令AND和清方向位指令CLD。 6、伪操作指令DB。

二、实验准备

1.编写实验任务要求的程序 2.学习一下调试方法

利用查表方法把DX的内容(16进制数)转换成ASCII码:

1)、用A命令键入下列程序:

MOV BX,1000 MOV DI,2000 MOV CX,4

LOP: PUSH CX

MOV CL,4 ROL DX,CL POP CX MOV AL,DL AND AL,OF XLAT CLD STOSB

19

LOOP LOP INT 20

2)用A命令在1000H处键入下列ASCII码并用D命令检查之:

DB `0 1 2 3 4 5 6 7 8 9 A B C D E F'

用D命令检查时注意左边的ASCII码值和右边的字符。 3)用R命令给DX送一个四位的16进制数(例7F8E)。

4)用T命令逐条运行这程序到LOOP指令处,观察并记录每次运行结果,特别是SP和堆栈内容(用D命令检查)

5)用G命令将此程序运行到结束,并用D命令检查2000H处所转换的结果。可注意屏幕右边的ASCII字符与DX是否一致。 3.验证:数据串搬家程序: 1)用A命令键入下列程序:

MOV SI,1000 MOV DI,1500 MOV CX,0F LOP: MOV AL,[SI]

MOV [DI],AL INC SI INC DI LOOP LOP

INT 20

2)用A命令DB伪指令在1000H键入下列字符串:

‘IBM_PC COMPUTER'

3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。

4.段寄存器概念及字符串传送指令练习:

1)用A命令键入下列程序:

MOV SI,0 MOV DI,0 MOV AX,1000

20

MOV DS,AX MOV AX,1500 MOV ES,AX MOV CX,0F CLD REP MOVSB INT 20

2)用A命令DB伪指令在1000:0000处键入字符串'IBM_PC COMPUTER',

并用D命检查之

3)用D命令检查0F00:1000处内容,看是否一样。为什么? 4)用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS

与ES值。

三、实验任务

1、把实验准备(二)程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的 字符串搬到1002H开始的地方去?

2、修改实验准备(二)程序以做到把1000H开始的字符串搬到1002H

开始的地方去

3、编一程序段,求双字(DX,AX)的绝对值 4、将双字(DX,AX)左移4 位。

四、实验报告要求

1、各项实验记录和思考题。

2、要求给出任务2中要求编写的程序的清单(修改后)和调试记录。 3、给出任务3,4的程序清单和调试记录

21

实验四 汇编语言上机过程及屏幕字符显示程序

一、实验目的:

1、熟练掌握汇编语言的程序格式,程序设计方法;学会使用masm6.11

对源程序进行编译、链接、调试和运行

2、利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法。

3、利用^Break退出程序的方法及局限性。 4、汇编程序的编写

二、实验准备:

1.编写实验任务要求的两个程序,画出流程图,给出程序清单

2.学习汇编语言程序的上机过程

(1)建立汇编语言程序源文件。可使用任何一个文本编辑器(如

EDIT.com)编辑源文件,源文件,源文件的扩展名通常取为.asm。

图4.1 用EDIT编辑源文件

图4.2 EDIT环境下建立的文件 (2)汇编文件,形成目标模块。

22

MASM LT301A。ASM

若文件有语法错误,据错误提示,返回(1),修改源文件。

图4.3 MASM LT301a.asm 执行结果 可以看出文件有错,返回(1),根据提示修改源文件11行,重新编译

图4.4 MASM 编译成功

编译成功。则形成.OBJ目标文件

图4.5在目录下看到的目标文件 (3)连接目标模块,形成可执行文件。 LINK LT301A。OBJ

23

图4.6 LINK LT301a.obj 命令执行结果

若有错,据错误提示,返回(1),修改错误。 若无错,则形成.EXE可执行文件和.MAP映像文件。

(4) DOS下直接键入可执行文件名,即可执行该程序。

LT301A.EXE

图4.7 运行结果

(5) 如果运行结果不对,需调试程序,查找原因。返回步骤(1)

查看源文件,查找错误,修改文件。若无法通过查看源文件

找出错误,可在DEBUG下调试.EXE文件,找出错误之处,再返回步骤(1)。

3. 利用INT 21 09H号功能调用显示字符串。验证以下程序

1) 用A命令在100H处键入下列程序:

MOV AH, 9 MOV DX,110 INT 21 INT 20

2) 用A命令在110H处键入下列字符串的ASCII码:

DB

'This is a sample!$'

3) 用N命令和W命令将此程序(包括数据区)存入文件名为AA.COM的

磁盘文件中。(存入前BX:CX必须置为文件长度值)。 4) 用Q命令退出DEBUG。

5) 在DOS命令下打AA,运行此程序,即在屏幕上显示'This is a sample!'字符串,若不出现,用DEBUG检查程序有无错误。

24

4、利用INT 21H 2号功能显示字符:

1)用A命令在100H处键入下列程序:

XOR DL,DL MOV CX,100

LOP: MOV AH,2

INT 21 INC DL PUSH CX MOV CX,8

DELY: PUSH CX

MOV CX,256 J: LOOP J

POP CX LOOP DELY POP CX LOOP LOP INT 20

2)用G命令运行程序,即在屏幕上依次缓慢的显示256个ASCII字符。

仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?

3)按CTRL+BREAK退出此程序,若一次不行可多做几次。

三、实验任务

1. 编写一个简化的段定义结构程序:

先提示输入数字“Input number:0-9”,然后在下一行显示输入的数字,结束;如果不是键入了0-9 数字,就提示错误“ERROR!”,继续等待输入数字。

2. 编写一个完整的段定义结构程序:

25

从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。要求对以上两个程序,进行编译,链接,调试,运行,给出具体步骤

四、实验报告要求:

1.自编程序清单及调试结果。 26

实验五 条件转移指令

一、实验目的:

1.8088指令:JZ,JNZ,JC,JNC,CMP,SHR。 2.程序:用字符搜索法确定字符串长度。 3.程序:16进制数化为ASCII码的一般方法。

二、实验准备

1.(1) 编写实验任务要求的两个程序。

(2) 写出调试以上程序,即修改程序参数,检查结果的操作方法。

(3) 熟悉源程序汇编、连接命令的使用方法即要回答的内容。

2.验证以下程序

16进制数化ASCII码的一般方法(显示内存内容) 1)用A命令在100H处键入下列程序:

MOV SI,0 MOV BL,10

LOP: MOV DL,[SI]

MOV CL,4 SHR DL,CL CMP DL,0A JC

J1

ADD DL,7 J1: ADD DL,30

MOV AH,2 INT 21 MOV DL,[SI] AND DL,0F

27

CMP DL,0A JC

J2

ADD DL,7 J2: ADD DL,30

MOV AH,2 INT 21 MOV DL,20 MOV AH,2 INT 21 INC SI DEC BL JNZ LOP INT 20

2)用N,W命令将此程序用CC.COM文件名存入磁盘。 3)用Q命令退出DEBUG。

4)在DOS命令状态下直接运行CC.COM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。

三、实验任务

1.自编程序:修改实验准备程序(二),使除了以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。

2. BUFX、BUFY和BUFZ是3个有符号的十六进制数,编写一个比较相

等关系的程序:

1)如果这3个数都不相等,则显示0 2)如果这3个数中有两个数相等,则显示1 3)如果这3个数都相等,则显示2

四、实验步骤

28

1) 用EDIT或其它编辑软件,编写.ASM源程序, 2) 对其进行汇编及连接,产生.EXE文件。 3) 对.EXE文件进行调试运行。 a. 用DEBUG调试运行。

b. 键入不同的字符,分别进行调试。 c. 在MS-DOS下运行这两个.EXE文件。

五、实验报告要求:

1.先完成准备实验

2.务2要求画出流程图,给出程序清单,给出调试结果,并存盘 3.实验体会。

29

实验六 循环程序是设计

一、实验目的:

1.灵活运用各类许循环指令,掌握循环程序的设计方法 2. 学会针对不同的问题,选用不同的组织循环的方法。 3.伪指令 EQU 及操作符 '$'的使用。 4. COM文件的要求和生成过程。 二、实验准备

1.编写任务要求的程序 2.学习COM文件的生成过程

code segment org

100h

cs:code,ds:code start

1234h,5673h,7fffh,8000h,0dffh 0ab5h,0369h,005fh,5634h,9069h $-array cx,count cx,1 cx bl,-1 dx,cx bl,bl exit bl,bl si,si

assume

main: array count start:

jmp dw dw equ mov shr dec mov

again: mov and je xor xor

30

again1: mov

cmp jle mov mov

nchg:

inc inc dec jnz

exit: code

int ends end

ax,array[si] ax,array[si+2] nchg array[si],ax bl,-1 si si dx again1 20h main

xchg array[si+2],ax

loop again

1)输入,汇编并连接此程序。忽略连接时的无堆栈告警。 2)用EXE2BIN将 .exe文件转换为 。COM文件,命令格式:

EXE2BIN? ???.EXE ????.COM

3)在DEBUG下运行此程序,记录运行结果。

4)思考:将转移指令JLE改为JBE,JGE和JAE,分别运行并记录排序结果。

三、实验任务

1.编写程序:将一个包含有20个有符号数据的数组arrayM分成两个数组,正数数组arrayP 和负数数组arrayN,并分别把两个数组中的数据个数显示出来

2.编程实现把键入的一个字符,用二进制形式(0/1)形式显示出它的ASCII码

四、 实验步骤

1. 用EDIT或其它编辑软件,编写.ASM源程序,

31

2. 对其进行汇编及连接,产生.EXE文件。 3. 对.EXE文件进行调试运行。 4. 在MS-DOS下运行这两个.EXE文件。

五、实验报告要求

1. 画出任务1,2 两个程序的流程图,列出相应的程序清单。 2. 说明本实验是如何利用DEBUG进行调试的

32

实验七 子程序设计

一、实验目的:

1.掌握子程序设计方法。

2.掌握调用程序与子程序间参数传递的几种方法。

二、 实验准备

(1) 预习子程序设计的基本方法,根据实验任务要求,画出子程

序及主程序的流程图。

(2) 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

三、实验任务

1.编制一个子程序把一个十六位二进制数用十六进制形式在屏幕上显示出来,采用堆栈方法传递这个二进制数,并用一个主程序验证它。 2.设有一个数组存放学生的成绩(0~100),编制一个子程序统计0~59分,60~69分, 70~79分, 80~89分,90~100分的人数,并分别存放到scoreE, scoreD, scoreC, scoreB, scoreA单元中,编写一~个主程序与之配合使用。

四、 实验步骤

1. 用EDIT或其它编辑软件,编写.ASM源程序, 2. 对其进行汇编及连接,产生.EXE文件。 3. 对.EXE文件进行调试运行。 4. 在MS-DOS下运行这两个.EXE文件。

五、实验报告要求

1. 画出任务1,2 两个程序的流程图,列出相应的程序清单。

2.说明本实验是如何利用DEBUG进行调试的 3.说明用堆栈传送参数的过程及其具体方法。

4.分析实验结果及所遇到问题,并说明解决的方法。

33

附录:汇编语言试卷一

一、单项选择题(本大题共20小题,每小题1分,共20分) 1.CPU要访问的某一存储单元的实际地址称( )

A.段地址 B.偏移地址 C.物理地址 D.逻辑地址 2.某存储单元的物理地址是12345H,可以作为它的段地址有( ) A.2345H B.12345H C.12340H D.1234H 3.执行后使BX=0的同时也使CF=0,OF=0的指令是( ) A.XOR BX,BX B.OR BX,BX C.AND BX,BX D.CMP BX,BX

4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是( ) A.CX≠0且ZF=1 B.CX≠0且ZF=0 C.CX≠0或ZF=1 D.CX≠0或ZF=0

5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是( ) A.DAA校正指令的功能已自动加在AH中

B.进位值在AF中,校正后根据AF内容再加在AH中 C.进位值在CF中,校正后根据CF内容再加在AH中

D.进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6.AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是( )

A.指令XOR AX,AX执行后,AX内容不变,但设置了标志位 B.指令OR DX,1000H执行后,将DX最高位置1,其余各位置0 C.指令AND AX,OFH执行后,分离出AL低四位 D.NOT AX,执行后,将AX清0

7.在执行下列指令时,需要使用段寄存器DS的指令是( ) A.STOSW B.ADD AL,CL C.NEG BX D.INC DA[BX] 8.无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是( )

A.ADD BH,01H B.OR BH,01H C.XOR BH,01H D.TEST BH,01H 9.完成对CL寄存器的内容乘以4的正确操作是( ) A.ROL CL,1 B.MUL 4 ROL CL,1

34

C.SHL CL,1 D.MOV CL,2 SHL CL,1 SHL CL,CL 10.下面各传送指令中,正确的是( )

A.MOV [DI],[SI] B.MOV[DX+DI],AL C.MOV WORD PTR [BX],0100H D.MOV AL,BX 11.汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法()

A.名字的第一个字符可以是大写英文字母及小写英文字母 B.名字的第一个字符可以是字母、数字及、@、_

C.名字的有效长度≤31个字符 D.在名字中不允许出现$ 12.要实现使BETA的值为56,应采用语句为( ) A.BETA DB 56 B.BETA DB 56H C.BETA EQU 56 D.BETA EQU 56H 13.REPZ CMPSW指令,重复执行的终止条件是( ) A.CX=0或ZF=0 B.CX=0且ZF=0 C.CX=0或ZF=1 D.CX=0且ZF=1 14.下面程序段执行后,AL中的内容是( ) MOV AX,8833H ADD AL,AH DAA

A.21 B.21H C.0C1H D.0DDH 15.比较两个带符号的数A、B,当A=B时程序转移,测试的条件为( ) A.ZF=1 B.ZF=0 C.SF=1 D.SF=0 16.检查二个无符号数的关系,若要实现AL≥BL时分支去LOP1处,那么在“CMP AL,BL”指令后应跟的分支指令是( )

A.JNC LOP1 B.JA LOP1 C.JC LOP1 D.JGE LOP1 17.在下列串操作指令中,同时使用源串和目的串地址指针的指令是( )

A.STOSW B.LODSW C.SCASW D.CMPSW 18.设AL=0AH,下列指令执行后能使AL=05H的是( ) A.NOT AL B.AND AL,0FH C.XOR AL,0FH D.OR AL,0FH 19.DA1 DW?AB?,?CD?,?EF?,?GH?( ) ┇

MOV AX,DA1+3 指令执行后AX中的内容是

A.?EF? B.?CD? C.?BC? D.?FC?

35

20.使用DOS系统功能调用时,使用的软中断指令是( ) A.INT 21 B.INT 10H C.INT 16H D.INT 21H 二、填空题(本大题共12空,每空0.5分,共6分)

21.十六进制数0FFF8H表示的十进制正数为________,表示的十进制负数为________。

22.若DS=0F3EH,SI=2000H,COUNT=0A8H,指令MOV AX,(SI+COUNT)中,源操作数的有效地址EA为________,其物理地址为________。 23.CPU的标志寄存器中标志位,可以分为两大类,其中一类称为________标志位,另一类称为________标志位。

24.当标志位________=1时表示无符号数运算产生溢出,而当标志位________=1是表示带符号数运算产生溢出。

25.如JMP指令采用段间间接寻址,那么由4个相邻字节单元中存放有转移地址,其中前两个字节存放的是________,而后两个字节存放的是________。

26.在串操作程序中,通常在重复前缀指令REPZ或REPNZ后,选用的串操作指令是________或________才有实际意义。 三、简答题(本大题共4小题,每小题2分,共8分)

27.已知:BX=1357H,DI=2000H,DS=2000H,CS=4000H,分别指出下面各指令中存储器操作数的物理地址。 (1)MOV AL,[BX] (2)MOV CS:[BX+DI],AH 28.0P1 DB 1,2 0P2 DW 3412H,5678H ┇

MOV AX,OP1+1;字单元(OP1+1) AX MOV BL,OP2+1;字节单元(OP2+1) BL

上述二条传送语句有语法错误,请根据注释字段的说明,将其改正。 29.下列语句在存储器中分别为变量分配多少字节? (1)AD2 DW 10 DUP(?),10 (2)AD3 DD 100 DUP(?)

30.简述下面两条指令分别是什么语法错误? MOV [BX],[SI] MOV AX,DL

四、程序分析题(本大题共6小题,每小题6分,共36分)

36

31. MOV DL,AL NOT DL TEST DL,04H JE NEXT ┇ NEXT:…

若上述程序段执行时产生分支,说明AL中的数第几位一定为1?程序段执行后CF是多少? 32.DA1 DB?ABCDEFGHI? DA2 DB 9 DUP(0) ┇

LEA SI,DA1 LEA DI,DA2 MOV CX,9 CLD

LOP: LODSB SUB AL,10H STOSB LOOP LOP . . .

试问:①写出程序执行后DA2各字节中的数据。 ②保持程序功能情况下,程序中 可否改写为 33.已知:BX=4567H NEG BX INC BX NEG BX DEC BX

程序段执行后,BX=________,CF=________。 34. MOV BL,64H MOV CL,03H XOR AX,AX AGAIN:ADD AL,BL ADC AH,0 DEC CL JNZ AGAIN

37

问:(1)该程序段完成的功能是: (2)AX=________。 35.已知数据段中定义

DAT1 DB 12H,34H,56H,78H MOV CX,0

MOV AX,WORD PTR DAT1 MOV CL,DAT1+3

当程序段执行完后AX=________,CX=________。 36.DA1 DB 83H,72H,61H,94H,5AH ┇

MOV CX,WORD PTR DA1 AND CX,0FH MOV AL,DA1+3 SHL AL,CL

上述指令序列执行后,AL=_______,CL=_______。 五、程序填空题(本大题共2小题,每小题6分,共12分)

37.在NUMW单元存放有一个0-65535范围内的整数,将该数除以500,商和余数分别存入QU1和REM单元,请在空行处各填上一条指令完善该程序。 ┇

MOV AX,NUMW _____________ XOR DX,DX DIV BX

MOV QUI,AX _____________

38.某程序欲用单个字符显示的2号功能调用去显示STRING中的字符串?COMPUTER?(不显示字符?$?!).试在空白处填上适当的一条指令。 STRING DB?COMPUTER?,?$? ┇

MOV BX,0FFSET STRING LOP:MOV DL,[BX] MOV AH,02H INT 21H

____________________

38

____________________ JNE LOP

六、编程序题(本大题共2小题,第39小题6分,第40小题12分,共18分)

39.试编制一程序段,用串操作指令实现以DA_BY为首址的20H个字节单元中存放相同字符?Y?(设DA_BY存储区已有ES指向)。

40.试编制一源程序,统计DA1字单元中含0的个数,如统计的个数为奇数,则将进位位置1,否则进位位清0。 DATA SEGMENT DA1 DW XXXX DATA ENDS

2004年10月汇编语言试题

一、单项选择题(本大题共20小题,每小题1分,共20分) 1.假设存储器中从7462H单元开始的四个相邻字节单元中的内容依次是32H,46H,52H,OFEH,则存放字数据OFE52H的字地址是( ) A.7462H B.7463H C.7464H D.7465H

2.下列寄存器组中,在访问存储器操作数地址时,可以提供偏移地址的是( )

A.BP、BX、SI、DI B.AX、BX、CX、DX C.SP、IP D.BX、SI、DI、DS

3.当堆栈为空时,如SS=0805H,SP=40H,栈底字单元的物理地址是( ) A.08090H B.08089H C.0808EH D.08450H

4.执行POP BP指令时,源操作数的物理地址表达式是( ) A.16*SS+SP B.16*SS+BP C.16*DS+BP D.16*CS+BP 5.设ADRT=100H,不符合语法规则的语句是( ) A.MOV AX,ADRT B.MOV AX,[ADRT+SI] C.MOV [ADRT],AX D.MOV ADRT[SI],AX 6.下面XCHG指令语句中,语法正确的是( ) A.XCHG AX,DS B.XCHG BL,[BX] C.XCHG AL,OFH D.XCHG[SI],[DI]

7.设(AL)=63H(BL)=29H执行下面指令后( ) SUB AL,BL DAS

39

本文来源:https://www.bwwdw.com/article/mfkg.html

Top