一、实验目的
1. 掌握8086CPU、寄存器、内存(包括栈空间)的基础知识
2. 掌握汇编源程序组成与结构
3. 理解和掌握寄存器间接寻址方式[bx]
4. 掌握汇编指令mov, add, sub, jmp, push, pop,loop的用法,理解高级语言的表达和抽象机制
5. 熟练掌握使用debug工具编写和调试x86汇编命令的方法
6. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
二、实验结论
实验任务2:
上图为使用d命令查看生产日期的截图。
上图为使用e命令修改后查看,发现修改失败。
实验任务3:
上图为使用e命令修改内存单元后的情形,在屏幕左上角出现了5个图案。
上图为使用f命令批量填充内存单元后的情形,屏幕下方出现许多图案。
上图为查看该段内存内容,并尝试使用e命令对其进行修改,修改后发现屏幕下方的部分图案发生改变。
实验任务4:
填空:2E -> 2C -> 2A -> 28 -> 2A -> 2C -> 2E -> 30
问题1:逻辑地址:20:30
物理地址:00230H
问题2:
问题3:
此时数据空间内的数据没有变化。
问题4:
按照截图修改pop指令的顺序后,使用d命令查看发现顺序发生改变,原因是因为出栈的顺序为70 80 50 60 30 40 10 20
实验任务5:
问题1:使用t命令单步执行mov ss, ax时,并不是单步执行完这一条指令就暂停,而是紧接着执行下一条指令即mov sp, 30。
问题2:
从实验中发现截图中第一处黄线划的08 01为当前代码的偏移地址,第二处黄线划的是当前代码的段地址,执行完mov sp, 30后偏移地址为0108,最后执行完push ax后在0110 即 10 01 而在执行入栈操作后,栈顶指针向前移动2个字节,所以整体向前移动2个字节。
实验任务6:
源码:
1 assume cs:code 2 code segment 3 start: 4 mov cx, 10 5 mov dl, '0' 6 s: mov ah, 2 7 int 21h 8 add dl, 1 9 loop s 10 11 mov ah, 4ch 12 int 21h 13 code ends 14 end start
上为使用masm和link对程序进行汇编和链接过程的截图。
上为运行该程序后输出的结果。
上为在debug中查看task5.exe的程序段前缀PSP的截图,由图可见,程序前两个 字节是为CD 20。
实验任务7:
源码:
1 assume cs:code 2 code segment 3 mov ax, 076Ah 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, 200 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
上为使用u命令反汇编查看,发现复制成功。
三、实验总结
通过本次实验我学到了许多关于汇编语言的实践操作方面的知识,了解并实践了如何在Dosbox中运用在书本上学到的汇编语言程序设计的知识。我发现在使用e命令在显存部分修改值后,在屏幕上会显示相对应的图案,如果继续使用其他代码如d命令查看等,将输出在屏幕上的图案覆盖掉后,因为屏幕上的内容发生改变,所以显存中的数据也会随之发生改变,这就导致连续的两次d命令查看内存中的内容可能存在差异。