8086汇编指令编码和调试
实验任务2
-
在debug中,使用D命令加上起始地址进行生产日期的查找,实验截图如下:
-
然后用E命令对生产时期所在的内存单元内容进行修改,修改后再用D命令进行查看
实验结论
最终并不能修改生产时期所在的内存单元,其值仍为最初值不变,这是由于日期所在内存单元的存储权限为只读,故不能进行修改。
实验任务3
-
在debug中,使用e命令,从b800:0开始的内存单元开始,依次写入十六进制数据04 03,重复写5次,实验代码及效果截图如下:
-
使用f命令,向内存单元区间b800:0f00 ~ b800:0f9f的连续160个字节依次重复填充十六进制数据03 04,实验代码及效果截图如下:
-
其他关于修改内存地址或数据的尝试代码及截图如下:
实验任务4
-
在debug中按顺序录入代码,内容如下图:
-
填空
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = 2e
push [2] ; 执行后,寄存器(sp) = 2c
push [4] ; 执行后,寄存器(sp) = 2a
push [6] ; 执行后,寄存器(sp) = 28
pop [6] ; 执行后,寄存器(sp) = 2a
pop [4] ; 执行后,寄存器(sp) = 2c
pop [2] ; 执行后,寄存器(sp) = 2e
pop [0] ; 执行后,寄存器(sp) = 30
-
回答问题
-
指令mov ss,ax和mov sp,30执行后,栈顶的逻辑地址为0020:0030H,物理地址为00230H。
-
单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此
时栈空间数据,实验截图如下:
-
汇编指令 pop [0] 执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据,发现并无变化,实验截图如下:
-
把最后四条指令的顺序更改,最终代码如下图:
pop [6] 指令执行结束后,使用d命令 d 20:0 7查看此时数据空间内的数据,发现数据有变化,实验截图如下:
-
实验任务5
-
实践内容如下图:
-
观察并思考
-
问题1:单步执行完mov ss,ax之后指令并没有暂停,后面那条指令也是随即立即执行了。debug的单步调试是一种中断,但由于CPU在执行期间不响应中断请求,所以debug显示的是CPU执行完栈段和栈顶指针分配后的情况。
-
问题2:08 01是偏移地址,3F 07是程序段地址,因为在单步调试,所以存在中断,需要暂存程序现在的入口。
-
实验任务6
-
用任意一款编辑器编写8086汇编程序源码如下:
assume cs:code code segment start: mov cx, 10 mov dl, '0' s: mov ah, 2 int 21h add dl, 1 loop s mov ah, 4ch int 21h code ends end start
-
对程序汇编链接截图(需注意在链接时需通过设置将生成可执行文件指定为task5),如下图:
-
对task6.asm生成的可执行文件task5.exe运行及结果截图:
-
使用d命令,查看task5.exe的程序段前缀,观察这256个字节的内容如下图,并成功验证前两个字节是CD 20
实验任务7
- 补全代码如下:
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, 17h
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
-
填写依据:首先,程序代码段地址是cs,要将寄存器cs中的内容赋值给ax,然后再存入段地址ds;其次,先赋值给cx进行debug,r命令得到cx是21h,故cx=21h-5h=17h。
-
补全程序后生成可执行文件task7如下图:
继续在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。如下图:
实验总结
- 实验需要细心,在审题及编写代码及运行测试时需要踏实的一步一步操作,才能事半功倍
- 书本知识有限,我自己掌握的也不够牢固,以后需要多通过书籍、网络等途径强化巩固知识并扩展知识面,才能做好每一次实验
- 这次实验也巩固了之前所学,对复习与巩固有积极作用