实验1 用汇编指令编码和调试
作者:互联网
- 实验任务二:
- 实验结论——无法修改
- 原因分析——ffff:0-f属于ROM只读存储区,仅能进行写入操作,无法修改其中内容。
- 实验任务三:
修改内存地址:
当我输入以下命令时:
遭到了爱心暴击:
失去爱心:
原因:因为从A0000开始的一段地址范围被用来寻址图形模式的显存,映射到了BIOS的ROM中,而从B8000开始的地址到BFFFF这段地址并不是映射到ROM中,而是显存内,所以当修改B0000-B0FFF时不会在屏幕上出现爱心
- 实验任务四:
填空题
问题一: 00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是 答:逻辑地址为20:0030;物理地址为2030.
问题二:
调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此时栈空间数据
问题三: 调试到汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据有变化
问题四: 最后四条指令改变顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7查看此时数据空间内的数据有变化
- 实验任务五:
问题1: 使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的? 答:有实验结果可以看到执行完mov ss,ax时,不光是ss=0020,同时sp也设为了0030,而能设置sp的只有指令mov sp,10,所以在使用t命令单步执行mov ss,ax的时候mov sp,10一定也执行了。通常t命令单步执行一个指令后会停止继续执行,但当执行到mov ss,ax时并没有停止执行,而是执行了mov sp,10才停止,可以猜测,当使用t命令执行修改寄存器SS的指令时,下一条指令会被直接执行。
问题2: 根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
答:可以看到栈内多出了的内容刚好是当前执行指令的地址,由此可见,因为在使用 t 指令时单步执行指令从而引发了中断,而在中断过程中时会使用当前栈空间存放cpu关键数据,便于下次继续执行。
- 实验任务六:
程序源码:
1 assume cs:code 2 3 code segment 4 start: 5 mov cx, 10 6 mov dl, '0' 7 s: mov ah, 2 8 int 21h 9 add dl, 1 10 loop s 11 12 mov ah, 4ch 13 int 21h 14 code ends 15 end start
汇编以及链接过程:
运行结果:
查看程序段前缀PSP:
- 实验任务七:
补全空处后的源码:
1 assume cs:code 2 code segment 3 start: 4 mov ax, cs 5 mov ds, ax 6 mov ax, 0020h 7 mov es, ax 8 mov bx, 0 9 mov cx, 17 10 s: mov al, [bx] 11 mov es:[bx], al 12 inc bx 13 loop s 14 15 mov ax, 4c00h 16 int 21h 17 code ends 18 end
原因:
1、将程序段的段地址传递给中间过渡寄存器ax,从而传给代码段寄存器ds。
2、cx中保存的是程序的长度,但有效程序不包括mov ax 4c00h 和int 21h 所以将17h传递给cx。
反汇编截图:
- 实验总结:
标签:编码,汇编,sp,mov,指令,单步,ax,执行,调试 来源: https://www.cnblogs.com/Strawberries/p/15425685.html