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 .

将源代码中 line70433h→0432h, line100436h→0439h, 然后重新汇编、连接.

可以看到屏幕左上方出现红色数值29 .

将源代码中 line70433h→0333h,line100436h→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

  1. http://www.husseinsspace.com/teaching/udw/1996/asmnotes/chapone.htm

 

CC BY-NC-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注