实验任务3
(1)在debug中使用e命令修改内存单元
(2)在debug中使用f命令批量填充内存单元 A0000~BFFFF的内存单元为显存地址空间,写入其中的数据会被显示卡输出到显示器上 A0000h - AFFFFh是图形模式(Graphic Mode)的显存
输入指令进行单步跟踪
-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:30H 物理地址:00230H
2. 执行到pop[6]前
3. pop[0]执行结束后
4. 最后4条指令翻转后,会变成70 80 50 60 30 40 10 20
实验任务5
输入如下内容
1. 程序没有暂停,所有对ss寄存器进行值修改的指令执行后,都紧接着执行其下一行指令的修改,所以紧接着执行mov sp 30,debug的单步调试就是一种中断,而CPU在此期间不响应中断
2. 0108是偏移地址IP,150F是程序段地址CS,因为中断时需要保存原来程序的入口
实验任务6
使用masm、link,汇编、链接,得到可执行文件task5.exe。运行程序。结合程序运行结果,理解程序功能。
在debug中,使用d命令,查看task6.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是否是CD 20
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输出 结果为0123456789 161F :0000处确实为CD 20,以及程序名在161F:0080
实验任务7
下面程序的功能是,完成自身代码的自我复制:把 mov ax, 4c00h 之前的指令复制到内存0:200开始的 连续的内存单元。 补全程序,并在debug中调试验证,确认是否正确实现了复制要求
assume cs:code code segment mov ax, cs mov ds, ax ;数据段就是程序段 mov ax, 0020h mov es, ax mov bx, 0 mov cx, cx; cxw为程序长度 s: mov al, ds:[bx] mov es:[bx], al inc bx loop s mov ax, 4c00h int 21h code ends end复制成功