assume cs:code
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 ax,0
mov es,ax
mov si,offset newint9
mov di,204h
mov cx,offset endnewint9-newint9
cld
rep movsb
push es:[9*4]
pop es:200h
push es:[9*4+2]
pop es:202h
cli
mov word ptr es:[4*9],204h
mov word ptr es:[4*9+2],0
sti
mov ax,4c00h
int 21h
newint9:push dx
push es
push bx
push cx
in al,60h
pushf
call dword ptr cs:[200h]
s: in al,60h
cmp al,9eh
jne s
;关键是这个标号s.
mov ax,0b800h
mov es,ax
xor bx,bx
mov cx,2000
back: mov es:[bx],'A'
add bx,2
loop back
over: pop cx
pop bx
pop es
pop dx
iret
endnewint9:nop
ends segment
end start
根据我的理解是这样的:输入键盘——产生扫描码(通码)——发送到60H端口——如果IF=1则引发INT 9——INT判断是打印到屏幕呀、或者是无效操作——IRET结束。
第一个问题:如果是断码会怎么样?求过程。
按照正确答案断码也会传送到60H端口,那么为什么一定要判断输入的是不是A的通码?我只要我要的9E(即a的断码)就可以了!问题如上,按我的说的应该没问题吧?但是为什么我的程序不可以呢?望高手解答,谢谢你们! |