ITEEDU

2.2 编制第一个程序

2.2节导航:第一页 第二页

2.2.1 程序的输入和保存

  了解了上面这些知识,我们就可以开始编写第一个程序了。编程之前先要命令DEBUG 作好翻译汇编指令的准备--在"-"后面打入一个字母"A"并回车。看到了什么有趣的东西吗?

-a             输入的命令 
0B01:0100      程序的起始地址

"A"命令的作用是告诉DEBUG现在开始编写程序,它可以后加一个地址作为参数,即可以从代码段的任何位置开始输入程序。对于新编一个程序来说,必须从100H开始。因此我们也可打入"A100[?]"。对于修改一个已经存在的程序中的部分指令,可在A后面打入将要修改指令的偏移地址即可。例如要重写位于偏移量200H处的指令,可打入"A200[?]"。此时屏幕上将显示0B01:0200。

  输入了"A"命令之后,屏幕上应出现一个以"段:偏移"形式表示的逻辑地址。这个地址就是程序的起始地址。它和CPU中CS:IP指向的位置相同。
在不同的机器,不同的DOS版本中,用户程序的起始段地址是不同的。如果看到的段地址不是0B01,那并没有任何关系。关于偏移地址必为0100的原因前面说过,这是DOS的安排。

看到逻辑地址后,我们即可敲入程序1。DEBUG会自动把输入的汇编指令译成机器码并保存在相应存储单元中。每条指令译完后DEBUG会自动列出下条指令的逻辑地址,因此我们只要打入程序右侧的那些指令即可。左边的逻辑地址是自动给出的。

-a[Enter]         用户输入的内容
0B01:0100          in al,61 
0B01:0102          xor al,2     
0B01:0104          out 61,al
0B01:0106          mov cx,400
0B01:0109          loop 109
0B01:010B          jmp 100
0B01:010D          ←--此处直接回车

在运行这个程序前,我们应先将此程序存盘。因为程序中的一个细小的"BUG"都可导致"死机"的后果。那如何保存此程序呢?
既然要存盘,总要给程序取个名字。程序命名要用到DEBUG的第三条命令--N,操作如下:

 -NPROG1.COM[Enter]

"N"命令实际来自于英文单词"Name"。有些参考书讨论这个命令时常提醒用户注意不要在"N"后面加空格,其实有无空格并没有关系,至少在6.0以上版的DOS系统没有这个要求。当然,文件扩展名必须是"COM",不能是"EXE"或其它的。

  有了名字后,我们还应告诉DEBUG此程序的字节数。由于程序从100H开始,因此我们只要把最后一条指令的下一个地址减去100H即可得到程序长度。前面那个程序的长度应该是010D-100=0D。

DEBUG规定存盘程序的长度应放在"BX"和"CX"寄存器中,也就是说把BX,CX两个16位寄存器联合起来存放一个32位的长度值,高16位在BX中。因此,若要存盘的内容不足64K,则应将BX置0,而将长度放入CX中。这就要用到前面介绍的"R"命令。操作如下:

-rbx[Enter]          ←          输入的命令
BX 0000             ←          DEBUG显示BX寄存器的原值
:0[Enter]          ←          用户输入的新值,如果直接回车将不改变寄存器的原值
-rcx[Enter]
CX 0000
:0d[Enter]

 有了名字和长度,即可通知DEBUG存盘。这可以使用DEBUG的第四条命令--W。操作很简单,只需在"-"后敲入"W(Write)"并回车,DEBUG会报告存到磁盘上的字节数。

程序已经存盘,我们可以大胆地运行这个程序。程序的细节我们先不必理会,咱们先要个宏观结果。

DEBUG给我们提供了一个命令用于运行程序,命令码是"G"(GO)。由于我们应从偏移100H处执行,所以我们这样应用G命令:

-G=100[Enter],注意等号是不能省略的。

听到声音了吗?结果应该是令人兴奋的。喇叭里真的发出了连续的声音。不过兴奋之余,大家还应该清楚一点,就是在机器不断电和热启动的情况下,此声音将永远"连续"。也就是说,机器此时已经进入"死锁"状态。

不过不必担心,出现这种情况并非是程序中有"BUG",而是我们用的指令过于少了,以至于不可能让这个程序正确结束。这个问题我们会在后面加以解决。当然要用到更多的指令和知识。

请按下"Ctrl+Alt+Del"来结束这无休止的叫声。我们已经得到了宏观结果,下面就来仔细分析一下程序的微观结构--每个指令的作用。