中断调用,读写内存、端口应用讲解(3)

来自:http://qbdos.51.net/cgi-bin/bbs 作者:
我写了模板
这是一个INT21中断调用的BAS,大家可以很方便的写有关中断调用的程序了
启动QB的时候 别忘了用QB/L
比如资料上说,INT21号中断显示功能调用,入口AH=9 DS:DX=ASC字符串+$,可以在程序里这样用
buff$="Test Show ..."
buff$=buff$+"$" '以$结尾
BuffSeg=varseg(buff$) '得到字符的段址
Buffoff=sadd(buff$) '得到字符串的偏移地址
ah=&H9
ds=buffseg
dx=buffoff
Xint &h21

这样就可以显示了
varseg、sadd,是返回字符串段址偏移地址的 语句

下面就 是整个源程序!
代码:

TYPE RegTypeX
ax AS INTEGER
bx AS INTEGER
cx AS INTEGER
dx AS INTEGER
bp AS INTEGER
si AS INTEGER
di AS INTEGER
flags AS INTEGER
ds AS INTEGER
es AS INTEGER
END TYPE
DIM SHARED ax, bx, cx, dx, si, di, flags, ds, es, AH, AL, BH, BL, CH, CL, DH, dl

SUB Xint (intnum%)
DIM Reg AS RegTypeX
IF ax = 0 THEN ax = ah * &H100 + al
IF bx = 0 THEN bx = bh * &H100 + bl
IF cx = 0 THEN cx = ch * &H100 + cl
IF dx = 0 THEN dx = dh * &H100 + dl
Reg.ax = ax
Reg.bx = bx
Reg.cx = cx
Reg.dx = dx
Reg.si = si
Reg.di = di
Reg.ds = ds
Reg.es = es
CALL INTERRUPTX(IntNum%, Reg, Reg)
ax = Reg.ax
bx = Reg.bx
cx = Reg.cx
dx = Reg.dx
si = Reg.si
di = Reg.di
ds = Reg.ds
es = Reg.es
ah = ax AND &HFF00: ah = ah / &H100
al = ax AND &HFF
bh = bx AND &HFF00: bh = bh / &H100
bl = bx AND &HFF
ch = cx AND &HFF00: ch = ch / &H100
cl = cx AND &HFF
dh = dx AND &HFF00: dh = dh / &H100
dl = dx AND &HFF
END SUB



4 写内存语句的使用举例

我们先来看一个小例子
PRINT “*”

我想这个都懂吧!
可是如果不用PRINT语句能显示*么,当然能!
我们先学习一下计算机的有关知识!

显示器的显示属性定义
显示缓冲区地址    
B800:0000—— 2000H字 彩色显示器文本模式的显示缓冲区。每个字中的低字节是字符的ASCII码,高字节是其属性( 背景属性 前景属性 )

我们就以彩色显示器文本模式的显示缓冲区为例子!
目的:往显示缓冲区写东西,看看屏幕上的结果
思路:先定义段到B800,然后写内存
如果我们要显示背景为兰色,前景为灰色的*,如下:
用QB提供的语句:
COLOR 7,1
PRINT “*”
自己调用写内存的语句:
DEF SEG=&HB800
POKE 0,42 '(42是字符*的ASC码)
POKE 1,&H17 '写字符的属性
DEF SEG '恢复段