实验3 多个段的汇编源程序编写与调试

一、实验目的
1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
chapter 6 包含多个段的程序
chapter 7 更灵活的定位内存地址的方法
chapter 8 数据处理的两个基本问题
三、实验内容
1. 实验任务1
使用任意文本编辑器,录入汇编源程序task1.asm(程序源码见task1.asm)。
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
1)使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。
2)使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。
3)修改line4里5个字节单元的值(db 5 dup(2) 改成:db 2,3,4,5,6 ),重新汇编、链接、运行,观察结果。
4)基于观察,分析、猜测这里的数值作用是什么。 
2. 实验任务2
已知数据段data中定义字节数据如下:
data segments
db 23, 50, 66, 71, 35
data ends 
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。 
3. 实验任务3
教材「实验5 编写、调试具有多个段的程序」
程序源码见task3.asm。
4. 实验任务4
教材「实验5 编写、调试具有多个段的程序」
程序源码见task4.asm。
5. 实验任务5
教材「实验5 编写、调试具有多个段的程序」
程序源码见task5.asm。
6. 实验任务6
教材「实验5 编写、调试具有多个段的程序」
7. 实验任务7
教材「实验5 编写、调试具有多个段的程序」
程序源码见task7.asm。
8. 实验任务8
教材「实验5 编写、调试具有多个段的程序」
程序源码见task8.asm。
四、实验结论 
1. 实验任务1 
 
task1.asm:
 
masm汇编:
link链接:
使用debug工具进行调试:
 
修改后的task1:
masm汇编&link链接:
使用debug工具调试:
 

说明:

1)line15-25,循环实现的功能是什么?逐行理解每条指令的功能

答:循环实现的功能是将“nuist”大写后的ASCII值,依次存放在对应的显存区。

line 15:设置循环次数(5);

line 16:将0送至si;

line 17:设置起始内存单元地址;

line 18:将数据段的第si个字节送入al;

line 19:获取对应大写字母的ASCII值;

line 20:将其送入对应的显示缓冲区,用来控制输出字符;

line 21:将数据段的第si+5个字节送入al,该字节是控制字符的颜色属性

line 22:将控制字符颜色属性的值传入显示缓冲区

line 23:在下次循环中选择下一个字符;

line 24:控制下次送入显示缓存区的位置

line 25:循环

2)基于观察,分析,猜测这里数值的作用是什么?

答:控制字符的颜色属性。

3)分析源代码中data段line4字节数据的用途是什么?

答:控制ASCII的字符属性。

2.实验任务2

task2.asm:

运行结果如下图所示:

3.实验任务3

task3.asm:

说明:

1)CPU执行程序,程序返回前,data段的数据为多少?

答:在使用t命令调试前,查看data中的数据,如下图所示:

程序返回前,查看data中的数据,如下图所示:

由此可以看出data段中的数据为0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H且保持不变。

2)CPU执行程序,程序返回前,cs=?,ss=?,ds=?

由上图可以看出,cs=076CH,ss=076BH,ds=076AH

3)设程序加载后,code段的段地址为X,则data段的段地址为多少?stack段的段地址为多少?

答:data段的段地址为x-2,stack段的段地址为x-1。

4.实验任务4

task4.asm:

说明:

1)CPU执行程序,程序返回前,data段的数据为多少?

答:在使用t命令调试前,查看data中的数据,如下图所示:

程序返回前,查看data中的数据,如下图所示:

由此可以看出data段中的数据为0123H,0456H且保持不变。

2)CPU执行程序,程序返回前,cs=?,ss=?,ds=?

由上图可以看出,cs=076CH,ss=076BH,ds=076AH

3)设程序加载后,code段的段地址为X,则data段的段地址为多少?stack段的段地址为多少?

答:data段的段地址为x-2,stack段的段地址为x-1。

4)如果将(1),(2),(3)题中的最后一条伪指令“end start”改为“end”,则哪个程序仍然可以正确执行?请说明原因。

答:(3)程序仍然可以正确执行;

原因:(1),(2)两个程序是以数据段开头,故不能直接执行指令,而(3)程序是以汇编指令段开头,故当最后一条伪指令“end start”改为“end”时,只有(3)程序仍然可以正确执行。

5.实验任务5

task5.asm:

说明:

1)CPU执行程序,程序返回前,data段的数据为多少?

答:在使用t命令调试前,查看data中的数据,如下图所示:

程序返回前,查看data中的数据,如下图所示:

由此可以看出data段中的数据为0123H,0456H且保持不变。

2)CPU执行程序,程序返回前,cs=?,ss=?,ds=?

由上图可以看出,cs=076AH,ss=076EH,ds=076DH

3)设程序加载后,code段的段地址为X,则data段的段地址为多少?stack段的段地址为多少?

答:data段的段地址为x+3,stack段的段地址为x+4。

6.实验任务6

如果将(1),(2),(3)题中的最后一条伪指令“end start”改为“end”,则哪个程序仍然可以正确执行?请说明原因。

答:(3)程序仍然可以正确执行;

原因:(1),(2)两个程序是以数据段开头,故不能直接执行指令,而(3)程序是以汇编指令段开头,故当最后一条伪指令“end start”改为“end”时,只有(3)程序仍然可以正确执行。

7.实验任务7

task7.asm

 

masm汇编&link链接:

使用debug命令进行调试:

查看逻辑段c的数据的截图:

8.实验任务8

task8.asm:

masm汇编&link链接:

使用debug命令进行调试:

查看逻辑段c的数据的截图:

五、实验总结

(1)task1.exe执行结果缺少'N',这一点不是很理解原因。

(2)巩固了不同方式访问内存地址的应用。

(3)加深了对ASCLL应用的理解和运用。

posted @ 2020-11-22 19:10  LS8029  阅读(185)  评论(3)    收藏  举报