实验1 8086汇编指令编码和调试

2021/10/28 9:09:53

本文主要是介绍实验1 8086汇编指令编码和调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

实验结论

实验任务2

  • 使用d命令查看生产时期的截图如下:

          

   可以看到,生产日期位于内存单元 FFFF5H - FFFFCH 中。

  • 使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看,截图如下:

          

 

   图中第三行的e命令实现对生产日期所在内存单元的修改,第四行的d命令用于查看修改后对应的内存单元。

   可以看到,执行修改命令后,对应内存单元并没有改变,这是因为e命令修改的是ROM存储器的单元,而ROM存储器是无法被修改的。

 

实验任务3

  • 使用e命令向b800:0开始的内存单元填写数据,依次写入十六进制数据03 04,重复写5次,修改命令及效果截图如下:

         

   可以看到,DOS屏幕左上方显示出5个红色心形图案。

  • 使用f命令向把内存单元区间b800:0f00 ~ b800:0f9f连续160个字节,依次重复填充十六进制数据03 04,批量填充内存单元的命令及效果截图如下:

         

   可以看到,DOS屏幕底部显示出了一行红色心形图案。

  • 修改内存地址,用e命令修改相应内存单元,效果截图如下:

     

   此时,DOS屏幕未显示任何内容。

  • 修改内存单元b800:0开始填写的数据为04 05,重复写5次,重复前述操作,效果截图如下:

     

  此时,DOS屏幕左上方显示出5个紫色的菱形图案。

 

实验任务4

  • 填空
 1 -a
 2 mov ax, 20
 3 mov ds, ax
 4 mov ss, ax
 5 mov sp, 30
 6 push [0]      ;执行后,寄存器(sp) = 002EH
 7 push [2]      ;执行后,寄存器(sp) = 002CH
 8 push [4]      ;执行后,寄存器(sp) = 002AH
 9 push [6]      ;执行后,寄存器(sp) = 0028H
10 pop [6]       ;执行后,寄存器(sp) = 002AH
11 pop [4]       ;执行后,寄存器(sp) = 002CH
12 pop [2]       ;执行后,寄存器(sp) = 002EH
13 pop [0]       ;执行后,寄存器(sp) = 0030H
  • 问题解答

   1. 问:指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是?

     答:栈顶的逻辑地址是0020:0030H,物理地址是00230H。

   2. 问:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此 时栈空间数据,给出实验截图。

     答:相应的实验截图如下:

                   

     3. 问:汇编指令 pop [0] 执行结束后,使用d命令 d 20:0 7 查看此 时数据空间内的数据是否有变化。给出实验截图。

    答:查看对应的数据空间,查看结果截图如下:

        

        pop[0]指令执行结束后,对应数据空间与最初写入的数据对比起来,没有发生变化。

    4. 问:如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时 数据空间内的数据是否有变化。

     答:查看对应的数据空间,存储的数据如下图:

      

      可以看到,这一次pop[6]指令执行结束后,对应数据空间的数据发生了变化,此次执行的汇编指令实现了对四个字中的数据在对应数据空间内的逆序存放。

 

实验任务5

  • 问题解答

   1. 问:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

    答:单步执行完mov ss, ax指令没有暂停,执行完mov ss, ax后还连续执行了mov sp, 30 指令。

   2. 问:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通 过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特 别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

    答:第一条黄色下划线对应的数值01 08对应IP寄存器中的偏移地址,第二条黄色下划线对应的数值07 3F对应于CS寄存器代码段地址。之所以在栈空间中会出现这两个地址,是因为debug单步调试是一种中断,发生中断时需要把代码段地址及执行指令的偏移地址压入栈空间,保存程序的入口。

 

实验任务6

  • 程序源码
 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     mov cx, 10
 6     mov dl, '0'
 7 s:  mov ah, 2
 8     int 21h
 9     add dl, 1
10     loop s
11     
12     mov ah, 4ch
13     int 21h    
14 code ends
15 end start
  • 使用masm, link对程序汇编链接的过程截图如下:

    

  • 运行可执行程序task5.exe的运行结果截图如下:

     

  • 在debug中查看task5.exe的程序段前缀PSP的截图如下:

     

   由此验证了前两个字节是CD 20。

 

实验任务7

  • 补全后的程序如下:
 1 assume cs:code
 2 code segment
 3     mov ax, cs    ;第一空填cs
 4     mov ds, ax
 5     mov ax, 0020h
 6     mov es, ax
 7     mov bx, 0
 8     mov cx, 0017h  ;第二空填0017h
 9 s:  mov al, [bx]
10     mov es:[bx], al
11     inc bx
12     loop s
13 
14     mov ax, 4c00h
15     int 21h
16 code ends
17 end

  填写依据:

  第一空:程序复制自身需要找到自身的存储的地址,我们可以把程序的段地址存放到数据段寄存器ds中,方便后续对自身的复制,所以第一空填 cs;

  第二空:由于在复制过程中,程序是逐个字节复制自身的,因此循环执行的次数应该等于程序的长度,即0017H。

  • 在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命 令对0:200开始的内存单元反汇编。给出使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图如下:

    

   从图中可以看出,该汇编程序确实把task7.asm中line3-line12的代码复制到了目标内存空间。

 



这篇关于实验1 8086汇编指令编码和调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程