DATAS SEGMENT
;此处输入数据段代码
db 128 dup(0)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;保存 int 9 调用的函数地址
mov ax,0
mov es,ax
push es:[4*9]
pop ds:[0]
push es:[4*9+2]
pop ds:[2]
;修改int 9的地址,这里使用es作为索引,
mov ax,0
mov es,ax
mov word ptr es:[4*9],offset keyboard
mov es:[4*9+2],cs
; 初始化显示地址
mov ax,0b800h
mov es,ax
mov bh,02
mov bl,'a'
mov di,0
;开始打印
call s
MOV AH,4CH
INT 21H
;写入显存
s:
mov es:[di + 160 * 12],bx
call delay
inc bl
cmp bl,'z'
ja done
loop s
done:
ret
;人肉延时
delay:
mov ax,0
mov dx,1000h
counting:
sub ax,1
sbb dx,0
cmp ax,0
jne counting
cmp dx,0
jne counting
delaydone:
ret
;键盘接口
keyboard:
;push ax
;in al,60h
;inc bh
call dword ptr ds:[0]
;pop ax
iret
CODES ENDS
END START
当调用原来的int9地址程序时,就爆了,看了半天,没找到问题所在,极度痛苦中。
call dword ptr ds:[0] |