实验1 8086汇编指令编码和调试
实验结论
实验任务2
结论:不能修改日期。原因分析:C0000-FFFFF是ROM地址空间,不能向只读存储器中写入数据。
实验任务3debug中e命令修改内存单元的命令:
-e b800:0 03 04 03 04 03 04 03 04 03 04
效果截图:
debug中f命令批量填充内存单元的命令:
-f b800:0f00 0f9f 03 04
效果截图:
(在显存地址空间中)修改内存单元与内存结果后的效果截图:
实验任务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:0030H 物理地址00230H
问题2:
问题3:数据空间没有变化
问题4:数据空间发生了变化
实验任务5
问题1:单步执行完这条指令没有暂停,接着执行完 mov sp, 30后暂停。mov sp, 30是在执行mov ss,ax后一起执行的。
问题2:栈空间中存放了下一条指令的地址,应该是栈空间被破坏了。
实验任务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的结果截图:
在debug中查看task6.exe的程序段前缀PSP截图:
实验任务7
补全后的完整源码:
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,23 s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
第一个空填 cs 的依据:将cs程序段的段地址赋值给ds,ds:0开始就是这个程序代码存放的地址了。
第二个空填 23 的依据:如下图,先随便写一个数,编译链接后,用-u指令反汇编,发现mov ax,4c00h 的偏移地址是0017h,所以前面的代码地址是在0000h-0017h中的,可以得出要循环的次数是23(0017h的十进制)次。
使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图:
实验总结
熟悉debug工具的-r,-e,-f,-t,-g,-u的使用。
理解栈顶指针在进栈和出栈的变化。
学会用汇编语言写出一个程序,使用masm,link对程序汇编链接。