实验1 8086汇编指令编码和调试
实验结论
1.实验任务2

分析:
- 使用d命令查看生产日期,可以发现查阅到的信息为1992.01.01。
- 使用e命令可以对制定内存处进行修改,这里将日期信息更改为2021.10.22。
- 可以发现日期信息并没有修改,本质上是因为ROM为只读存储器,向ROM中写入数据的操作是无效的。
2.实验任务3
(1)使用e命令向内存单元填写数据:

(2)使用f命令向内存单元批量填写数据:

(3)修改了2000:0~2000:9的内存单元,结果如下:

3.任务实验4
(1)写入如下汇编指令:

分析:
- 用e指令将00200H~00207H的内存分别置为10,20,30,...,80。
- 将20作为数据段段地址。
- 将20和30存入栈段寄存器ss和sp中,当前栈顶指针位于20:30处。
- 分别将数据10,30,50,70入栈,栈顶指针执行了4次"sp-2",当前栈顶指针应该位于20:28。
- 分别将数据70,50,30,10出栈,栈顶指针执行了4次"sp+2",当前栈顶指针又回到20:30。
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)使用t命令逐步执行每行命令,

要求:push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令 d 20:20 2f 查看此时栈空间的
数据。
可以发现数据10,30,50,70被放于正确的位置,且sp位于28,与估计的一致。
(3)

要求:pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。
可以发现数据空间内的数据没有变化,sp回到了30,与估计一致。
(4)

如果更改最后四条指令的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时
数据空间内的数据是否有变化。
可以发现数据发生了改变,为什么会这样呢?因为出栈的数依次为70,50,30,10,而替换到的位置上的数为10 30 50 70。
4.任务实验5
(1)实践一下内容:

要求:先使用f命令,把00220H ~ 0022fH区间的16个字节内存单元值全部修改为0。并使用d命令查看确认。
然后,使用a命令、r命令、t命令写入汇编指令并单步调试。
(2)问题:
问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov
sp, 30 是什么时候执行的?
mov ss,ax和mov sp,30是连续执行的。由于dubug单步调试就是一种中断,而CPU在执行期间不响应中断请求,因此debug显示的是CPU执行完栈段和栈顶指针分配后的情况。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通
过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特
别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
"073F:0108“对应的是"CS:IP",前者为指令的段地址,后者为指令的偏移地址。由于存在中断请求,因此需要保存原程序的入口。
5.任务实验6
(1)编写8086汇编程序源码:
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
(2)使用masm、link对程序汇编链接:

(3)运行结果如下所示:

(4)查看程序段前缀:

要求:在debug中,使用d命令,查看task6.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是
否是CD 20。
检验结果表明前两个字节为CD 20。
6.任务实验7
(1)补充完整的8086汇编程序源码部分:
分析:
1.空一:cs为代码段的基地址,赋给ds作为复制段的基地址。
2.空二:cx用于控制循环次数,由于总的代码段为001CH字节,而move ax,4c00H和int 21h占用了5h字节,所以line3~line12代码段为0017字节。
(2)代码复制:

要求:在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令
对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。
可以发现,实现了task7.asm中line3~line12的代码复制。
浙公网安备 33010602011771号