目录 上一页 下一页 下一章

-16- PC机汇编语言实战精解

-rbx[Enter]输入的命令
BX 0000DEBUG显示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"来结束这无休止的叫声。我们已经得到了宏观结果,下面就来仔细分析一下程序的微观结构--每个指令的作用。

2.2.2 程序透析

  还记得我们前面的讨论吗?若要让喇叭发声,关键是连续改变61H端口的bit1位的状态。但由于8086/88在设计时规定端口不能直接参与任何运算和逻辑操作,因此程序必须首先将61H端口内各个位的当前状态取到CPU中。这就是第一条指令的作用。
助记符:IN(In)
用 途:将某端口的数据取至累加器
格 式:IN 累加器,端口号
执 行:端口内各个位的状态传送至累加器(AL或AX)
  IN是这条指令的助记符,此指令的作用如上所述。由于累加器是CPU和端口之间的"唯一"通路,因此在此程序的这条指令中只能使用AX寄存器。而且程序现在要从端口中取得8bit数据,则我们必须要用AX的低8位--AL。注意不能用AH寄存器。像这样的用法--"IN AH,61"或"IN BL,61"都是不对的。
  十六进制数字"61"就是提供数据的端口地址。对于地址小于0FFH的端口都可以在指令中直接引用地址,而超过0FFH的端口不能这样应用。例如"IN AL,1C0"这样的用法是错误的。至于如何取得地址大于0FFH的端口状态,将在后面介绍。
  这里有三个问题应注意:
① 助记符后的空格只能多而不能省,指令中的逗号不能丢;
② DEBUG只接收16进制数,如果使用其它进制数应先转换成16进制;
③ 数据进入累加器后,各个位排列排列顺序与端口是一一对应的,即AL的bit0对应

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章