汇编语言程序设计实验指导书

更新时间:2023-09-24 16:33:01 阅读量: IT计算机 文档下载

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

目 录

实验一 DEBUG的使用 ........................................................................................ 1 实验二 汇编语言程序结构................................................................................... 5 实验三 数据串传送和比较................................................................................... 7 实验四 实验五 实验六 实验七 实验八 实验九 实验十 实验十一 实验十二 实验十三 实验十四 屏幕字符显示..........................................................................................11 条件转移和分支程序............................................................................. 15 循环程序................................................................................................. 17 子程序..................................................................................................... 19 宏指令及宏调用..................................................................................... 22 数码转换程序......................................................................................... 24 键盘和窗口程序..................................................................................... 28 活动图形显示程序................................................................................. 31 磁盘文件操作程序................................................................................. 34 模块程序设计......................................................................................... 40 综合程序设计......................................................................................... 44

实验一 DEBUG的使用

实验目的:

1.学习使用DEBUG程序的各种命令。 2.掌握8088/86指令系统---算数指令。 3.掌握用DEBUG调试自编程序的方法。

4.掌握8088/8086 CPU寄存器的用途和存储器组织及它们之间的关系。 5.掌握内存操作数及寻址方法。

6.掌握汇编语言伪操作:BYTE PTR,WORD PTR。 内容及步骤:

一、DEBUG 命令使用:

1、 敲 DEBUG 进入 DEBUG 环境,显示提示符 '_ '。

2、 用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。

3、 用命令 E100 30 31 32 ?? 3F 将30H~3FH写入地址为100H开始的内存单元中,

再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?

4、 用命令 F100 10F 'A' 将'A'的ASCII码填入内存,用D命令查看结果。 5、 用命令 F110 11F 41 将41H 填入内存,用D命令观察结果并比较。

6、 用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内

容。

7、 用R命令将AX,BX内容改写为1234H及5678H。

8、 用H命令检查下列各组16进制数加减结果并和你的手算结果比较:

(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758,347FH 二、8088常用指令练习

1、传送指令

1)用A命令在内存100H处键入下列内容:

MOV AX,1234 MOV BX,5678 XCHG AX,BX MOV AH,34 MOV AL,56 MOV CX,75AB XCHG AX,CX

2)用U命令检查键入的程序,特别注意左边的机器码。

3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。

2、加减法指令:

1)用A命令在内存200H处键入下列内容:

MOV AH,34

1

MOV AL,2E ADD AL,AH SUB AL,78 MOV CX,1234 MOV DX,5678 ADD CX,DX SUB CX,AX SUB CX,CX

2)用U命令检查键入的程序及对应的机器码。

3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。 思考题:

这次运行还是打入T,行不行?如何单步运行上述小程序?用R命令检查一下IP的内容。注意T命令与IP的关系。

3、带进位加减法:

1)用A命令在内存300H处键入下列内容,并用U命令检查:

MOV AH,12 MOV AL,89 MOV CH,56 MOV CL,98 ADD AL,CL ADC AH,CH MOV DH,A7 MOV DL,58 SUB DL,7F SBB DH,34

2)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。

3)上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。 4、BCD码加减法

1)内容:

MOV AL,58 ADD AL,25 DAA

2)要求:用A 命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。 三、内存操作数及各种寻址方式使用:

1)用A命令在内存400H处键入下列内容,并用U命令检查:

MOV AX,1234

MOV [1000],AX MOV BX,1002 MOV BYTE PTR[BX],20 MOV DL,39 INC BX

2

MOV [BX],DL DEC DL MOV SI,3 MOV [BX+SI],DL MOV [BX+SI+1],DL MOV WORD PTR[BX+SI+2],2846

2)用T命令逐条运行这些指令,每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。

注意:D命令显示结果中右边的ASCII字符及双字节数存放法。

思考题: 有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。 四、DEBUG下汇编运行程序方法

用A命令汇编程序,编程完成将DS:1000开始的10个字节的内存单元的内容相加,并把相加结果存放在DS:200A 内存单元中,用DEBUG调试运行该程序,并察看运行结果。

内容:

MOV CX,0AH MOV AL,0 MOV BX,1000 LL: ADD AL,[BX] INC BX DEC CX JNZ LL

MOV [BX],AL INT 3 步骤:

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

2)用U命令检查键入的程序及对应的机器码。

3)用E1000 01 02 03 04 05 06 07 08 09 0A将1000H开始的前10个内存单元的内容修改为01,02,03,04,05??0A,用D命令查看修改结果。

4)用T命令逐条运行上述小程序指令,检查并记录有关寄存器、存储单元内容及ZF情况。 5)用F2000l0A 02 03 04 05 ??0B 将1000H开始的10 个内存单元的内容修改为02,03,04,05??0B。用D命令查看修改结果。

6)用G=100 全速运行上述小程序,用D1000 100F 查看运行结果。 思考题:

可否随意在DEBUG提示符“-”后不带参数发出命令G?什么情况下使用命令G时,可不用“=”给出执行的首地址? 实验报告:

1、列出8088常用指令练习部分的逐条运行记录。 2、列出DEBUG下调式运行小程序的运行步骤和运行结果。 3、回答思考题。

3

附:

DEBUG 使用:

1、打 DEBUG 进入 DEBUG,显示提示苻 '_ '。 2、退出DEBUG命令:Q

3、显示内存命令:D 起始地址 结束地址

4、修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。 5、检查寄存器命令:R 标志位显示 1 0

CF CY NC ZF ZR NZ SF NG PL AF AC NA OF OV NV PF PE PO DF DN UP IF EI DI

6、修改寄存器命令:R 寄存器名

7、小汇编命令:A 起始地址,不输入指令打回车键退出A命令。 8、反汇编命令:U 起始地址 结束地址 9、文件命名命令:N 盘号:文件名 10、读文件命令:L 内存地址 11、写文件命令:W 内存地址

10、读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数 11、写扇区命令:W 内存地址 盘号 扇区号 扇区数 12、运行命令:G=起始地址 结束(断点)地址

13、单步命令:T=起始地址 运行指令数,进入子程序内部。 14、单步命令:P=起始地址 运行指令数,不进入子程序内部。 15、内存搬家命令:M 起始地址 结束地址 目的地址

4

实验二 汇编语言程序结构

实验目的:

1、掌握汇编语言程序结构。

2、掌握建立、汇编、链接、调试和运行汇编程序的过程。 3、掌握伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。

4、了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法。 5、熟悉加法调整指令意义及其用法。 实验内容:

一、多字节加法程序。

对两个多位十进制数求和,加数和被加数分别存放在D1和D2开始的数据缓冲区中,相加结果存放在D1开始的单元中(D1和D2均为字节变量,分别存储着压缩BCD数)。 <参考程序> DATA SEGMENT D1 DB 12H,34H,56H,78H D2 DB 56H,27H,38H,49H, DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX

LEA DI,D1 MOV CX,4 LEA SI,D2 MOV BX,4 CLC

LOP: MOV AL,[DI+BX-1] ADC AL,[SI+BX-1] DAA

MOV [DI+BX-1],AL DEC BX

LOOP LOP MOV AH,4CH INT 21H CODE ENDS

END START 步骤:

1)从开始菜单/程序/附件 选则c:\\命令提示符 进入DOS环境。 2)敲 cd\\ 退回到根目录。

3)敲 cd\\masm 进入masm子目录。 4)敲 dir 列出masm目录下文件。

5)敲 edit 进入全屏幕编辑环境,输入以上程序,存盘命名退出(如abc.asm)。

5

6) 敲 masm abc.asm 汇编源程序,如无语法错误就会生成abc.obj形式的二进制目标

代码文件,如有错误就回到全屏幕编辑环境修改错误,再重新汇编,直到汇编通过为止。

7)敲 link abc.obj 链接二进制目标代码文件,生成abc.exe文件。

8) 敲 DEBUG abc.asm 调入DEBUG和文件abc.exe,然后用U命令检查调入程序。 9) 用命令G=100 J(J用实际地址代替),使程序运行并停在断点J处,检查内存单元的内 容是否是预期的结果。

二、把上题改造成COM文件的编程格式,汇编、链接和运行调试该程序。

三、用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同题一。调试并做记录。 实验说明:

压缩型十进制数就是用四位二进制数表示一个十进制数位,如:十进制数39表 示为0011,1001,非压缩型十进制数即拆开型十进制数,它是用8位二进制数表示一个十进制数位,如:十进制数39表示为0000,0011,0000,1001。 思考题:

1)若在源程序中把INT 21H的'H'省去,会产生什么现象? 2)把 INT 21H 4CH号功能改为 INT 20H,行不行? 实验报告:

1、列出自编程序的程序清单,并加适当注释。

2、写出汇编,连接及调试程序时产生的错误,其原因及解决办法。 3、总结EXE文件和COM文件的编程格式。 4、回答思考题。

6

实验三 数据串传送和比较

实验目的:

通过实验掌握下列知识:

1、堆栈。堆栈指示器SP和堆栈操作指令PUSH、POP。

2、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP。 3、数据串比较指令CMPSB及重复前缀REPZ。

4、循环指令ROL。逻辑与指令AND和清方向位指令CLD。 5、利用汇编集成环境编辑运行自编程序的方法。 实验内容:

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

<参考程序〉 DATA SEGMENT D1 DB ‘0123456789ABCDEF’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES:AX MOV DX,6C8EH LEA BX,D1 MOV DI,2000H MOV CX,4 LOP: PUSH CX MOV CL,4 ROL DX,CL POP CX MOV AL,DL AND AL,OF XLAT CLD STOSB LOOP LOP INT 20H CODE ENDS END START 步骤:

1、 进入windows桌面,点击“我的电脑”,进入C盘,找到CMASM2文件夹打开,点击 CMASM.EXE进入汇编集成环境。

2、按任意键进入主菜单,选择1建立源程序文件名(不需送扩展名)。如图3.1所示。

7

图3.1 汇编集成环境

3、选择2进入全屏幕编辑环境,送入汇编源程序,存盘退出。如图3.2所示。

图3.2 全屏幕编辑环境

4、选择3产生EXE文件(包括汇编和链接过程),如有语法错误,返回2查找和修改错误,存盘退出,再重新产生EXE文件,直到成功为止。如图3.3所示。

图3.3 汇编和链接

8

5、选择5进入DEBUG环境,调式运行该程序。

图3.4 DEBUG动态调试环境

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

7、用G命令将此程序运行到结束,并用D命令检查2000H处所转换的结果。可注意屏幕右边的ASCII字符与DX是否一致。 思考题:

1、为什么不选择4直接运行该程序,而进入DEBUG运行调式该程序? 2、程序中不设附加段可不可以?

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

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

MOV SI,0 MOV DI,0 MOV AX,1000 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值。

5、修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。 三、数据串搬家程序:

编程实现把字符串“Welcome to laboratory! ”从源缓冲区传送到目的缓冲区。在DEBUG下用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。

9

实验报告要求:

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

2、调式通过的自编程序清单和调试记录。

10

实验四 屏幕字符显示

实验目的:

通过实验掌握下列知识:

1、利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法。 2、利用DOS功能调用INT21H的)0AH号功能从键盘输入数据的方法。 3、直接向视频RAM(VRAM)送ASCII码进行屏幕显示的方法。 4、IBM-PC机的ASCII码表及控制字符。 5、利用^Break退出程序的方法及局限性。 实验内容及步骤:

一、利用INT 21H 的09H号功能调用显示字符串。

<参考程序>

CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP BEGIN MSG DB ‘HELLO,WELCOME TO ASSEMBLEER WORLD!’13,10,’$’ BEGIN: MOV AX,CS

MOV DS,AX MOV DX,OFFSET MSG MOV AH,09H INT 21H MOV AX,4C00H INT 21H CODE ENDS END START 步骤:

1、 进入汇编集成环境输入上述程序,存盘退出编辑环境。 2、 汇编链接该程序产生.COM文件。 3、 运行该程序,观察结果。 二、利用INT 21H 0AH号功能显示从键盘输入的字符串。 <参考程序> DATA SEGMENT BUF1 DB ‘Please input a string:’,0dh,0ah,’$’ BUF2 DB 80 DB ? DB 81 DUP(?) BUF3 DB 0DH,0AH,’$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA

11

START: MOV AX,DATA MOV DS,AX LEA DX,BUF1 MOV AH,09H INT 21H MOV DX,BUF2 MOV AH, 0AH INT 21H MOV CL,STR1+1 MOV CH,0 MOV SI,OFFSET STR1+2 ADD SI,CX MOV BYTE PTR[SI],'$' MOV DX,OFFSET BUF3 MOV AH,09H INT 21H MOV DX,OFFSET BUF2+2 MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 步骤:

1、 进入汇编集成环境输入上述程序,存盘退出编辑环境。 2、 汇编链接该程序产生.EXE文件。 3、 运行该程序观察结果。 三、利用INT 21H 2号功能显示字符: <参考程序> CODE SEGMENT ASSUME CS:CODE START: XOR DL,DL MOV CX,100H LOP: MOV AH,2 INT 21H INC DL PUSH CX MOV CX,8 DELY: PUSH CX MOV CX,0 J: LOOP J POP CX LOOP DELY POP CX

12

LOOP LOP MOV AH,4CH INT 21H CODE ENDS END START 步骤:

1、 进入汇编集成环境输入上述程序,存盘退出编辑环境。 2、 汇编链接该程序产生.EXE文件。

3、 运行该程序,屏幕上依次缓慢的显示256个ASCII字符。仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?

4、按CTRL+BREAK退出此程序,若一次不行可多做几次。 四、直接向VRAM送ASCII码显示字符 <参考程序> CODE SEGMENT ASSUME CS:CODE START: MOV AX,B800H

MOV DS,AX XOR AL,AL XOR BX,BX MOV CX,100 LOP: MOV [BX],AL

INC BX INC AL PUSH CX MOV CX,8 DELY: PUSH CX

MOV CX,0 J: LOOP J

POP CX LOOP DELY POP CX LOOP LOP INT 20H CODE ENDS

END START

步骤:

1、进入汇编集成环境输入上述程序,存盘退出编辑环境。 2、汇编链接该程序产生.EXE文件。

3、运行该EXE文件,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同? 五、自编程序

1、要求显示AX的内容,即能显示AX=xxxx。

2、编程实现:屏幕显示“Please set the password!”,随后从键盘输入设定的密码,屏

13

幕接着显示“Please set the password again!”,如果再次输入的密码和第一次输入的相同则显示“OK,WELCOME TO ASSEMBLE WORLD!”,否则显示“Password error!”。 实验报告要求:

1、各项实验记录。

2、利用INT 21H显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同? 3、调试通过的自编程序清单及调试结果。

14

实验五 条件转移和分支程序

实验目的:

通过实验掌握下列知识:

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

4、掌握利用间接转移指令JMP BX实现多岔分枝的方法。 5、宏替换指令MACRO及ENDM。 6、符号扩展指令CBW。 实验内容:

一、用字符搜索法确定字符串长度:

<参考程序>

CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP BEGIN MSG DB 'This is the program to measure'

DB 'the length of a string!$'

BEGIN: MOV AX,CS MOV DS,AX LEA BX,MSG MOV AL,24

XOR CL,CL

LOP: CMP AL,[BX]

JZ EXIT INC BX INC CL JMP LOP

EXIT: MOV AH,4CH INT 21H CODE ENDS END START

汇编、连接和运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样? 二、16进制数化ASCII码的一般方法(显示内存内容) <参考程序> CODE SEGMENT ASSUME CS:CODE START:MOV SI,0

MOV BL,10H

15

LOP: MOV DL,[SI]

MOV CL,4 SHR DL,CL CMP DL,0AH JC L1 ADD DL,7 L1: ADD DL,30

MOV AH,2 INT 21H

MOV DL,[SI] AND DL,0FH CMP DL,0AH JC L2 ADD DL,7 L2: ADD DL,30H

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

CODE ENDS END START

汇编、连接和运行此程序,观察结果。

三、综合程序:编程测量一字符串长度,并用16进制数显示之

四、分支程序:已知CHR单元有一个二进制数X,编程计算Y,其结果存入RESULT单元中。

?4X,当X?5??4X?8,当5??X?20 20?50,当X〉 Y=

实验报告要求:

1、列出调试通过程序清单并加注释。

2、写出实验体会。

16

实验六 循环程序

实验目的:

1、掌握循环程序设计的方法和技巧。

2、掌握双重循环程序的结构,明晰内外循环层次。 3、掌握排序程序设计方法。 实验内容:

1、 将一个十六位二进制数逐位显示输出。 <参考程序> CODE SEGMENT ASSUME CS:CODE

BEGIN: MOV BX,1011000101010111B MOV CL,16 ROLT: ROL BX,1 JC DISP MOV AH,2 MOV DL,30H INT 21H DISP: MOV AH,2 MOV DL,31H INT 21H NEXT: DEC CL JNZ ROTL MOV AH,2 MOV DL,’B’ INT 21H MOV AH,4CH INT 21H CODE ENDS END BEGIN

汇编、连接和运行此程序,观察结果。

二、将一批无序的字数组元素按照从小到大的次序进行排序输出。 <参考程序>

code

segment org 100h

assume cs:code,ds:code jmp start dw 1234h,5673h,7fffh,8000h,0dffh dw 0ab5h,0369h,005fh,5634h,9069h equ $-array mov cx,count shr cx,1

17

main: array count start:

again:

again1:

nchg:

exit: code

dec mov mov and je xor xor mov cmp jle xchg mov mov inc inc dec jnz loop int ends end

cx bl,-1 dx,cx bl,bl exit bl,bl si,si

ax,array[si] ax,array[si+2] nchg

array[si+2],ax array[si],ax bl,-1 si si dx

again1 again 20h main

实验步骤:

1、输入,汇编并连接此程序。忽略连接时的无堆栈告警。 2、将 .exe文件转换为 .COM文件

3、在DEBUG下运行此程序,记录运行结果,是否达到要求(按从小到大进行排序)。 4、将转移指令JLE改为JNA,运行并记录排序结果。 三、已知数组A包含5个互不相等的整数,数组B包含6个互不相等的整数,将既在A数组中又在B 数组中出现的整数存放于数组D 中。 实验报告要求:

1、列出调试通过程序清单并加注释。 2、写出实验体会。

18

实验七 子程序

实验目的:

1、掌握一般子程序的调用和返回,熟悉定义过程的伪指令。 2、掌握利用堆栈传递参数的子程序调用方法。 3、掌握子程序递归调用方法。 实验内容及步骤:

一、利用堆栈传递参数的子程序调用。(求累加和)

<参考程序> stack segment stack

db 256 dup(0)

stack ends data segment ary1 db 1,2,3,4,5,6,7,8,9,10 count1 equ $-ary1 sum1 dw ? ary2 db 10,11,12,13,14,15,16,17,18 count2 equ $-ary2 sum2 dw ? data ends main segment

assume cs:main,ds:data,ss:stack

start proc far push ds ;PSP段基址压栈

xor ax,ax push ax ;双字节0压栈 mov ax,data mov ds,ax

mov ax,count1 push ax

lea ax,ary1 push ax

call far ptr sum mov ax,count2 push ax

lea ax,ary2 push ax

call far ptr sum ret ;返回DOS

start endp main ends proce segment

19

实验十三 模块程序设计

实验目的:

1. 掌握EXTRN,PUBLIC伪指令的用法。 2. 掌握多个程序模块如何连接。 实验内容:

1、 设计一个简易的菜单程序,主菜单界面如图13.1所示,用户键入“1”,进入SHIYAN子

菜单,显示“WELCOME TO SHIYAN”字样,底部显示“Please strike any key to return menu”, 用户按任意键返回主菜单。用户键入“2”,进入WUDANGSHAN子菜单,显示“WELCOME TO WUDANGSHAN”字样。用户键入“3”,系统返回DOS。

CHOICE(1,2,3):

1. 2. 3. MENU SHIYAN WUDANGSAN RETURN DOS

方法一:

图13.1 主菜单

程序分为3个模块:主模块mokuai.asm显示主菜单,并完成菜单项的选择和转移;子模块mokuai1.asm显示“欢迎到十堰来”及提示信息;子模块mokuai2.asm显示“欢迎到武当山来”及提示信息。

三个模块都有自己的代码段和数据段,而且模块之间的数据段、代码段不组合,均为自己独立的逻辑段。 参考程序:

;主模块MOKUAI.ASM DISP DATA0

PUBLIC BEG

EXTRN BEG1:FAR,BEG2:FAR MACRO YYXX,VAR MOV AH,2 MOV BH,0 MOV DX,YYXX INT 10H MOV AH,9

MOV DX,OFFSET VAR INT 21H ENDM SEGMENT

40

L1 DB 28 dup(' '),\MENU \ DB 28 dup(' '),\ DB 28 dup(' '),\ DB 28 dup(' '),\ DB 28 dup(' '),\ DB 28 dup(' '),\ DB 28 dup(' '),\ DB 28 dup(' '),\L7 DB 28 dup(' '),\CHOICE(1,2,3):$\DATA0 ENDS

CODE0 SEGMENT 'CODE' ASSUME CS:CODE0,DS:DATA0 BEG: MOV AX,DATA0 MOV DS,AX MOV AX,2 INT 10H DISP 0500H,L1 AGA: DISP 0D00H,L7 MOV AH,1 INT 21H CMP AL,'3' JE EXIT CMP AL,'1' JE N1 CMP AL,'2' JE N2 JMP AGA N1: JMP BEG1 N2: JMP BEG2 EXIT: MOV AH,4CH INT 21H CODE0 ENDS END BEG

;子模块MOKUAI1.ASM PUBLIC BEG1 EXTRN BEG:FAR DISP MACRO YYXX,VAR MOV AH,2 MOV BH,0 MOV DX,YYXX INT 10H MOV AH,9 MOV DX,OFFSET VAR INT 21H

41

ENDM

DATA1 SEGMENT

MESG1 DB 'WELCOME TO SHIYAN!$'

ENDMESG DB 'Please strike any key to return menu$' DATA1 ENDS

CODE1 SEGMENT 'CODE' ASSUME CS:CODE1,DS:DATA1 BEG1: MOV AX,DATA1 MOV DS,AX MOV AH,2 INT 10H DISP 101EH,MESG1 DISP 171DH,ENDMESG MOV AH,1 INT 21H JMP BEG CODE1 ENDS END

;子模块MOKUAI2.ASM PUBLIC BEG2 EXTRN BEG:FAR DISP MACRO YYXX,VAR MOV AH,2 MOV BH,0 MOV DX,YYXX INT 10H MOV AH,9 MOV DX,OFFSET VAR INT 21H ENDM

DATA2 SEGMENT

MESG2 DB 'WELCOME TO WUDANGSHAN!$'

ENDMESG DB 'Please strike any key to return menu$' DATA2 ENDS

CODE2 SEGMENT 'CODE' ASSUME CS:CODE2,DS:DATA2 BEG2: MOV AX,DATA2 MOV DS,AX MOV AH,2 INT 10H DISP 101EH,MESG2 DISP 171DH,ENDMESG MOV AH,1 INT 21H

42

JMP BEG CODE2 ENDS END

思考题:可否将主模块程序中的JE N1 和 N1:JMP BEG1改成 JE BEG1?为什么?

方法二:程序也分为3个模块,程序中使用的数据集中存放在主模块的数据段中,子模块不设置数据段。3个模块的代码段组合成统一的代码段。请同学自己编写该程序,并调式运行。

2、自编程序

⑴编制一主模块DIS1.ASM,显示字符串“Good”,并调用DIS2.ASM。 ⑵编制子模块DIS2.asm,显示字符串“morning!”。 ⑶产生DIS.exe ,运行结果显示:“Good morning!”。 实验说明:

1、 一个汇编模块要引用另一个模块定义的变量,则定义变量的模块用PUBLIC属性来说明

此变量为公共变量;引用变量的模块用EXRTN属性来说明该变量为外部变量。 2、 连接步骤:

①进入MASM 文件夹用masm dis1.asm命令将dis1.asm→dis1.obj ②用masm dis2.asm命令将dis2.asm→dis2.obj ③运行LINK.exe,

键入dis1+dis2 ,连接obj文件名 键入dis ,产生dis.exe文件 实验报告:

1、给出调试通过的程序清单,并加适当注释。 2、总结实验中产生的问题及体会。

43

实验十四 综合程序设计

实验目的:

掌握系统程序设计的方法,全面巩固所学知识内容,提高实际应用能力和应用水平。 实验内容:

题目一、学生成绩管理程序 题目二、员工工资管理程序 实验报告:

1、给出调试通过的程序清单,并附文档说明书。 2、调式中所遇到的问题及解决办法及体会。

44

assume cs: proce

sum proc far

mov bp,sp

mov cx,[bp+6] mov bx,[bp+4] xor ax,ax

adn: add al,[bx]

adc ah,0 inc bx loop adn

mov [bx],ax ret 4

sum endp proce ends

end start

步骤:

1、输入,汇编并将此程序连接成EXE文件。 2、用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用及进出栈指令前后(带';'的语句)的SP和堆栈内容。

3、记录最后结果:SUM1,SUM2的段及偏移地址和它们的内容。 思考题:

1、sum子程序结尾为什么要用 ret 4返回? 2、什么是程序段前缀PSP?

二、完成一个四位十进制数相加的程序设计,形式为:2345+7869=? 要求:1 设计一个子程序,完成从键盘输入一个四位十进制数的操作。 2 设计一个子程序,完成将缓冲区数送屏幕显示功能。 3 设计一个子程序,完成两个数相加操作。 三、子程序递归调用(求阶乘)。 <参考程序>

stack

stack data resul data code main start:

segment stack db 100h dup(?) ends segment dw ? ends segment proc far

assume cs:code,ds:data,ss:stack push ds sub ax,ax push ax

mov ax,data

20

fact

iia:

x2:

fact main code

mov mov call mov ret proc and jne mov ret push dec call pop mul ret endp endp ends end

ds,ax ax,5 fact

resul,ax

al,al iia al,1 ax al fact cx cl

start

步骤:

1、将程序输入,汇编并连接成EXE文件。

2、用DEBUG的断点和T命令检查并记录每层递归嵌套过程的堆栈和AL内容。

3、修改源程序,将阶乘数 3 改为本程序的最大允许值(是多少?),重新汇编连接之。用 DEBUG运行并记录RESUL单元内容。

4、若要在DOS命令下直接运行并显示阶乘结果(16进制形式),试修改程序并 调试运行。(机动) 四、自编程序:用递归方法编程实现两个正整数M和N相乘。 编程说明:

正整数M和N相乘可看作如下形式的递归函数:

?N(M?1) MULT(M)=?

MULT(M?1)?N(M?1)?若设N=15,M=4,则

MULT(4)= MULT(3)+15= MULT(2)+15+15=MULT(1)+15+15+15=15+15+15+15=60=3CH 实验报告:

1、列出实验记录。

2、列出自编程序清单并加注释。 3、回答思考题. 4、写出心得体会。

21

实验八 宏指令及宏调用

实验目的:

1、 熟悉宏定义的一般结构。

2、 掌握宏指令的编写方法和调用方法。

3、 能区别宏调用和子程序调用的不同之处。 4、 了解LOCAL伪操作的用法。

5、 熟悉无参数宏指令和有参数宏指令的定义与调用。 实验内容:

一、无参数宏指令的定义与调用

<参考程序> CRLF MARCO ;宏定义 MOV AH, 02H MOV DL, 0DH INT 21H MOV AH, 02H MOV DL, 0AH INT 21H ENDM DATA SEGMENT STR1 DB ‘PLEASE INPUT STRING1:$’ STR2 DB ‘PLEASE INPUT STRING2:$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,10 AGAIN: MOV AH,09H LEA DX,STR1 INT 21H CRLF ;宏展开 MOV AH,09H MOV DX,OFFSET STR2 INT 21H CRLF ;宏展开 LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START

22

实验步骤:

1. 汇编连接和运行此程序,观察结果。 2. 如果去掉程序中的CRLF(宏展开),运行此程序观察结果。 二、设计一个子功能,完成显示一串文字信息。

三、设计一个子功能,能实现多个字或字节数据连加或连减的功能。 实验报告要求:

1、列出实验记录。

2、列出自编程序清单并加注释。 3、写出心得体会。

23

实验九 数码转换程序

实验目的:

1、掌握二进制和十进制数转换程序的编制和调试。 2、掌握批处理文件的编制及使用。 3、熟悉双字节乘法的编程方法。 实验内容及步骤: 一、数码转换程序

1、将一个十六位二进制数转换成十六进制数显示。 CODE SEGMENT ASSUME CS:CODE

BEGIN: MOV BX,1011000101010111B MOV CH,4 MOV CL,4 ROLT: ROL BX,CL MOV DL,BL AND DL,0FH CMP DL,9 JLE L ADD DL,7 L: ADD DL,30H MOV AH,2 INT 21H DEC CH JNZ ROTL MOV DL,’H’ MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG

进入汇编集成环境,输入、汇编、连接和运行此程序,观察结果。 2、将一个十六位二进制数转换成十进制数并显示输出。 <参考程序> DATA SEGMENT BUF0 DW 2768H BUF1 DB 5 DUP(0)

BUF2 DW 10000,1000,100,10,1 DATA ENDS CODE SEGMENT

24

实验报告:

1、列出实验记录。

2、给出调式通过程序清单,并加注释。

30

实验十一 活动图形显示程序

实验目的:

1、掌握利用INT 10H实现活动图形的方法。 2、INT 10H 的 2号,6号,0AH号功能。 实验内容:

参考下列程序自编一活动的复合图形显示程序。 <活动字符图形显示程序> stack segment stack

db 256 dup(0)

stack ends code segment

assumecs: code,ss:stack

move: mov cx,0

mov dx,184fh mov bh,7

mov ax,0618h int 10h mov dx,0 mov cx,1 mov bh,0

rept: mov ah,2

int 10h mov ah,10 mov al,0fh int 10h call dely mov al,20h mov ah,10 int 10h inc dh inc dl inc dl cmp dh,25 jne rept mov ah,4ch int 21h

dely proc

push cx push dx mov cx,5

lop: mov dx,0

31

dec dx jne lop1 loop lop pop dx pop cx ret

dely endp code ends

end move

<静止复合图形显示程序>

stack segment stack

db 256 dup(0)

stack ends data segment chrtab dw 7

db 0dbh,0,0,0dbh,0,1 db 0dbh,0,1,52h,0,1 db 1,-1,-1,9,2,0 db 9,0,-2

data ends code segment

assume cs:code,ss:stack,ds:data

start: mov ax,data

mov ds,ax mov cx,0

mov dx,184fh mov bh,7

mov ax,0618h int 10h

lea di,chrtab mov cx,[di] mov dx,400h add di,2

next: add dh,[di+1]

add dl,[di+2] mov ah,2 mov bh,0 int 10h push cx mov cx,1 mov ah,10 mov al,[di] int 10h pop cx add di,3

32

lop1:

code

loop next mov ah,4ch int 21h ends

end start

实验报告:

1、给出调试通过程序清单,并加注释。 2、总结调试中产生的问题。

33

实验十二 磁盘文件操作程序

实验目的:

1、掌握利用FCB进行磁盘文件读写的方法。 2、掌握利用HANDLE进行磁盘文件读写的方法。

3、INT 21H 0FH,10H,14H,15H,16H,1AH号功能调用。 4、INT 21H 3CH,3DH,3FH,40H号功能调用。 实验内容:

一、文本文件内容显示程序:

stack segment stack

db 100h dup(?)

stack ends data segment fcb db 36 dup(0) count db 0 char db 0 dta db 0 errmsg db 'file access error' data ends code segment main proc far

assume cs:code,ss:stack

start: push ds

sub ax,ax push ax

mov ax,data mov es,ax assume es:data mov si,5ch

mov di,offset fcb mov cx,12 cld

rep movsb mov ds,ax assume ds:data

mov dx,offset dta mov ah,1ah int 21h

mov dx,offset fcb mov ah,0fh int 21h cmp al,0

34

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

Top