灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2186回复:0

汇编语言之驻留程序

楼主#
更多 发布于:2012-09-10 18:55

驻留程序TSR(Terminate but Stay Resident)是一种特殊应用程序,它在装入内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。

虽然驻留程序可根据具体的需要有不同的编写方式,但其典型结构包括以下几部分:

1、保存、修改中断向量表;

2、程序第一次运行时的初始化部分:

◆用自己定义的地址来取代中断向量表中的原地址

◆确定驻留代码部分的字节数

◆用中断21H之功能31H把需要驻留代码部分驻留在内存

3、驻留内存的代码部分。

例10.15 在NumLock处于“开状态”时,每按小键盘(Numeric Keypad)上的数字键,给出“啪啪”响声。

解:

CSEGSEGMENT ’CODE’

ORG 100H

start:

JMPinit

INT9DD ?

TSR:

PUSHAX

PUSHCX

PUSHDS;保存寄存器

MOVAH, 2

INT16H;读取键盘当前状态

TESTAL, 00100000B;检测NumLock的状态

JZTSRExit

INAL, 60H

CMPAL, 71

JLTSRExit

CMPAL, 83

JGTSRExit

MOVAL, 10110110B

OUT43H, AL;向端口43H送特定的数0B6H

MOVAX, 1000

OUT42H, AL

MOVAL, AH

OUT42H, AL;向端口42H送声音频率

INAL, 61H;读取扬声器的当前状态

MOVAH, AL;把扬声器的状态保存在AH中

ORAL, 03

OUT61H, AL;开声音

MOVCX, 9000

delay:

LOOPdelay;声音延迟

MOVAL, AH

OUT61H, AL;恢复扬声器原来的状态,即关声音

TSRExit:

POPDS

POPCX

POPAX ;恢复寄存器

JMPCS:INT9;转向中断9H原来的处理程序

init:

CLI;关中断

MOVAH, 35H

MOVAL, 09H

INT21H

MOVword PTR INT9, BX

MOVword PTR INT9+2, ES;保存中断9H原处理程序入口地址

MOV AH, 25H

MOVAL, 09H

LEADX, TSR

INT21H;设置中断9H新的处理程序入口地址

STI;开中断

LEADX, init

ADDDX, 15

MOVCL, 4;把init的偏移量转换成“节数”

SHRDX, CL;每节内有16个字节

MOVAX, 3100H

INT21H

CSEGENDS

ENDstart

例10.16 编写一个驻留程序,它可显示当前时间的秒数。

解:

CSEG SEGMENT ’CODE’

ORG100H

start:

JMPinit

INT1CDD ?

SECDW ?

TSR:

PUSHAX

PUSHBX

PUSH CX

PUSH DX

PUSH BP

PUSH DS

PUSH ES;保存所用到的寄存器

MOVAX, CS

MOVDS, AX

MOV ES, AX;把CS的值赋给DS和ES

MOV AH, 2H

INT1AH;读取当前时间

MOV DL, DH

AND DH, 0FH

MOVCL, 4

SHR DL, CL

ADD DX, 3030H

MOV SEC, DX;把当前秒数转化成字符串

MOV AH, 13H

MOV AL, 0

MOVBH, 0

MOV BL, 7

MOVCX, 2

MOVDX, 004EH ;指定显示位置为(0,78)

LEA BP, SEC

INT 10H;在指定位置显示秒数

POPES;恢复所用寄存器的值

POP DS

POP BP

POPDX

POPCX

POPBX

POPAX

JMPCS:INT1C;转向中断1CH原服务程序

init:

CLI

MOVAX, 351CH

INT 21H

MOV word ptr INT1C, BX

MOVword ptr INT1C+2, ES

MOV AX, 251CH

LEADX, TSR

INT 21H

STI

LEA DX, init

ADDDX, 15

MOVCL, 4;把init的偏移量转换成“节数”

SHRDX, CL;每节内有16个字节

MOVAX, 3100H

INT 21H

CSEG ENDS

END start

喜欢0 评分0
游客

返回顶部