汇编实验报告

更新时间:2024-06-14 03:34:01 阅读量: 综合文库 文档下载

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

贵 州 大 学 实 验 报 告 纸

系 别 工学部 班 级 通信101 姓 名 成 绩 评 定 何其肖 学号 1020040613 课 程 名 称 实 验 时 间 实验一

微机原理与汇编语言 如果在DOS提示符下,可键入命令,包含文件名: C>debug name.exe

段寄存器DS和ES指向PSP。寄存器BX和CX含有程序长度。 2、DEBUG的主要命令

教师签名 (1) 汇编命令A,格式为:

-A[地址]

该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开

2012年 12 月 25 日 DEBUG命令实验

例如: -a

始的存储器中。

一.实验目的:

掌握DEBUG 的基本命令及其功能

二.实验内容:

DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。

1、DEBUG程序的启动 DEBUG的命令格式:

[drive:][path] DEBUG [d:][p][filename][.ext][param...] 其中:

drive: 是指定DEBUG文件的磁盘驱动器标识符,DEBUG是外部DOS命令,所以必须把它从磁盘读入内存。若未指定,DOS将使用当前默认磁盘驱动器。

path: 是DOS查找DEBUG文件的一个子目录串表示的路径。若未指定,DOS将使用当前工作目录。 d: 是DEBUG将要调试的文件所在的磁盘驱动器。

p: 是查找DEBUG将要调试的文件所需的子目录路径,若未指定,DOS使用当前目录。 filename[.ext] 是DEBUG将要调试的文件名。 param 是将被调试的程序(或文件)的命令行参数。 例如:在DOS提示符下,可键入命令: C>debug

DEBUG所完成的初始化动作,假定文件名没有,启动DEBUG: 段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。 指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。

堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。 其余通用寄存器均置为0,标志寄存器置为下述状态。 NV UP EI PL NE NA PO NC

1

136B:0100 mov ax,100 136B:0103 mov bx,200 136B:0106 mov cx,300 136B:0109 mov dx,400 136B:010C -

(2) 反汇编命令U,有两种格式: 1)-U[地址]

该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。 例如: -u

13C9:0000 1E PUSH

DS

13C9:0001 2BC0 SUB AX,AX 13C9:0003 50 PUSH

AX

13C9:0004 B8C313 MOV AX,13C3 13C9:0007 8ED8 MOV DS,AX 13C9:0009 B8C613 MOV AX,13C6 13C9:000C 8EC0 MOV ES,AX 13C9:000E 8D360000 LEA SI,[0000] 13C9:0012 8D3E0000 LEA DI,[0000] 13C9:0016 FC CLD 13C9:0017 B92800 MOV CX,0028 13C9:001A F3 REPZ 13C9:001B A4 MOVSB 13C9:001C CB RETF

13C9:001D 0000 ADD [BX+SI],AL 13C9:001F 0000 ADD [BX+SI],AL 2)-U范围

该命令对指定范围的内存单元进行反汇编, 例如:

-u 13c9:000e 001b

13C9:000E 8D360000 LEA SI,[0000] 13C9:0012 8D3E0000 LEA DI,[0000] 13C9:0016 FC CLD 13C9:0017 B92800 MOV CX,0028 13C9:001A F3 REPZ 13C9:001B A4 MOVSB

-

(3) 运行命令G,格式为:

-G [=地址1][地址2[地址3。。。]]

其中地址1规定了运行起始地址,后面的若干地址均为断点地址。

例如: -g1c

AX=13C6 BX=0000 CX=0000 DX=0000 SP=FFFC BP=0000 SI=0028 DI=0028 DS=13C3 ES=13C6 SS=13C3 CS=13C9 IP=001C NV UP EI PL ZR NA PE NC 13C9:001C CB RETF

-

(4) 追踪命令T,有两种格式: 1)逐条指令追踪:

-T[=地址]

该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。 -t

AX=0000 BX=0000 CX=007D DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=13B3 ES=13B3 SS=13C3 CS=13C9 IP=0001 NV UP EI PL NZ NA PO NC 13C9:0001 2BC0 SUB AX,AX -

2)多条指令追踪:

-T[=地址][值]

该命令从指定地址起执行n条命令后停下来,n由[值]确定。 -t 3

AX=0000 BX=0000 CX=007D DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000

DS=13B3 ES=13B3 SS=13C3 CS=13C9 IP=0001 NV UP EI PL NZ NA PO NC 13C9:0001 2BC0 SUB AX,AX

AX=0000 BX=0000 CX=007D DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=13B3 ES=13B3 SS=13C3 CS=13C9 IP=0003 NV UP EI PL ZR NA PE NC 13C9:0003 50 PUSH AX

AX=0000 BX=0000 CX=007D DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000 DS=13B3 ES=13B3 SS=13C3 CS=13C9 IP=0004 NV UP EI PL ZR NA PE NC 13C9:0004 B8C313 MOV AX,13C3 (5) 显示内存单元内容的命令D,格式为:

-D[地址]或-D[范围]

-d ds:0

13C3:0000 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa 13C3:0010 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa 13C3:0020 61 61 61 61 61 61 61 61-00 00 00 00 00 00 00 00 aaaaaaaa........ 13C3:0030 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa 13C3:0040 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa 13C3:0050 61 61 61 61 61 61 61 61-00 00 00 00 00 00 00 00 aaaaaaaa........ 13C3:0060 1E 2B C0 50 B8 C3 13 8E-D8 B8 C6 13 8E C0 8D 36 .+.P...........6 13C3:0070 00 00 8D 3E 00 00 FC B9-28 00 F3 A4 CB 00 00 00 ...>....(....... -

(6) 修改内存单元内容的命令E,它有两种格式:

1)用给定的内容代替指定范围的单元内容: -E地址 内容表

例如:-E 2000:0100 F3 “XYZ” 8D

其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元2000:0100到0104的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。 2)逐个单元相继地修改: -E地址 例如:-E 100:

18E4:0100 89.78

此命令是将原100号单元的内容89改为78。78是程序员键入的。

(7) 检查和修改寄存器内容的命令R,它有三种方式:

1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R

R命令显示中标志位状态的含义如下表所示:

2

标 志 名 溢出Overflow(是/否) 方向Direction(减量/增量) 中断Interrupt(允许/屏蔽) 符号Sign(负/正) 零Zero(是/否) 辅助进位Auxiliary Carry(是/否) 奇偶Parity(偶/奇) 进位Carry(是/否)

2)显示和修改某个指定寄存器内容,格式为:

-R 寄存器名 例如打入:-R AX 系统将响应如下:

AX FIF4 :

Q

置 位 OV DN EI NG ZR AC PE CY 复 位 NV UP DI PL NZ NA PO NC -L [地址]

此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。 在用L命令前,BX和CX中应包含所读文件的字节数。

(10)写命令W,有两种格式:

2)把数据写入指定文件中: -W [地址]

此命令把指定内存区域中的数据写入由CS:5CH处的FCB所规定的文件中。在用W命令前,BX和CX中应包含要写入文件的字节数。

(11)退出DEBUG命令Q,该命令格式为

1)把数据写入磁盘的指定扇区: -W 地址 驱动器 扇区号 扇区数

它退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘,如需存盘,应在执行Q命令前先执行写命令W。

表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如: -R BX BX 0369 :059F

则BX内容由0369改为059F

三.实验报告:

写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。

3)显示和修改标志位状态,命令格式为:

-RF

系统将给出响应,如 OV DN EI NG ZR AC PE CY-

这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如 OV DN EI NG ZR AC PE CY-PONZDINV

(8) 命名命令N,格式为:

-N 文件名

此命令将文件名格式化在CS:5CH的文件控制块内,以便使用L或W命令把文件装入内存进行调试或者存盘。

(9) 装入命令L,它有两种功能:

1)把磁盘上指定扇区的内容装入到内存指定地址起始的单元中,格式为: -L 地址 驱动器 扇区号 扇区数 2)装入指定文件,格式为:

3

实验二 汇编语言程序设计的基本方法和基本步骤

C:\\masm>link test613.obj

IBM Personal Computer Linker

Version 2.00 (C)Copyright IBM Corp 1981, 1982, 1983 一、实验内容

6-13 已知在内存中从TAB单元起存放0—100的平方值。在X单元中有一个特查数据,用查表的方法求出X的平方值送到Y单元中。

6-14 通过键盘输入一个2位的十进制数,存入RESULT单元,要求以二进制存放。

通过键盘输入指令接受的数据为十进制数的ASCII码,例如要输入的十进制数35,则先输入字符“3”,计算机接收为33H;输入为“5”,计算机接收为35H。程序中必须作相应的变换才能得到35的二进制值。方法如下:

⑴AL←键盘输入第一个十进制数。 ⑵BL←AL中的内容。

⑶AL←从键盘输入的第二个十进制数字。 ⑷AL←AL*10

⑸AL←(AL)+(BL) ⑹RESULT←(AL)

二、实验目的

设计一个良好的程序应该满足设计要求除了能够正常运行和实现指定的功能之外,还应该满足:

1 程序要结构化,简明,易读和易调试 2 执行速度快

3 占用内存空间小,即存储容量小。

在初期的计算机中,由于存储设备价格昂贵,容量有限,一般要尽量少占用存储空间。随着科学技术和生产技术的发展,半导体存储器的单片容量不断增大,磁盘密度不断提高,而且相应的价格也逐渐下降,因此有时也就不特别注重容量的问题了。但是对有些计算机应用场合,如智能化的仪器仪表、电脑化的家用电器等设备中的监控程序,一般都是采用汇编语言编写程序。这就要求它的功能要强,程序要短,存储容量不能太大,才能达到微型化及价格低的目的。

程序执行速度问题在某些实时控制、跟踪等程序中显得特别突出。例如对一些对象中的某些参数进行实时控制,如果参数变化速度很快,程序执行速度太慢,就会发生失控现象。当然速度和容量有时是矛盾的,要根据实际问题来进行权衡。

用汇编语言设计程序,一般按下述步骤进行:

(1) 分析问题,抽象出描述问题的数学模型。分析问题的目的就是求得对问题有一个确切的理解,

明确问题的环境限制,弄清已知条件、原始数据、输入信息、对运算精度的要求、处理速度的要求以及最后应获得的结果。

(2) 明确解决问题的算法或解题思想。所谓算法,就是确定解决问题的方法和步骤。一类问题可

以同时存在几种算法,评价算法好坏的指标是程序执行的时间和占用存储器的空间、设计该算法和编写程序所投入的人力、理解该算法的难易程度以及可扩充性和可适应性等。

三、实验步骤

1 编译 MASM>test613

Object filename [test613.OBJ]:

Source listing [NUL.LST]: Cross-reference [NUL.CRF]: 2 链接 LINK>test613

4

Run File [TEST613.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

3 DEBUG 源程序

C:\\masm>debug test613.exe -u

1582:0000 B88015 MOV AX,1580 1582:0003 8ED8 MOV DS,AX 1582:0005 BB0000 MOV BX,0000 1582:0008 A01000 MOV AL,[0010] 1582:000B B400 MOV AH,00 1582:000D D1E0 SHL AX,1 1582:000F 8A17 MOV DL,[BX] 1582:0011 8A7701 MOV DH,[BX+01] 1582:0014 89161100 MOV [0011],DX 1582:0018 B44C MOV AH,4C 1582:001A CD21 INT 21

1582:001C 0000 ADD [BX+SI],AL 1582:001E 0000 ADD [BX+SI],AL -u

1582:0000 B88015 MOV AX,1580 1582:0003 8ED8 MOV DS,AX 1582:0005 BB0000 MOV BX,0000 1582:0008 A01000 MOV AL,[0010] 1582:000B B400 MOV AH,00 1582:000D D1E0 SHL AX,1 1582:000F 8A17 MOV DL,[BX] 1582:0011 8A7701 MOV DH,[BX+01] 1582:0014 89161100 MOV [0011],DX 1582:0018 B44C MOV AH,4C 1582:001A CD21 INT 21

1582:001C 0000 ADD [BX+SI],AL 1582:001E 0000 ADD [BX+SI],AL -t

AX=1580 BX=0000 CX=0080 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1570 ES=1570 SS=1580 CS=1582 IP=0003 NV UP DI PL NZ NA PO NC 1582:0003 8ED8 MOV DS,AX

四、实验调试后程序清单

例6-13

DATA SEGMENT

TABLE DW 0,1,2,4,9,16,25,36 X DB 4

RESU DW ? DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE MOV AL,X MOV AH,0 SHL AX,1 MOV DL,[BX] MOV DH,[BX+1] MOV RESU,DX MOV AH,4CH INT 21H CODE ENDS

END START??

例 6-14

DATA SEGMENT

MESS DB 'PLEASE INPUT SECOND NUMBER:',0AH,0DH,'$' RESULT DB ? DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESS MOV AH,09H INT 21H MOV AH,01H INT 21H SUB AL,30H XCHG BL,AL MOV CL,10 MUL CL MOV BH,0 ADD AX,BX MOV RESULT,AL MOV AH,4CH

INT 21H

CODE ENDS ENDS START

五、实验结果

六、实验总结

5

实验三 分支结构程序设计

一、 实验内容

7-4 从键盘输入一个字符,在其最高位加奇校验位后送入X单元中。

分析:键盘上输入的是一个ASCII码,最高位为0,通过某种指令判断该字符中1的个数的奇偶性,若为奇数个1,高位不变,否则将高位置1。

7-5 已知X、Y是单字节无符号数,请设计程序计算: 当0≤X<10时 Y=X/4 X≥10时 Y=X-10

7-6 假设有三个单字节带符号数X、Y、Z,试编程实现将其中的最大数送MAX单元的功能

分析:要实现在三个数中找到最大数,首先在X、Y中找出最大数送AL寄存器中,然后用AL中的内容再和Z中的内容进行比较,再把两者中的最大数送AL,这样AL中的内存器即为三个数中的最大数。

7-9从键盘输入一个十六进制数码,将其转换成二进制数在内存中存储起来。若输入的不是十六进制数码,则显示“INPUT ERROR!”。

分析:十六进制数码包括阿拉伯数字0—9的ASCII码是30H—39H,英文字母A—F的ASCII码是41H—46H。程序中必须首先判断输入的内容是否为十六进制数码,是则完成ASCII码到二进制的转换,否则显示出错信息。转换方法是:若接收的按键是阿拉伯数字,则将ASCII码减去30H,若是A—F中的某一个英文字母,则将ASCII码减去37H。

9—10 将例7-9中的功能用地址表方法实现

二、实验目的

⑴ 掌握转移类指令的分类与应用 ⑵ 学习分支程序的基本结构 ⑶ 理解分支结构程序的设计方法 ⑷ 了解分支结构程序的设计实例

一般情况下指令的顺序是逐条执行的,但是在实际上程序不可能总是顺序执行,经常需要改

变程序的执行流程。控制转移类指令用来改变程序执行的方向,即修正指令指针寄存器IP和段地址寄存器CS的值。根据转移位置,将转移指令分为段内转移和段间转移。转移目标位置的地址如果是直接给出的,则称为直接寻址,转移位置的目标地址如果是通过访问内存单元或寄存器取得的,则称为间接寻址。

三、实验步骤

1 编译MASM>test704

Object filename [test704.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]:

2 链接C:\\masm>link test704.OBJ

6

C:\\masm>link test704.obj

Run File [TEST704.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

3 Debug源程序

C:\\masm>DEBUG -t

AX=0000 BX=0000 CX=0000 DX=0000 SP=CFDC BP=0000 SI=0000 DI=0000 DS=14FD ES=14FD SS=14FD CS=14FD IP=0101 NV UP DI PL NZ NA PO NC 14FD:0101 EB08 JMP 010B -u

14FD:0101 EB08 JMP 010B

14FD:0103 8B5E06 MOV BX,[BP+06]

14FD:0106 C747060000 MOV WORD PTR [BX+06],0000 14FD:010B 8B5E06 MOV BX,[BP+06]

14FD:010E 837F0600 CMP WORD PTR [BX+06],+00 14FD:0112 750C JNZ 0120

14FD:0114 8A4604 MOV AL,[BP+04] 14FD:0117 D0D8 RCR AL,1 14FD:0119 7305 JNB 0120 14FD:011B B8FFFF MOV AX,FFFF 14FD:011E EB35 JMP 0155

14FD:0120 8B5E06 MOV BX,[BP+06]

四、实验调试后的程序清单

例 7-4

DATA SEGMENT X DB ? DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H AND AL,AL JNP NEXT OR AL,80H NEXT: MOV X,AL MOV AH,4CH INT 21H

CODE ENDS END START

例7-5

DATA SEGMENT X DB 6 DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,10 JB NEXT SUB AL,10 JMP EXIT NEXT: SHR AL,1 EXIT: MOV AL,X MOV AH,4CH INT 21H CODE ENDS END START

例7-6

DATA SEGMENT X DB 19 Y DB -25 Z DB 38 MAX DB ? DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL,X MOV AL,Y NEXT1: CMP AL,Z JG NEXT2 MOV AL,Z

NEXT2: MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START

例7-9

DATA SEGMENT

MESS DB '0 MODE0 1 MODE1' , 0AH,0DH DB '2 MODE2 3 MODE3' , 0AH,0DH DB '4 MODE4 5 MODE5' , 0AH,0DH DB '6 MODE6 7 MODE7' , 0AH,0DH DB '8 MODE8 9 MODE9' , 0AH,0DH

DB 'PLEASE INPUT ANY KEY' , 0AH,0DH,'$' ERR DB 'INPUT ERROR',0AH,0DH,'$' DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET MESS MOV AH,09H INT 21H

INKEY: MOV AH,01H INT 21H SUB AL,30H CMP AL,30H JL ERR1 CMP AL,00H JL ERR1 CMP AL,9H JG ERR1 MOV AH,0H

MOV BX,OFFSET TABLE ADD AX,AX ADD BX,AX MOV DL,0AH MOV AH,02H INT 21H JMP BX

ERR1: MOV DX,OFFSET ERR MOV AH,09H INT 21H JMP INKEY

TABLE: JMP SHORT MODE0 JMP SHORT MODE1 JMP SHORT MODE2 JMP SHORT MODE3 JMP SHORT MODE4 JMP SHORT MODE5 JMP SHORT MODE6 JMP SHORT MODE7

7

JMP SHORT MODE8 JMP SHORT MODE9 MODE0: MOV AH,02H MOV DL,'0' INT 21H JMP EXIT MODE1: MOV AH,02H MOV DL,'1' INT 21H JMP EXIT

MODE2: MOV AH,02H MOV DL,'2' INT 21H JMP EXIT MODE3: MOV AH,02H MOV DL,'3' INT 21H JMP EXIT MODE4: MOV AH,02H MOV DL,'4' INT 21H JMP EXIT MODE5: MOV AH,02H MOV DL,'5' INT 21H JMP EXIT MODE6: MOV AH,02H MOV DL,'6' INT 21H JMP EXIT MODE7: MOV AH,02H MOV DL,'7' INT 21H JMP EXIT MODE8: MOV AH,02H MOV DL,'8' INT 21H JMP EXIT MODE9: MOV AH,02H MOV DL,'9' INT 21H JMP EXIT EXIT: MOV AH,4CH INT 21H CODE ENDS END START

例 7-10

DATA SEGMENT

TABLE DW MODE0, MODE1, MODE2, MODE3, MODE4 DW MODE5, MODE6, MODE7, MODE8, MODE9 MESS DB 'PLEASE INPUT ANY KEY',0AH,0DH,'$' MESS0 DB 'FUCK YOU',0AH,0DH,'$' MESS1 DB 'YOU ARE A MICE',0AH,0DH,'$' MESS2 DB 'IN MY DREAMS,I SEE YOU ',0AH,0DH,'$' MESS3 DB 'YOU ARE TOO FET',0AH,0DH,'$' MESS4 DB 'I LOVE SONGHUIQIAO,HOW ABOUT YOU',0AH,0DH,'$' MESS5 DB 'I FELL IN LOVE A GIRL',0AH,0DH,'$' MESS6 DB 'THAT IS HOW I KNOW YOU GO ON',0AH,0DH,'$' MESS7 DB 'GIRL I LOVE YOU',0AH,0DH,'$' MESS8 DB 'LOVE CAN TOUCH US ONE TIME',0AH,0DH,'$' MESS9 DB 'ONE TRUE I HOLD YOU',0AH,0DH,'$' MESS10 DB 'TUI CHU SHU RU Q',0AH,0DH,'$' ERR DB 'INPUT ERROR',0AH,0DH ,'$' DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET MESS MOV AH,09H INT 21H

INKEY: MOV AH,01H INT 21H SUB AL,30H CMP AL,00H JL ERR1 CMP AL,09H JG ERR1 MOV AH,0

MOV BX,OFFSET TABLE ADD AX,AX ADD BX,AX MOV DL,0AH MOV AH,02H INT 21H

MOV DL,0DH INT 21H

JMP WORD PTR [BX] ERR1: MOV DX,OFFSET ERR MOV AH,09H INT 21H JMP INKEY

8

MODE0: MOV AH,02H

MOV DX,OFFSET MESS0 MOV AH,09H INT 21H

JMP YORN MODE1: MOV AH,02H

MOV DX,OFFSET MESS1 MOV AH,09H INT 21H JMP YORN MODE2: MOV AH,02H

MOV DX,OFFSET MESS2 MOV AH,09H INT 21H JMP YORN MODE3: MOV AH,02H

MOV DX,OFFSET MESS3 MOV AH,09H INT 21H JMP YORN MODE4: MOV AH,02H

MOV DX,OFFSET MESS4 MOV AH,09H INT 21H JMP YORN MODE5: MOV AH,02H

MOV DX,OFFSET MESS5 MOV AH,09H INT 21H JMP YORN MODE6: MOV AH,02H

MOV DX,OFFSET MESS6 MOV AH,09H INT 21H JMP YORN MODE7: MOV AH,02H

MOV DX,OFFSET MESS7 MOV AH,09H INT 21H JMP YORN MODE8: MOV AH,02H

MOV DX,OFFSET MESS8 MOV AH,09H INT 21H JMP YORN MODE9: MOV AH,02H

MOV DX,OFFSET MESS9 MOV AH,09H INT 21H JMP YORN

YORN: MOV DX,OFFSET MESS10 MOV AH,09H INT 21H

MOV AH,01H INT 21H CMP AL,51H JE EXIT JMP START EXIT: MOV AH,4CH INT 21H CODE ENDS END START

五、实验结果

六、实验总结

9

试验四 循环结构程序设计

一、 试验内容

例8-2 已知在数据段中有一个字符串STR1单元起开始存放,现要求编程实现把字符串传送至数据段从STR2单元开始的数据区中。

例8-4 已知内存中有两个字符串STR1和STR2,比较两个字符串是否相等,若相等,将FLAG单元置1,否则送0.

例8-6 通过键盘输入一个字符串,送入数据段的存储器中,以回车结束,统计字符串中数字的个数。

例8-7 已知在内存中有一个字符串,长度为CN,找出这个字符串中的第一个空格,若找到,将其地址送到ADDR单元。将FLAG(单元)置1,否则将FLAG单元清零。

分析:这个题目是一个单循环,控制循环退出的情况有两种:一个是未找到空格,即循环计数器到达终止值;另一个是找到空格,即计数器未到终止值就退出循环。

例8-8 设有两个字数组X和Y,各含有十个元素,分别是X0---X9,Y0---Y9,要求编程完成以下运算:

Z0=X0+Y0 Z1=X1+Y1 Z2=X2+Y2 Z3=X3+Y3 Z4=X4+Y4 Z5=X5+Y5 Z6=X6+Y6 Z7=X7+Y7 Z8=X8+Y8 Z9=X9+Y9

根据题目要求可知,两数组间的元素有两种运算:加或减。为了区别,可以设置标志位,用0标识加法,用1表示减法。共有十个元素,应设置十个标志位。把这十个标志位按从低位到高位的顺序放在一个存储单元中,则此单元即为逻辑尺。

例8-10 将从STR单元开始的一个字符串中的所有大写字母改为小写字母,该字符串以00H结尾。 分析:这是一个循环次数不定的循环程序结构,应用转移指令,决定是否结束循环,循环体判断每个字符,如果是大写字母则转为小写字母,否则不予处理;循环体中具有分支结构,大小写字母的ASCII码得不同之处是:大写字母D5=0,而小写字母D5=1.

例8-12 在一个数据块中查找是否有字母“A”,若有则将其位置显示出来,若没有,则将DI送0,不作任何显示。

分析:在一个数据块中查找某一个数据,可以使用串指令SCAN。

操作。

3 循环参数修改部分,为保证每次循环都能正常完成,相关信息要发生有规律的变化,为下次循环做准备。

4 循环控制部分,循环控制是循环程序设计的关键,每个循环程序必须选择一个恰当的循环控制条件来控制循环的运行和结束。

三、试验步骤

1 编译 c:\\masm>masm test

Object filename [test.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]:

2 链接 C:\\masm>link test

Run File [TEST802.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

4 debug 源程序 C:\\masm>debug

0 Warning Errors 0 Severe Errors

C:\\masm>link test802

IBM Personal Computer Linker

Version 2.00 (C)Copyright IBM Corp 1981, 1982, 1983

Run File [TEST802.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

Warning: No STACK segment

There was 1 error detected.

C:\\masm>debug -t

AX=0000 BX=0000 CX=0000 DX=0000 SP=CFDC BP=0000 SI=0000 DI=0000 DS=10F3 ES=10F3 SS=10F3 CS=10F3 IP=0101 NV UP DI PL NZ NA PO NC 10F3:0101 EB08 JMP 010B

10

二、试验目的

理解循环控制指令的格式与应用 掌握串操作指令的格式与应用 认识循环程序的基本结构 了解循环程序设计实例

循环结构程序结构是三大基本程序结构之一,一个循环结构的程序主要由以下4个部分组成:

1 循环初始化部分,在进入循环程序之前,要进行循环程序初始状态的设置,一般称为初始化设置。

2 循环体,循环体是完成循环工作的主要部分,使用循环程序的目的就是要重复执行这段

-u

10F3:0101 EB08 JMP 010B

10F3:0103 8B5E06 MOV BX,[BP+06]

10F3:0106 C747060000 MOV WORD PTR [BX+06],0000 10F3:010B 8B5E06 MOV BX,[BP+06]

10F3:010E 837F0600 CMP WORD PTR [BX+06],+00 10F3:0112 750C JNZ 0120

10F3:0114 8A4604 MOV AL,[BP+04] 10F3:0117 D0D8 RCR AL,1 10F3:0119 7305 JNB 0120

10F3:011B B8FFFF MOV AX,FFFF 10F3:011E EB35 JMP 0155

10F3:0120 8B5E06 MOV BX,[BP+06]

四、实验调试后的程序清单

例8-2

DATA SEGMENT

STR1 DB '0123456789ABCDE' CN EQU $-STR1 STR2 DB CN DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,CN LEA SI,STR1 LEA DI,STR2 LP: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP LP MOV AH,4CH INT 21H CODE ENDS

END START

例8-4

DATA SEGMENT

STR1 DB 'ASDFGHJK' CN EQU $-STR1 STR2 DB 'ASDFGTYU' FLAG DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV FLAG,1H

MOV SI,OFFSET STR1 MOV DI,OFFSET STR2 MOV CX,CN CLD

REPZ CMPSB JZ NEXT

MOV FLAG,0H NEXT: MOV AH,4CH INT 21H CODE ENDS

END START

例8-6

DATA SEGMENT

STR1 DB 'PLEASE INPUT STRING:',0AH,0DH,'$' STBUF DB 100 DUP(?) CN DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET STR1 MOV AH,09H INT 21H MOV CL,0H LP: CMP AL,0DH JZ EXIT

MOV [SI],AL INC SI

CMP AL,30H JB NEXT CMP AL,39H JA NEXT INC CL

NEXT: MOV AH,01H INT 21H JMP LP

EXIT: MOV CN,CL

11

MOV AH,4CH INT 21H CODE ENDS

END START

例8-7

DATA SEGMENT

STR1 DB 'WHAT IS YOUR NAME',0AH,0DH,'$' CN EQU $-STR1 ADDR DW ? FLAG DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,CN

MOV DI,OFFSET STR1 MOV AL,20H REPNZ SCASB JNZ NEXT DEC DI

MOV DI,ADDR MOV FLAG,01H JMP EXIT

NEXT: MOV FLAG,0H EXIT: MOV AH,4CH INT 21H CODE ENDS

END START

例8-8

DATA SEGMENT

X DW 112,342,-56,34,42,546,324,2,4,12,42 Y DW -42,-442,140,123,5,21,542,656,126,12 Z DW 10 DUP(?) F DW 0198H DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV SI,OFFSET X MOV DI,OFFSET Y MOV BX,OFFSET Z

MOV DX,F MOV CX,10 LP: ROR BX,1H JZ NEXT MOV AX,[SI] ADD AX,[DI] MOV [BX],AX JMP EXIT NEXT: MOV AX,[SI] SUB AX,[DI] MOV [BX],AX EXIT: ADD SI,2 ADD DI,2 LOOP LP

MOV AH,4CH INT 21H CODE ENDS

END START

例8-10

DATA SEGMENT

STR DB 'WHAT IS YOUR NFSAKENFSA ',0 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV SI,OFFSET STR MOV AL,[SI] LP: CMP AL,0 JZ EXIT CMP AL,'A' JB NEXT CMP AL,'Z' JA NEXT OR AL,20H MOV [SI],AL NEXT: INC SI

MOV AL,[SI] JMP LP

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

END START

12

例8-12

DATA SEGMENT

DAT1 DB 'THIS IS A PROGRAM' CN EQU $-DAT1 DAT2 DB 'A' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX CLD

MOV AL,DAT2 LEA DI,DAT1 REPNZ SCASB JZ FIND JMP EXIT FIND: DEC DI MOV BX,4 LP: MOV CL,4 ROL DI,CL MOV DX,DI AND DL,0FH CMP DL,9 JBE NEXT ADD DL,07H NEXT: ADD DL,30H MOV AH,20H INT 21H DEC BX JNZ LP

MOV DL,'H' MOV AH,02H INT 21H

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

END START

五、实验结果

六、实验总结

13

试验五 子程序设计

一、试验内容

例9-6 在内存中有一子单元ADR,存有4位BCD码,要求编写一个程序,完成将其转换成4个字节的非组合BCD码并存放到以BUF为首单元的存储区中的功能。

分析:根据题意,可将被分离的字数据放入AX中,用寄存器DI指向存放结果的首单元,实现BCD码的分离可以用截取低4位右移4位的方法连续进行4次完成。

例9-7 已知在内存中有两个字节数组,分别求两个数组的累加和,要求用子程序实现。

分析:完成求累加和的子程序可以通过堆栈传递参数。将数组首单元的地址和数组长度

送入堆栈,调用子程序完成求和功能。

例9-8 从键盘向缓冲区BUF中输入若干位十进制的ASCII码,并转换为二进制数,存于BIN

开始的字单元中。BUF中的数字以0DH结束。

例9-9 假设有一子程序HTOA,将一位十六进制数转换为ASCII码,利用其可实现两位十六

进制数转换为ASCII码的子程序BHTOA和四位十六进制转换为ASCII码的子程序QHTOA。

例9-10 用递归的方法将一个字符数组中的字符串反序输出,字符串以‘$’结束。

二、实验目的

掌握子程序的定义

学习子程序设计的基本过程和设计方法 理解子程序的嵌套和递归 了解中断的相关概念

熟悉DOS功能调用和BIOS调用

在程序设计中,常把多用到的同一程序段或者具有一定功能的程序段抽取出来存放在某一存储区域中,当需要执行的时候,使用调用指令转到这段程序来执行,执行完再返回原来的程序,这个程序段就成为子程序。子程序的设计与使用非常重要。子程序又称为过程,它相当于高级语言中的过程或函数。在执行中需要反复执行的程序段或具有通用性的程序段都可以编为子程序。其中调用子程序的程序段称为主程序。主程序中调用指令的下一条指令的地址成为返回地址,有时也成为断点。

子程序是模块化程序设计的重要手段,采用子程序结构具有以下优点: 1 简化程序设计过程,大量节省程序设计时间;

2 缩短了程序的长度,节省了计算机汇编源程序的时间和程序的存储空间; 3 增加了程序的可读性,便于对程序进行修改和调试; 4 方便程序的模块化,结构化和自顶向下的程序。

三、试验步骤

1 编译C:\\masm>masm test.asm Object filename [test906.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]:

2 链接C:\\masm>link test.obj

14

Run File [TEST906.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

3 debug 源程序C:\\masm>debug test -t

AX=1168 BX=0000 CX=0080 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1158 ES=1158 SS=1168 CS=1169 IP=0003 NV UP DI PL NZ NA PO NC 1169:0003 8ED8 MOV DS,AX -u

1169:0003 8ED8 MOV DS,AX 1169:0005 A10000 MOV AX,[0000] 1169:0008 BF0200 MOV DI,0002 1169:000B E80A00 CALL 0018 1169:000E B90400 MOV CX,0004 1169:0011 E82400 CALL 0038 1169:0014 B44C MOV AH,4C 1169:0016 CD21 INT 21 1169:0018 53 PUSH BX 1169:0019 51 PUSH CX 1169:001A 50 PUSH AX 1169:001B 57 PUSH DI

1169:001C B90400 MOV CX,0004 1169:001F 8BD8 MOV BX,AX 1169:0021 83E30F AND BX,+0F

四、实验调试后的程序清单

例9-6

DATA SEGMENT ADR DW 3425H BUF DB 4 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,ADR

MOV DI,OFFSET BUF CALL APART MOV CX,4 CALL DISP MOV AH,4CH

INT 21H

APART PROC NEAR PUSH BX PUSH CX PUSH AX PUSH DI MOV CX,4 STA: MOV BX,AX AND BX,00FH MOV [DI],BL INC DI SHR AX,1 SHR AX,1 SHR AH,1 SHR AH,1 SHR AH,1 LOOP STA POP DI POP AX POP CX POP BX RET APART ENDP

DISP PROC NEAR PUSH DI PUSH AX PUSH CX PUSH DX MOV CX,4 ADD DI,3 LP: MOV DL,[DI] ADD DL,30H MOV AH,02H INT 21H DEC DI LOOP LP POP DX POP CX POP AX POP DI RET DISP ENDP CODE ENDS

END START

例9-7

DATA SEGMENT

ARRA DB 13,24,45,36,34,90,87,-63 CNA EQU $-ARRA SUMA DW ?

ARRB DB -21,23,-34,56,65,67,78,81,69,0 CNB EQU $-ARRB SUMB DW ? DATA ENDS

STACK SEGMENT

STA DB 100 DUP(?) TOP EQU 100 STACK ENDS CODE SEGMENT

ASSUME DS:DATA,CS:CODE,SS:STACK START: MOV AX,DATA MOV DS,AX

MOV AX,STACK MOV SS,AX MOV SP,TOP

MOV SI,OFFSET ARRA PUSH SI

MOV AX,CNA PUSH AX CALL SUM

MOV SI,OFFSET ARRB PUSH SI

MOV AX,CNB PUSH AX CALL SUM MOV AH,4CH INT 21H SUM PROC NEAR PUSH AX PUSH BX PUSH CX PUSH BP PUSHF MOV BP,SP

MOV BX,[BP+14] MOV CX,[BP+12] MOV AX,0 LP1: ADD AL,[BX] ADC AH,0 INC BX

15

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

Top