- 实验目的和要求
(1) 编写实验任务要求的两个程序。
(2) 写出调试以上程序,即修改程序参数,检查结果的操作方法。
(3) 熟悉源程序汇编、连接命令的使用方法即要回答的内容。
- 实验环境
DOSBOX
- 实验内容与过程
验证以下程序
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
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)用EDIT或其它编辑软件,编写.ASM源程序,
2)对其进行汇编及连接,产生.EXE文件。
3)对.EXE文件进行调试运行。
a.用DEBUG调试运行。
b.键入不同的字符,分别进行调试。
c.在MS-DOS下运行这两个.EXE文件。
1.自编程序:修改实验准备程序(二),使除了以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。
编译程序的过程:
程序运行后的结果:
分析:
该汇编程序的功能是将堆栈段中从0开始的十六进制数字转换为十进制数字并输出,每个数字之间用一个空格分隔开。其中,每个十六进制数字占一字节,所以总共会输出16个数字。
程序执行时,首先将数据段的地址移到AX寄存器中,再将其赋值给DS寄存器,以便于访问数据段中的变量。然后将SI寄存器置为0,BL寄存器置为10H,即16,用于循环计数。接下来进入循环LOP中,在循环中首先读取SI指向的堆栈段中的数据,并右移四位,将其高四位相应转换为十进制数字并输出。然后再按位与0FH,得到其低四位,同样转换为十进制数字并输出。如果高四位或低四位在转换后大于9,就加上7H(即十进制7),再输出。每输出一个数字后,都会输出一个空格符。最后将SI指针自加,BL计数器自减,如果计数器不为0,则继续循环。当计数器减为0时,表示所有数据都已转换输出,程序跳转到结束部分,并通过21H中断调用DOS功能,退出程序。
可以看到运行结果中输出了十六进制的字符并在其右边输出了对应的ASCII字符。因为是在dos下执行,数据段地址与debug下不同,所以输出的数据不同,但通过查ASCII表,确定其对应字符正确。
2. BUFX、BUFY和BUFZ是3个有符号的十六进制数,编写一个比较相等关系的程序:
1)如果这3个数都不相等,则显示0
2)如果这3个数中有两个数相等,则显示1
3)如果这3个数都相等,则显示2
编译程序的过程:
程序运行的结果:
分析:
该汇编程序的功能是输入三个字符,比较它们的ASCII码值大小,并输出它们的大小关系。具体来说,程序将输入的三个字符分别存储在寄存器bh、bl和dh中,然后通过比较它们的值大小,将结果存储在寄存器dl中,最后输出寄存器dl的值。
程序的运行结果取决于输入的三个字符的值。如果它们的值满足bh≤bl≤dh,则程序输出字符'0'(ASCII码为30h);否则,程序输出字符'1'(ASCII码为31h)。如果输入的字符有重复,则程序会在比较时自动跳过相同的字符。如果输出的结果小于字符'0'(ASCII码为30h),则程序会自动将其替换为字符'2'(ASCII码为32h)。
流程图:
- 实验心得
在这次实验中,我学习了条件转移指令在汇编语言中的应用。条件转移指令是一种非常重要的指令类型,在程序执行过程中可以根据条件判断选择不同的执行路径,从而实现灵活的程序控制和逻辑判断。
在实验中,我首先了解了条件转移指令中不同的条件码,包括零标志位、进位标志位、符号标志位等等。并学习了如何通过CMP指令进行比较操作,以及如何根据比较结果使用条件转移指令跳转到不同的代码块执行。
通过实验,我深入了解了如何使用条件转移指令进行逻辑判断和程序控制,并且通过编写实际的汇编代码进行练习,加深了对汇编语言的理解和运用能力。此外,在实验过程中我还发现了一些注意事项,如在使用条件转移指令时需要注意空间限制等问题,这些都让我对汇编语言的应用更加熟练和自信。
总之,这次实验让我深入理解了条件转移指令在汇编语言中的应用,并且通过实际编写代码进行了练习,受益匪浅。在今后的学习和工作中,我将继续深入学习汇编语言的相关知识,不断提高自己的能力和水平。