Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15171844
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-03-20 10:15:31

2.2 验证上面的理论

2.2.1 中断向量表
中断向量表就是所有中断向量首地址表,这里保存着每个中断程序的首地址,几乎所有的汇编书都把中断后面后面的章节中,并且对中断的解释也仅从字面意思解释,所以导致大学对中断的不重要和误解。没耐心的没到这个章节就不学汇编了,有耐心的到这里才豁然开朗。我现在不讲中断的原意。我直接告诉你,你把中断当成API也许更合适。也就是说,别人把很多已作好的功能放到了内存中。并且把调用这一功能的号告诉了你,你只要调用这些功能号,系统就自动从这个中断向量表中找到对应的中断,然后执行你的功能。
首先让你感受一下中断的魅力一下吧。比如中断21H的2A功能调用是读取系统的日期,这个调用的规则是,调用前AH寄存器置为2A。调用后年在CX中,月在DH中,DL在日中,星期在AL中。
-a
139D:0100 mov ah,2a
139D:0102 int 21
139D:0104 int 3
139D:0105
-g=100

AX=2A05 BX=0000 CX=07D4 DX=0C18 SP=FFEE BP=0000 SI=0000 DI=0000
DS=139D ES=139D SS=139D CS=139D IP=0104 NV UP EI PL NZ NA PO NC
139D:0104 CC INT 3
-
可能上面的程序你目前还看不懂。不过没关系,“mov ah,2a”表示调用功能号是2a号。“int 21”表示调用十六进制21号中断,“int 3”表示3号中断,表示程序运行到这一句时停一下。“g=100”表示从“139D:0100 ”开始执行。
AX=2A05 BX=0000 CX=07D4 DX=0C18 SP=FFEE BP=0000 SI=0000 DI=0000
DS=139D ES=139D SS=139D CS=139D IP=0104 NV UP EI PL NZ NA PO NC
表示执行的结果。其中CX是年,这个年是由CX中存。07D4十进制就是2004年。DH+DL=DX,所以DH=0C,DL=18。二者转化为十进制就是DH=12,DL=24,也就是今天了。AX=AH+AL=2A05,所以AL=05。那就是今天是星期五。
上面可能你们现在还看不懂,不过通过解说你应该可以知道,仅仅两行命令,就读到了现在的值。现在需要作的就是把这些值提取出来用作他用了。

从中断的作来与中断向量表又有什么关系呢?原来你在汇编里运行int 21时,系统就在上面的中断向量表中找到int 21的中断地址,该中断的地址应该位于:0000:0084~0000:0087,具体算法前面已说明了。
-d 0000:0084 0087
0000:0080 7C 10 A7 00 |...
-
找到内容是:00A7:107C。然后系统就转到这个地址执行int 21。

2.2.2 系统数据区前面都已说明过。不再多说。系统区,很多DOS中断程序实现部分就在这个区。程序运行区依不同的程序而不用。

2.2.3 640K~1M之间,这期间有些地方是ROM,有些地方是硬件的BIOS区。我仅以两个例子说明这一区。
ROM区:ROM区就是只读内存,也就是说这个区的数据只能读不能写。比如F000:0000开始的内存是ROM。我们来写一下,然后再看看效果。
-d f000:0000 0005 '显示由F000:0000到F000:0005的六个字节值。
F000:0000 04 E8 A2 FF F9 C3 ......
-e f000:0000 '修改命令
F000:0000 04.00 E8.00 A2.00 FF.00 F9.00 C3.00'注意,.后面的是我改的,把这几个值都改成0了。
-d f000:0000 0005 '再次显示这个区的数据。
F000:0000 04 E8 A2 FF F9 C3 ......
-
通过上面测试,发现该区数据仍然未改变。但你要是试别的RAM区的,肯定会变。如果想试你自己试试吧。

显示缓冲区:在文本方式下,B800:0000开始的地址保存着屏幕上每个字符位置的值。在文本方式下,屏幕被分为80 X 25。每个位置有两个值,一个值是ASCII字符,一个值是该ASCII的属性值(主要是颜色)。所以一个屏幕共有80X25X2=400个字符。
我们来改:
-d b800:0000 0010 '显示屏幕缓冲区的内容,注意此时本行最左边的“-”是屏幕左上角。
B800:0000 2D 07 64 07 20 07 62 07-38 07 30 07 30 07 3A 07 -.d. .b.8.0.0.:.
B800:0010 30 0
-
看上面的命令,屏幕最上边一行是“-d b800:0000 0010”,所以他的内容就是“2D 07 64 07 20 07 62 07-38 07 30 07 30 07 3A 07”其中,2D是“-”的ASCII值,07是“-”的属性值。64是“d”的ASCII值,07是“d”的属性值。。。。。
现在修改这些值。我把左上角的字改成黄颜色的“-”,那当然是改b800:0001的属性值了。
-e b800:0001 0e
是不是左上角的颜色变成黄色了吗?
好了,把第二个字符变成绿色的“-”吧?
-e b800:0002 2d 0b
变了吗?
阅读(340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~