目录
P1
编写代码,这里为了省事,直接使用了vim.
编译、连接、运行
可以看到屏幕上输出了36
将 line4 和 line9 中寄存器 dl 的值分别修改为 0~9 中任何一个数字,重新汇编→连接→运行,观察结果的变化。
这里我改为了7和8,代码略。
Debug调试
首先查看一下寄存器中的内容,注意CS DX CX 的值
可以看到 CS = 076ah = DS+ 10h
因为CS = 16 (0x16),所以接下来反汇编,u 0 15
使用 d 075A:0 2 指令查看PSP前两个字节
可以看到所有反汇编指令。
以下为使用t指令和p指令单步执行的结果。
遇到INT 指令的时候用p 指令,实验时当执行到最后一条指令int 21h 时我用错了指令,可以看到已进入了子程序中。
P2
写代码,写代码,写代码。
注意,这里如果直接写b800h 是不可以的。
编译,连接,运行。
可以看到屏幕左上方出现红色数值36 .
将源代码中 line7 的 0433h→0432h, line10 的 0436h→0439h, 然后重新汇编、连接.
可以看到屏幕左上方出现红色数值29 .
将源代码中 line7 的 0433h→0333h,line10 的 0436h→0336h, 然后重新汇编、连接
可以看到屏幕左上方出现蓝色数值36 .
About the problem
这里老师反复提到程序中有两个错误,但是我实在是没有发现到。
反编译了以下,代码也没有什么问题,所写即所得。
整个实验很顺利,没有遇到什么问题。
[11-17 Update]
通过反编译,可以看到第5行和第7行实际上并不是我们当初写的代码。
如果直接在debug中输入指令,也会提示并报错,但如果加入word ptr 后就不存在这个问题了。
下面为修改后的代码。
The reason for the “word ptr” is that the assembler cannot guess whether to use a byte or a word for the data storage. So we explicitly denote that this location points (ptr) to a word.
SUMMARY
比较简单的一次实验。
REFERENCE
本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.