实验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值。

 

④回答问题

  1. CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
  2. CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
  3. 程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1

 

实验任务4


将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

①通过edit命令进入编辑

 

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

 

 

③使用debug加载、跟踪

查看信息并进行精确反汇编

 

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

 

④回答问题

  1. CPU执行程序,程序返回前,data段中的数据为:0123H,  0456H
  2. CPU执行程序,程序返回前,cs=076C  ,ss=076B  ,ds=076A 
  3. 设程序加载后,code段的段地址为X ,则data段的段地址为:X-2 ,stack段的段地址为:X-1
  4. 对于如下定义的段:

    name segment
    
    ......
    
    name ends

    如果段中的数据占N个字节则程序加载后,该段实际占有的空间为: (N/16+1)*16。

 

实验任务5


 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

①通过edit命令进入编辑

 

 

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

 

 

③使用debug加载、跟踪

使用r命令查看信息、进行精确反汇编

 

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

 

④回答问题

  1. CPU执行程序,程序返回前,data段中的数据为:0123h,  0456h
  2. CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D
  3. 程序加载后,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加载、跟踪

查看信息进行反汇编,为调试做基础。

 

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

 

确实成功逆序存储了。

五、实验总结

经过这次实验发现我对于多段汇编程序还不够理解和熟悉,之后还需继续学习。

 

posted @ 2020-11-21 18:48  Liu_Wei  阅读(180)  评论(2)    收藏  举报