TASK2
-d fff0:0 ff
-e 00f5 31 32 2f 31 32 2f 39 32 -d fff0:0 ff
修改后日期并没有更改
向地址C0000-FFFFF的内存单元写入数据的操作是无效的,因为这等于改写只读存储器中的内容
TASK3
-e b800:0 03 04 03 04 03 04 03 04 03 04
-f b800:0f00 0f9f 03 04
修改b800:0以及之后的内存单元
-e b800:0 04 05 04 05 04 05 04 05 04 05
可以发现红色的爱心变成了紫色的菱形
TASK4
-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
指令 mov ss, ax 和 mov sp, 30 执行后,
栈顶的逻辑地址是0020:30 物理地址是00230
汇编指令执行完之后,数据空间内的数据没有发生变化
在改变顺序之后,顺序发生了改变,因为出栈的顺序发生了改变
TASK5
这里涉及到了中断机制
原本在第二次t命令之后,cs:ip指向的命令是mov ax,2010,而不是原本的mov sp,30。ss的内容送入之后,sp的内容也立刻被送入
push指令会改变前8个存储单元
push指令执行之前,第六第七个字与指令的存储位置相同,push指令执行之后,第七个字与ax相同
TASK6
masm
link
运行结果
最终结果输出了0123456789
程序的前两个字节是CD 和20
TASK7
为了实现程序的复制,推测ds指向的是前程序的地址,所以ds就是cs
cx是循环次数,循环的次数就是程序的长度,可以看出程序的长度为23
运用g命令和u命令之后确定代码复制到了目标空间
实验总结
经过这次实验我更加清楚了指令的使用方法,通过自己编译的过程注意到了平时自己容易忽视但又容易错的地方。通过自己的调试更加了解了整个代码的执行过程。
同时也更加理解了栈空间,掌握了栈空间的使用方式。