-132- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
-g 100 106[Enter] 注意CX寄存器光标的起始、终止线都为0 | |||||||||||||||||||||
AX=0100 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=09DF | ES=09DF | SS=09DF | CS=09DF | IP=0106 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
09DF:0106 | CD10 | INT 10 准备改变光标形状 | |||||||||||||||||||
注意下面要用"P"命令跟踪INT指令的执行,不要使用"T"命令,那样DEBUG将跟踪到BIOS中去。 | |||||||||||||||||||||
-p | |||||||||||||||||||||
AX=000B | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=09DF | ES=09DF | SS=09DF | CS=09DF | IP=0108 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
09DF:0108 | B401 | MOV AH,01 | |||||||||||||||||||
执行过的这一小段程序将光标的起始线与终止线都设为0,跟踪完"INT 10"后我们可以看到光标跑到了字符的上面且变成了一条细线。(我是看到了,你呢?)看来第二个问题有了答案:若光标终止线位置不在字符区的最后一线,那么光标就会出现在字符区的不同位置。 | |||||||||||||||||||||
-g=108 10e[Enter] 起始线在终止线以下 | |||||||||||||||||||||
AX=010B | BX=0000 | CX=0100 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=09DF | ES=09DF | SS=09DF | CS=09DF | IP=010E | NV UP EI PL NZ NA PO NC | ||||||||||||||||
09DF:010E | CD10 | INT 10 | |||||||||||||||||||
程序的后半部分设置了新的光标形状,起始线在终止线以下,不知会出现什么结果。我们来跟踪一下: | |||||||||||||||||||||
-p | |||||||||||||||||||||
AX=000B | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=09DF | ES=09DF | SS=09DF | CS=09DF | IP=0110 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
09DF:0110 | 08847453 | OR [SI+5374],AL | |||||||||||||||||||
由跟踪结果我们可以得出这样的结论,即当使用01H功能改变光标形状时光标终止线可以不设在字符行的最底线,但是应保证起始线在终止线上面,否则就无法知道光标会变成什么样子。笔者使用一块具有PCI接口的"S3 868"显示卡,执行后一半程序时光标被关闭,使用其它显示卡会出现什么结果可就不好说了。所以除非必要,最好还是按规矩办事。 关于光标的问题我们暂且讨论到这里,下面我们要来研究一个非常关键的问题,那就是如何清屏幕。我想我们没有任何理由认为这个问题不重要,几乎所有高级语言都提供了清屏的语句或函数,即使是DOS也提供了CLS命令。这些语句、函数以及CLS命令究竟是如何起作用的呢?这就是我们将要研究的问题。 说实在的,如果单就"清屏幕"这个问题而言解决的办法有很多,恐怕大家都能想到这个方法那就是在屏幕上显示25行空格就可清除屏幕上所有的内容。下面这个程序就是据此思路编写的: |
|||||||||||||||||||||
C:\ASM\>DEBUG [Enter] -a100[Enter] |
|
||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |