TA的每日心情 | 开心 2018-10-31 14:26 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
高级会员
- 积分
- 1019
|
assume cs:code, ss:stack
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 128
push cs
pop ds
mov si, offset int9 ; ds:si指向源地址
mov ax, 0
mov es, ax
mov di, 204H ; es:di指向目的地址
mov cx, offset int9end-offset int9 ; 传输长度
cld ; 传输方向为正
rep movsb
push es:[9*4]
pop es:[200H]
push es:[9*4+2]
pop es:[202H]
cli
mov word ptr es:[9*4], 204H
mov word ptr es:[9*4+2], 0
sti
mov ax, 4c00H
int 21H
; ****************************************
; 新的int 9中断历程
; 在DOS下, 按下A键后, 除非不松开, 否则显示满屏幕的A, 其它情况正常处理
int9:
push ax
push bx
push cx
push es
in al, 60H ; 从键盘读取输入字符
pushf
call dword ptr cs:[200H]
; 使用原来的int 9中断处理一般字符
cmp al, 9EH ; 判断按下A键后是否松开
jne int9ret
mov ax, 0b800H
mov es, ax
mov bx, 0 ; es:bx为显示区首地址
mov cx, 2000 ; 满屏可显示2000个字符
s:
mov byte ptr es:[bx], 'A'
add bx, 2
loop s
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
; ****************************************
code ends
end start
|
|