实验1 8086汇编指令编码和调试
2.实验任务2
查看生产日期的d命令:
d fff0:0 ff
使用d命令查看生产日期的截图:

修改生产日期所在内存单元的e命令:
e f000:fff0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
修改后,再次查看的d命令:
d f000:fff0
e命令和d命令的截图如下:

结论:生产日期所在内存单元不能修改,因为内存的FFF00H~FFFFFH为ROM区,内容只能读不能写。
3.实验任务3
修改内存单元的e命令:
e b800:0 03 04 03 04 03 04 03 04 03 04
效果截图:

批量填充内存单元的f命令:
f b800:0f00 0f9f 03 04
效果截图:

修改内存单元后的效果截图:

修改数据后的效果截图:

4.实验任务4
填空
-a mov ax, 20 mov ds, ax mov ss, ax mov sp, 30 push [0] ; 执行后,寄存器(sp) = _002E___ push [2] ; 执行后,寄存器(sp) = _002C___ push [4] ; 执行后,寄存器(sp) = _002A___ push [6] ; 执行后,寄存器(sp) = _0028___ pop [6] ; 执行后,寄存器(sp) = __002A__ pop [4] ; 执行后,寄存器(sp) = __002C__ pop [2] ; 执行后,寄存器(sp) = __002E__ pop [0] ; 执行后,寄存器(sp) = __0030__
回答问题
问题1:逻辑地址:0020:30 物理地址:00230H
问题2:截图如下:

问题3:截图如下,可见数据没有变化:

问题4:截图如下,可见数据有变化:

5.实验任务5
问题1:使用t命令单步执行mov ss,ax后,不暂停。后面的指令mov sp,30是立即紧接着执行的。这是因为debug单步调试是一种中断,CPU执行期间不响应中断请求。
问题2:黄色下划线为CS和IP寄存器的内容,进行单步调试时,发生中断,使用栈存放CPU关键数据来保存原程序的入口。
6.实验任务6
程序源码:
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
masm、link过程与运行task6.exe截图:

查看task6.exe的程序段前缀PSP的截图:前两个字节确实是CD 20

7.实验任务7
完整源码:
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0017h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
填写依据:
(1)程序实现mov ax,4c00h之前的指令的自我复制。所以是将ds:[bx]的内容复制到es:[bx]中,应该将程序的段地址cs赋给ds。
(2)cx是循环次数的控制变量,因为本程序实现代码的自我复制,所以循环次数应该是程序段的总长度减去"mov ax,4c00h"和“int 21h”两条指令的长度。先进行反汇编得到cx的初始值,然后减去那两条指令的长度即可得到cx的值。由下图可知:cx=001C,“mov ax 4c00h”和"int 21h"长度为5,可得001C - 5 = 0017 H。

在debug中使用g命令调试,u命令反汇编,确认是否复制成功:

由图可知,复制成功。

浙公网安备 33010602011771号