这章的实验的主要内容是掌握 loop 和 [bx] 的用法。
实验一的内容是编写代码完成向 b800:07b8开始的连续的16个字单元重复填充0403H。
这次我们直接在 dosbox 下编写代码,编写代码如下:
接下来,我们保存为t4.asm,然后编译、链接、运行它看看。结果如图:
图中多了16个红心。将0403h 改为 0411h后,再次编译、链接、运行,如图:
实验二是向内存 0:200~0:23f 依次传送数据 0~63。这个实验和实验一类似只需改动一小部分即可。代码如图:
接下来我们保存它为t5.asm,然后编译、链接、调试它,看看结果对不对。
我们 debug t5.asm。用 u 命令找到 loop 对应的 ip,然后直接 g 命令到 loop 执行完,再用 d 命令查看0:200~0:23f 的值。过程如图。
结果代码正确的将值送入了对应的内存,和我们预想的一样。
接下来我们用栈来实现数据的传送。代码也很简单,解决如何将单个字节压入以字为单位的栈即可。只需要设置一个容量为32以上的栈(我只设置了6个字节的栈),然后将0~63两两组合,大的放在 ah,小的放在 al,压入栈,重复直至结束,然后再依次弹出入对应内存即可。(入栈顺序也可以和弹出入内存的顺序都颠倒一下,入栈出栈的顺序注意一下即可。)代码太长,我把它贴在记事本里。代码如下:
保存为t5-1.asm,同样的编译、链接、调试它,过程如下:
结果和我们预想的一致。
实验三的内容是将一段代码中的一部分代码复制到内存0:200。补全程序,并调试。代码如下:
我的答案如下:
填空的依据是:
第一空,因为,我们要把代码本身复制,那么数据段也应该是代码段,所以此处应该填 cs 。(从循环中第一个指令也可以看出。)
第二空,是数出来的。常量数值(如:0010h,10h)都占两个字节,其余都占1个字节。从0开始数,到 loop s 结束,一共21个字节,换算成16进制为:15 h。由于循环判断条件为 cx 是否为 0,所以,15+1=16。所以答案为16h。(当然不换算也可以,不换算答案为22 )
我们来编译、连接、调试一下,看看是否正确。过程如下:
结果和我们预想的一致。
总结与体会:
通过这次实验,我掌握了 loop 和 [bx] 的使用,也学会了数代码字节数。