汇编语言程序设计实验报告

一、实验一

1、实验内容

(1)用Debug命令查看寄存器和内存中的内容

(2)上机过程及程序调试

2、实验目的

(1)要求掌握使用Debug命令查看寄存器和内存的方法;

(2)通过实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用;

(3)掌握汇编语言程序从设计到形成可执行文件的方法和步骤,即编辑、汇编、连接。了解汇编语言的系统工作文件和工作环境。理解汇编程序和连接程序的作用。理解列表文件内容。

(4)初步了解程序的运行和调试方法。学会使用Debug主要命令和常用的DOS指令。

3、实验步骤

(1)进入DOS方式并运行Debug程序;

(2)用R命令查看、改变CPU 寄存器的内容;

(3)用Debug的D和E命令查看和改写内存中的内容;

(4)用Debug对HELLO程序进行调试;

4、实验结果与分析

(1)用R命令查看、改变CPU寄存器的内容:    

        查看CS=13A1, IP=0100,即内存13A1:0100处的指令为CPU当前要读取、执行的指令。CS:IP 指向13A1:0100,此处存放的机器码为027548,对应的汇编指令为ADD DH, [DI+48]。右下角的指令“DS: 0048=00”表示在“ADD DH, [DI+48]”中需要用到的存储单元“DS:0048”的值为“00”。

        将IP的值改为0200,CS:IP指向13A1:0200,此处存放的机器码为5B,对应汇编指令为“POP BX”;将CS的值改为FF00,CS:IP指向FF00:0200,此处存放的机器码为51,对应汇编指令为“PUSH CX”。

(2)用Debug的D命令查看内存中的内容:

        最左侧是每行的起始地址以逻辑地址的形式给出;中间的内存1000:0单元中的内容是72H,内存1000:1单元中的内容是64H,内存1000:0~1000:F中的内存都在第一行; 内存1000:10中的内容是EBH,内存1000:11处的内容是F0H,内存1000:10~1000:1F中的内容都在第二行;右边的内存单元1000:0、1000:1、1000:2中存放的数据是72H、64H、73H,对应的ASCI字符分别是“r”、“d”、“s";内存单元1000:07中的数据是3AH,它没有对应可显示的ASCII字符,Debug 就用“.”来代替。

(3)用Debug的E命令改写内存中的内容:

        用E命令从内存1000:0逐个写入构成‘hello world!’的字符,再用D命令查看1000:0~1000:F单元的内容:“hello world!”。

(4)用Debug对HELLO程序进行调试:

        ① masm hello.asm;            ② link hello;            ③ hello.exe

        输出:hello world!

二、实验二

1、实验内容

(1)不同寻址方式的灵活运用

(2)算术及位串处理程序

2、实验目的

(1)熟悉和掌握7种不同的操作数寻址方式的使用方法;

(2)掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用Debug。

3、实验步骤

(1)对指定内存单元的数据进行不同寻址方式的询问;

(2)在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示;

(3)用16位指令编制程序,处理32位的加减乘除四则运算题;

(4)用字符串处理指令编制程序,处理字符串的比较和查找,显示结果;

(5)AL字节内容反向排序。

4、实验结果与分析

(1)两个操作数相减运算,结果放在数据段偏移地址为0016H的单元:

(2)两个操作数相加运算,结果放在附加段的0020H的单元:

(3)在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示:

三、实验三

1、实验内容

(1)伪指令

(2)分支程序设计

2、实验目的

(1)掌握常用伪指令的使用方法,熟悉定义数据、定义程序模式、分配存储区等功能,实践课程中的实例;

(2)掌握分支程序的基本编程方法。熟悉数制转换。用LOOP指令、条件转移指令和向量地址法实现程序转移。

3、实验步骤

(1)用16位指令编写完整程序,实现数据定义语句和相关指令,在Debug下查看内存数据的定义情况,单步跟踪查看各寄存器的值;

(2)用16位指令编写完整程序,并上机调试,计算W=(X+Y)×Z,其中所有变量均为16位带符号变量;

(3)编写程序,如果输入的是大写字母,则输出对应的小写字母,反之亦然;如果输入的是数字,原样输出;按回车结束;

(4)分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。

(5)在数据段定义分支地址表,通过键盘输入数字1~8,实现转移,要求如下:

        ① 分支表定义为:PTABLE   DW  P1, P2, P3, P4, P5, P6, P7, P8

        ② P1~P8为标号,如果键入数字3,则从PTABLE中取出P3的地址,实现间接转移

4、实验结果与分析

(1)单步跟踪查看各寄存器的值:

AX=076A  BX=0000  CX=014F  DX=0000;     AX=076A  BX=0000  CX=014F  DX=076A;
AX=07FF  BX=0000  CX=014F  DX=076A;     AX=0700  BX=0000  CX=014F  DX=076A;
AX=000C  BX=0000  CX=014F  DX=076A;     AX=000C  BX=0009  CX=014F  DX=076A;
AX=0002  BX=0009  CX=014F  DX=076A;     AX=0002  BX=0001  CX=014F  DX=076A;
AX=0002  BX=0102  CX=014F  DX=076A;     AX=0002  BX=0102  CX=0004  DX=076A;
AX=0002  BX=0102  CX=0004  DX=0004;     AX=0002  BX=0009  CX=0004  DX=0004;
AX=0002  BX=00FF  CX=0004  DX=0004

(2)字母大小写反转,数字原样输出:

判断输入的数据类型:

        ① 大写字母:加上20H转成小写字母[ADD AL,20H]再输出数据;

        ② 小写字母:减去20H转成大写字母[SUB AL,20H]再输出数据;

        ③ 数字类型:直接输出数据;

        ④ 回车:直接退出程序。

四、实验四

1、实验内容

(1)循环程序设计

(2)子程序设计和多模块程序设计

2、实验目的

(1)掌握循环程序的基本编程方法。提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互;

(2)掌握通用子程序的设计方法,学会子程序的功能划分和正确进行子程序的参数传递;

(3)熟悉使用结构变量,掌握多模块程序设计方法,正确使用PUBLIC,EXTRN实现参数传递;

3、实验步骤

(1)键入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序;

(2)键入7位二进制数,显示对应的字符,回车键退出循环,终止程序;

(3)键入一个四位的十六进制数(其中字母为大写),并将其转换为二进制数显示输出;

(4)采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序;

(5)键入一个十六进制数(不超过四位),显示输出该数的十进制形式;

(6)键入一个十进制数(小于65536的正数),显示输出该数的十六进制形式;

(7)设计一个简单计算器程序,实现整数的加减乘除运算;

(8)学生成绩表由姓名、A成绩、B成绩、合计总分四项组成,其中合计总分=A成绩+B成绩,键入6个人的成绩记录后,输出学生成绩表,要求成绩表用结构类型;输入、计算、输出分为3个子程序;成绩为百分制无符号数;合计总分由程序计算;

        ① 成绩键入后转为压缩BCD码格式存放;

        ② 成绩键入后转为二进制数格式存放;

4、实验结果与分析

(1)显示字符的十六进制ASCII码:

        实现了从键盘输入一个单个字符(判断字符[CMP AL,13]),就可以以十六进制的形式显示该字符的ASCI码。如输入1,显示31,输入A,显示41。

(2)显示7位二进制数对应的字符:

        实现了从键盘输人7位二进制数(二进制只有0和1,所以判断输入的数字是否是0或1即可),显示对应的字符。

(3)显示四位十六进制数对应的二进制数:

        实现了从键盘输入一个四位的十六进制数,可以将其转换为二进制数并且显示输出。

(4)简单计算器程序:

        ① 从键盘输人算式,只接受不超过4位的十进制正整数。运算结果为不超过65535的整数

        ② 不接受复合算式,如3+5x6。

        ③ 计算器使用运算符‘+-×÷’、回车键和‘=’键、清除键‘C’。回车键或‘=’键给出计算结果,清除键‘C’为清0。按清除键后,可接受下一算式。

        ④ 程序分算式输人模块、计算模块、输出显示模块。输入模块和计算模块在同一程序文件中,输出显示模块为另一程序文件。

下面是一个简单的8086汇编程序,可以从键盘输入一个四位的十六进制数,将其转换为十进制数并输出到屏幕上。 ``` .MODEL SMALL .STACK 100H .DATA HEX DB 4 DUP('$') ; 存储输入的十六进制数 DEC DW 0 ; 存储十进制数 MSG DB 'Enter a 4-digit hexadecimal number: $' .CODE MAIN PROC MOV AX, @DATA ; 初始化数据段寄存器 MOV DS, AX LEA DX, MSG ; 输出提示信息 MOV AH, 09H INT 21H MOV CX, 4 ; 循环四次 LEA SI, HEX ; 存储输入的十六进制数 MOV AH, 01H @@: INT 21H ; 从键盘读取一个字符 CMP AL, '0' JB @F ; 不是数字字符,跳过 CMP AL, '9' JA @F SUB AL, '0' ; 数字字符转换为数字值 JMP @G @@: CMP AL, 'A' JB @F ; 不是大字母字符,跳过 CMP AL, 'F' JA @F SUB AL, 'A' ADD AL, 10 ; 大字母字符转换为数字值 JMP @G @@: CMP AL, 'a' JB @F ; 不是小字母字符,跳过 CMP AL, 'f' JA @F SUB AL, 'a' ADD AL, 10 ; 小字母字符转换为数字值 @@: MOV [SI], AL ; 存储十六进制数 INC SI LOOP @B ; 转换为十进制数 MOV AX, 0 ; AX存储十进制数 MOV BX, 1 ; BX存储位权值 LEA SI, HEX ; SI指向存储输入的十六进制数的数组 MOV CX, 4 ; 循环四次 @@: DEC SI MOV AL, [SI] ; 取出一个十六进制位的值 MOV DX, 0 MOV BL, 1 ; BL存储乘数 @@: MUL BL ; AX = AL * BL INC BL ; BL = BL + 1 LOOP @B ADD AX, DX ; AX = AX + DX MOV DX, BX ; DX存储下一个位权值 MUL DX ; AX = AX * DX ADD BX, BX ; BX = BX * 2 LOOP @B ; 输出十进制数 MOV DEC, AX MOV AH, 09H LEA DX, DECMSG INT 21H MOV AH, 4CH ; 退出程序 INT 21H MAIN ENDP DECMSG DB 13, 10, 'The decimal number is: $' END MAIN ``` 这个程序首先输出提示信息,然后从键盘读取一个四位的十六进制数,将其存储在一个数组中。接下来,它将数组中的十六进制数转换为十进制数,并将其存储在一个变量中。最后,它输出十进制数到屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有为肥宅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值