我的程序代码:
assume cs:codes
codes segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,40h
s:mov [bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
codes ends
end
其中最容易出错的是这句:mov cx,40h
到底是40h(64)或是3Fh(63)呢?
正确答案是40h
我们来看一下怎么测试。
第1步:编译和连接并生成exe格式的程序。
第2步:进入debug,使用e命令使内存单元 0020:0000~0020:0040 全部初始化为FF(或是其它与0~3Fh不
一样的数)。
步骤省略。
第3步:使用d命令查看内存单元 0020:0000~0020:0040 的内容:
-d 20:0 40
0020:0000 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
0020:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
0020:0020 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
0020:0030 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
0020:0040 FF .
第4步:使用t或p命令执行程序。
步骤省略。
第5步:使用d命令再次查看内存单元 0020:0000~0020:0040 的内容:
-d 20:0 40
0020:0000 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
0020:0010 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?
0020:0040 FF .
至此可以验证内存单元 0020:0000~0020:003F 发生了改变,而内存单元 0020:0040并未改变。
因此我的程序是对的。
再说一点,要特别注意loop循环的次数。
因为在循环之前我们未做任何写入内存的操作,因此我们要执行0~63共64次操作(cx的值即为循环的次数)
所以cx=40h(64)。
记得本章讲解loop操作的时候,有的计算实际上在操作前已经做了一些提前的操作,比如求2的多少次方的问题。
在一般情况下,初始化应该是s=1(s表示积),而书中的例子是初始化s=2(详细例子见5.2和5.3小节),这是
需要注意,细节的问题往往导致程序出错。
这就是我的一点感想吧,希望对大家的学习有帮助。 |