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

2021/10/26 17:12:12

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

实验任务1

 

实验任务2

(1)使用d命令查看生产日期,已知生产日期在内存FFF00H~FFFFFH的某几个单元中,使用命令d FFF0:0 FF查看对应的内存空间,可以看到有一串字符串为01/01/92,应为生产日期,如下图所示。

(2) 使用e命令修改相应的生产日期,尝试将日期改为1999年10月1日,命令为e FFF0:F5 30 31 2F 31 30 2F 39 32,再使用d命令进行查看,发现修改失败,如下图所示。

 (3)修改失败的原因:由于8086CPU的ROM的内存地址空间为00000F~9FFFFH,题目所给的内存空间包含在其中,而ROM为只读存储器,故无法修改。

 

实验任务3

(1)在debug中使用e命令修改内存单元,命令为e b800:0 03 04 03 04 03 04 03 04 03 04,效果如下图所示。

 (2)在debug中使用f命令批量填充内存单元,命令为f b800:0f00 0f9f 03 04,效果如下图所示。

 (3)前两条命令修改的内存单元都在显存地址空间,所以在屏幕的相关位置会有内容显示,再次修改内存单元,使用命令e b800:0 f9 03 04,效果如下图所示。

 

实验任务4

(1)填空

 1 -a
 2 mov ax, 20
 3 mov ds, ax
 4 mov ss, ax
 5 mov sp, 30
 6 push [0] ; 执行后,寄存器(sp) = _2E_
 7 push [2] ; 执行后,寄存器(sp) = _2C_
 8 push [4] ; 执行后,寄存器(sp) = _2A_
 9 push [6] ; 执行后,寄存器(sp) = _28_
10 pop [6] ; 执行后,寄存器(sp) = _2A_
11 pop [4] ; 执行后,寄存器(sp) = _2C_
12 pop [2] ; 执行后,寄存器(sp) = _2E_
13 pop [0] ; 执行后,寄存器(sp) = _30_

(2)回答问题

问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是?

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

 

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

答:如图所示。

 

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

答:数据没有变化,如图所示。

 

 

 

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

 答:数据有变化,字的顺序发生了颠倒,如图所示。

 

实验任务5

执行结果如图所示。

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

答:单步执行完mov ss, ax后,mov sp, 30立刻被执行了,从截图中可以看出在mov ss, ax执行后SP已经变成了30,同时紧接着执行的下一条指令变成了mov ax, 2010。这是因为要确保段寄存器SS和栈指针的修改不被破坏。

 

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

答:

前者因为每一次执行t命令指令所指向的地址都会变化,073F及后面的偏移地址所表示的地址就是当前指令所在的地址。

后者随着程序执行,数据入栈,原先在栈中的数据跟着往前移。

 

实验任务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的截图,如图所示。

 

实验任务7

  • 源程序

 1 assume cs:code
 2     code segment
 3     mov ax, cs
 4     mov ds, ax
 5     mov ax, 0020h
 6     mov es, ax
 7     mov bx, 0
 8     mov cx, 17h
 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

  原因:这里要进行的是程序的复制,当前程序的程序段是存储在CS中,我们要将其复制到ds中作为数据段,故将cs通过ax间接赋值给ds,第一空填cs。

  因为mov指令在寄存器间赋值时占用2个字节的空间,直接数给寄存器赋值时占用3个字节的空间,其余的指令都占用2个字节的空间,故相加可得2+2+3+2+3+3+2+2+2+2=23=17H,第二空填17h。

 

  • 在debug中调试,使用g命令将程序执行到loop s之后、mov ax, 4c00h 之前,然后,使用u命令对0:200开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间,如图所示。

 

实验总结

(1)使用debug调试时,不能修改前面的指令,导致输错了一个地方只能重来,在实验任务五的书写上浪费了一定的时间。

(2)在实模式下,可以通过程序对内存直接进行操作,虽然方便但没有进行保护,相对的并不安全。

(3)在实模式下,对内存直接进行操作,通过改写显存地址空间里的内容,感受最为直观。

 



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


扫一扫关注最新编程教程