王爽《汇编语言》实验15——安装新的INT 9中断例程

;MASM编译通过。

;==========================================================================

;安装一个新的 INT 9 中断例程,功能: DOS ,按下"A",除非不再松开,

;如果松开,就显示满屏幕的"A",其他的键照常处理.

;提示:断码=通码+80H

;==========================================================================

 

ASSUME CS:CODE

 

STACK SEGMENT

    DB 128 DUP (0)

STACK ENDS

 

CODE SEGMENT

START:

    MOV AX,STACK        ;初始化DS

    MOV SS,AX

   

    ;把原9号中断的IPCS暂存到0:200H0:202H

    MOV AX,0

    MOV ES,AX

    PUSH ES:[9*4]

    POP ES:[200H]

    PUSH ES:[9*4+2]

    POP ES:[202H]

   

    ;(DS)=(CS)

    PUSH CS

    POP DS

   

    ;复制新的 INT 9 中断到0:204H

    MOV SI,OFFSET INT9START

    MOV DI,204H

    MOV CX,OFFSET INT9END-OFFSET INT9START

    CLD

    REP MOVSB

   

    ;设置新的 INT 9 中断的入口地址

    CLI         ;设置新的 INT 9 中断的入口地址,(IF)=0,不响应可屏蔽中断,

                    ;以免指向错误的地址

    MOV WORD PTR ES:[9*4],204H      ;(IP)=204H

    MOV WORD PTR ES:[9*4+2],0       ;(CS)=0

    STI         ;恢复响应可屏蔽中断

   

    ;测试新的 INT 9 中断

    MOV AX,0B800H

    MOV ES,AX

    MOV AH,'A'

    MOV BX,12*160+40*2

    S:

    MOV ES:[BX],AH

    CALL DELAY

    INC AH

    INC BX

    INC BX

    CMP AH,'Z'

    JNA S

   

    MOV AX,4C00H

    INT 21H

 

;新的 INT 9 中断

INT9 PROC NEAR

    INT9START:

    PUSH AX     ;保护现场

    PUSH CX

    PUSH DI

    PUSH ES

   

    IN AL,60H       ;从端口获取输入

   

    ;调用原 INT 9 中断

    PUSHF

    CALL DWORD PTR CS:[200H]

   

    CMP AL,9EH      ;9EH = A的断码

    JNE INT9RET ;松开A,跳转到INT9RET

    ;输出满屏幕的A

    MOV AX,0B800H

    MOV ES,AX

    MOV DI,0

    MOV CX,2000

    INT9S:

    MOV BYTE PTR ES:[DI],'A'

    INC DI

    INC DI

    LOOP INT9S

   

    INT9RET:

    POP ES          ;恢复现场

    POP DI

    POP CX

    POP AX

    IRET            ;返回

   

    INT9END:

    NOP

INT9 ENDP

 

;延时子程序

DELAY PROC NEAR

    PUSH AX

    PUSH DX

    MOV DX,10H

    MOV AX,0

    S1:

    SUB AX,1

    SBB DX,0

    CMP AX,0

    JNE S1

    CMP DX,0

    JNE S1

    POP DX

    POP AX

    RET

DELAY ENDP

   

CODE ENDS

END START

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值