实验二 顺序程序设计
福建农林大学金山学院实验报告
系: 信息与机电工程 专业: 电子信息工程 年级: 2009 姓名: 庄建军 学号: 092230069 实验课程: 汇编语言 实验室号: 1#605 实验设备号: 实验时间: 指导教师签字: 成绩:
实验二 顺序程序设计
1.实验目的和要求
1. 学习使用DEBUG 的命令;
2. 使用DEBUG 命令在数据段中查看程序运行的结果; 3. 利用DEBUG 运行简单的程序段。 2.实验环境
实验的硬件环境是: IBM —PC 机及其兼容机 实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:DEBUG.COM ;文本编程程序:EDIT.EXE 、WPS.EXE ;宏汇编程序:MASM.EXE (或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE (可有可无)。 3.实验内容及实验数据记录
1)输入程序观察寄存器变化
使用DEBUG ,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU 中相关寄存器的内容变化。注意用T 命令执行时,CS: IP 寄存器的内容
MOV AX, 4E20 ADD
AX, 1416
MOV BX, 2000 ADD
AX, BX
MOV BX, AX ADD
AX, BX
MOV AX, 001A MOV BX, 0026
ADD ADD ADD
AL, BL AH, BL BH, AL
MOV AH, 0 ADD ADD
AL, BL AL, 9C
2)下列程序单步运行,注意AL ,BX ,CX 寄存器的变化,并观察数据段字母的变化。
DSEG SEGMENT MSG1 DB 'abc' DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX LEA
BX, MSG1
MOV CX, 3 MOV AL, [BX] AND
AL, 11011111B ;将AL 中的ASCII 码的第5位置0,
;变成大写字母。
S:
MOV [BX], AL INC
BX
LOOP S MOV AL, 0 MOV AH, 4CH INT
21H
CSEG ENDS
END
START
3)程序的跟踪执行操作
在DOS 下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。那么如何查看程序的运行结果呢?
程序执行过程的跟踪操作步骤如下: (1)在DOS 下输入:DEBUG 文件名.EXE (2)在DEBUG 提示符下输入U 命令
(3)可以用T 命令单步执行指令,执行到 MOV AH, 4CH 时结束,也可以用G 命令执行整个程序,输入:G=B地址(如:G=0000)
(4)用D 命令查看程序执行后数据段的变化 输入:D K地址:0 (如:D1260:0)
在显示的数据中,对照源程序或LST 文件查看结果所在的偏移地址的内容。 4)编写调试下面的程序,用DEBUG 查看数据段中的结果
(1)Z =((W -X ) *10+5) /(X +Y ) ,X ,Y ,W 为字节类型变量,结果存于Z 单元,写出数据段和代码段。(无符号数)
(2)X ,Y 为字节类型数,求Z =((X +Y ) *8-(X -Y ) *2) /16,写出完整的数据段和代码段,不用乘除指令。(无符号数) 4.算法描述及实验步骤
1)编译运行完成后,用t 命令执行,观察CS: IP寄存器的内容。 2)将小写字母改成大写字母:
思路:eg :A 的ASCII 码为41H ,用BCD 码表示为0100 0001;a 的ASCII 码为61H ,用BCD 码表示为0110 0001。要把小写a 改成大写A ,它们就第五位不一样,因此只要把0110 0001和1101 1111进行与(AND )运算即可。 将大写字母改成小写字母:
思路:eg :A 的ASCII 码为41H ,用BCD 码表示为0100 0001;a 的ASCII 码为61H ,用BCD 码表示为0110 0001。要把大写A 改成小写a ,它们就第五位不一样,因此只要把0100 0001和0010 0000进行或(OR )运算即可。
将大写字母改成小写字母的代码如下: DSEG MSG1
SEGMENT DB 'ABC'
DSEG CSEG
ENDS SEGMENT
ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG MOV DS, AX LEA BX, MSG1 MOV CX, 3 S: MOV AL, [BX]
OR AL, 00100000B ;将AL 中的ASCII 码的第5位置1,
; 变成小写字母。
MOV [BX], AL INC BX LOOP S MOV AL, 0 MOV AH, 4CH INT 21H CSEG ENDS
END START
4)编写以下程序:Z =((W -X ) *10+5) /(X +Y ) ,X ,Y ,W 为字节类型变量,结果存于Z 单元(无符号数)。
(1)分析问题:设W ,X ,Y 的值存放在字节变量W ,X ,Y 中,再定义一个字节变量T 来存放数据10,结果存放在字变量Z 中。
①初始化;②无符号数相减SUB ,两操作数位数需一致,题目中显示W 和 X 都为字节类型,由此可见二者位数已经一致了。因此把W-X 的值存于AL 中; ③无符号数乘法MUL (单操作数),被乘数在AL 中,将W-X 的值送入AL 后,执行MUL T,因为8bit*8bit,结果超过8位,结果应存于AX 中;④无符号数相加ADD ,AX+5;⑤无符号数相加ADD ,X+Y存入BL 中;⑥无符号数除法DIV (单操作数),被除数在AX 中,将(W-X)*10+5的值送入AX 后,执行DIV BL,商存于AL 中,余数存于AH 中;⑦把AL 和AH 的值送入Z 和Z+1。
(2)流程图:
(3)编写程序:
DATA SEGMENT X DB 40H Y DB 20H W DB 50H Z DW ? T DB 10 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX XOR AX,AX;AX置零 MOV AL,W
SUB AL,X;W-X→(AL) MUL T;(W-X)*10→(AX) ADD AX,5;(W-X)*10+5→(AX) MOV BL,X
ADD BL,Y;分母:X+Y→(BL)
DIV BL;((W-X)*10+5)/(X+Y)→(AX),商存AL, 余数存AH MOV Z,AL MOV Z+1,AH MOV AH,4CH INT 21H;返回DOS CODE ENDS END START
(4)程序运行结果见实验结果。
编写以下程序:X ,Y 为字节类型数,求Z =((X +Y ) *8-(X -Y ) *2) /16,不用乘除指令。
(1)分析问题:设X ,Y 的值存放在字节变量X ,Y 中,结果存放在字变量Z 中。 ①初始化;②无符号数相加ADD ,两操作数位数需一致,题目中显示X 为字节类型,由此可见二者位数已经一致了。因此把X+X的值存于AL 中;③无符号数乘法,运用算术左移来完成,此时要求乘以8,则需左移三位,由于移位指令的格式,因此需把所移动的位数(此时移动位数为3)放入CL 中,即“MOV CL,3”再运用“ SAL AL,CL ”来完成;④无符号数相减SUB ,X-Y 存入BL 中;⑤无符号数相乘,同③,运用“MOV CL,1”“SAL AL,CL”来完成;⑥无符号数除法,运用算术右移来完成,此时要求除以16,则需右移四位,由于移位指令的格式,因此需把所移动的位数(此时移动位数为4)放入CL 中,即“MOV CL,4”再运用“ SAR AL,CL”来完成;⑦把AL 的值送入Z 。 (2)流程图转下页: (3)编写程序: DATA SEGMENT X DB 38H Y DB 20H Z DB ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X ADD AL,Y MOV CL,3;
SAL AL,CL; 算术左移三位,即(X+Y)*8 MOV BL,X SUB BL,Y MOV CL,1
SAL BL,CL; 算术左移一位,即(X+Y)*2 SUB AL,BL;(X+Y)*8-(X-Y)*2→AL MOV CL,4
SAR AL,CL; 算术右移四位,即((X+Y)*8-(X-Y)*2)/16 MOV Z,AL;AL →Z INT 21H MOV AL,0 CODE ENDS
MOV AH,4CH END START (2
(45.调试过程
错误原因及改正:G 命令表达方式错误,应改为“-g 0015”。
错误原因及改正:不能识别“DL ”,在移位指令中,应用CL 来储存所移动的位数,即把“MOV DL,1”,“SAL BL,DL”改为“MOV CL,1”,“SAL BL,CL”。 6. 实验结果
1)逐条执行后,结果如下:
执行“ADD AX,1416”后,CS:IP=1397:0103;执行“MOV BX,2000”后,CS:IP=1397:0106;执行“ADD AX,BX”后,CS:IP=1397:0109;执行“MOV BX,AX”后,CS:IP=1397:010B;执行“ADD AX,BX”后,CS:IP=139B:010D;执行“MOV AX,001A ”后,CS:IP=139B:010F;执行“MOV BX,0026”后,CS:IP=139B:0112;执行“ADD AL,BL ”后,CS:IP=139B:0115;执行“ADD AH,BL ”后,CS:IP=139B:0117;执行“ADD BH,AL”后,CS:IP=139B:0119;执行“MOV AH,0”后,CS:IP=139B:011B;执行“ADD AL,BL”后,CS:IP=139B:011D;执行“MOV AH,0”后,CS:IP=139B:011F;执行“ADD AL,BL ”后,CS:IP=139B:0121;执行“ADD AL,9C”后,CS:IP=139B:0123。 具体执行结果如下图所示:
2)将小写字母改成大写字母,结果如下图所示:
将大写字母改成小写字母,结果如下图所示:
4)Z=((W-X)*10+5)/(X+Y)的运行结果:
(4)Z=((X+X)*8-(X-Y)*2)/16程序运行结果:
7. 总结
通过本次实验,让我对debug 中的指令有了更进一步的了解,并且学会通过-u 指令来查看机器的伪代码。从中加深了对算术运算指令、逻辑运算指令和移位指令的印象,熟悉其功能,例如,可以通过移位指令来实现算术运算中的乘、除 法指令。因此,掌握了它们的用法,才能融会贯通。
附录: