实验3 多个段的汇编程序编写与调试
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
- chapter 6 包含多个段的程序
- chapter 7 更灵活的定位内存地址的方法
- chapter 8 数据处理的两个基本问题
三、实验内容
(省略,见“四、实验步骤与结论”)
四、实验步骤与结论
实验任务1
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。
①通过edit命令进入编辑,写入代码。


②通过masm、link对程序汇编和链接,并查看文件的生成情况。


③使用debug工具进行调试
通过r命令查看,然后精确反汇编

执行到程序返回前,观察结果:

④修改line4里5个字节单元的值,重新汇编、链接、运行、观察结果。


基于观察,分析、猜测这里的数值的作用是改变输出颜色。
最后,该程序首先定义了数据段data,并将其地址通过寄存器ax传递给ds;然后是通过循环将小写字母变成大写字母。
实验任务2
已知数据段data中定义字节数据如下:
data segments db 23, 50, 66, 71, 35 data ends
①通过edit编辑




②masm汇编、link链接,查看文件生成情况。

③观察结果

成功。
实验任务3
①通过edit命令进入编辑



②使用masm、link命令进行汇编和链接操作并查看文件生成情况。

③使用debug加载、跟踪


据此可以得到程序返回前的cs、ss以及ds值。
④回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
- CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
- 程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1
实验任务4
将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
①通过edit命令进入编辑


②使用masm、link命令进行汇编和链接操作并查看文件生成情况。


③使用debug加载、跟踪
查看信息并进行精确反汇编

调试到程序退出前,并查看信息

④回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H
- CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
- 设程序加载后,code段的段地址为X ,则data段的段地址为:X-2 ,stack段的段地址为:X-1
-
对于如下定义的段:
name segment ...... name ends如果段中的数据占N个字节则程序加载后,该段实际占有的空间为: (N/16+1)*16。
实验任务5
将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
①通过edit命令进入编辑

②使用masm、link命令进行汇编和链接操作并查看文件生成情况。


③使用debug加载、跟踪
使用r命令查看信息、进行精确反汇编

调试到程序退出前,并查看程序运行结果

④回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123h, 0456h
- CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D
- 程序加载后,code段的段地址为X,则data段的段地址为:X+3 ,stack段的段地址为:X+4
实验任务6
如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答:task5.exe仍然可以正确执行,因为其代码段放在了最前面,而没有指明程序入口时,CPU将前两个实验的先存放的数据当成指令读入,这也导致在实验任务6中对其没有影响。
实验任务7
在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节 (3) 根据①和②的调试,验证是否正确的实现数据相加
①通过edit命令进入编辑
补全代码:
mov bx,0
mov cx,8
mov ax,a
mov ds,ax
mov ax,c
mov es,ax
s: mov dx,0
mov ax,a
mov ds,ax
add dl, [bx]
mov ax,b
mov ds,ax
add dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h

②使用masm、link命令进行汇编和链接操作并查看文件生成情况。

③使用debug加载、跟踪
查看并精确反汇编

调试到程序退出前,查看运行结果

程序正确相加。
实验任务8
编写code段中的代码,用push指令将a段中的8个字型数据,逆序存储到b段中
①通过edit命令进入编辑
补全代码:
mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov cx,8 mov bx,0 s: push [bx] add bx,2 loop s mov ax,4c00h int ax,21h

②使用masm、link命令进行汇编和链接操作并查看文件生成情况。


③使用debug加载、跟踪
查看信息进行反汇编,为调试做基础。

调试到程序退出前,并查看是否正确逆序存储数据:

确实成功逆序存储了。
五、实验总结
经过这次实验发现我对于多段汇编程序还不够理解和熟悉,之后还需继续学习。

浙公网安备 33010602011771号