|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 西医大成 于 2012-7-15 02:16 编辑
请教小甲鱼或者其他诸位高手,看看这个程序到底哪里出问题了,这是个利用int9中断通过按键获取键盘扫描码的程序,获取的扫描码显示到屏幕中间。程序如下:
(另外请假下,像这样需要接收按键的程序是不是没法用debug单步调试啊)
assume cs:code,ds:data
data segment
table db '0123456789abcdef'
dw 0,0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
push es:[9*4] ;保存int9中断地址
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
mov word ptr es:[9*4],offset int9 ;改变int9中断向量地址
mov es:[9*4+2],cs
s: nop
jmp short s ;为了不让程序一执行完就退出做了一个死循环。用下面的int 9中断程序的esc键退出程序。
int9:
push ax
push bx
push es
in al,60h
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[0]
cmp al,1
je asd
;下面这一块是最让我百思不得其解的地方,比如说:我把上面那句cmp al,1(1是esc的扫描码)换成cmp al,3bh(3bh是F1的扫描码),执行程序后按F1立马退出。说明al中的键盘扫描码没有问题,但是到了下面的程序执行后,屏幕上es:[160*12+40*2]和es:[160*12+40*2+2]处却显示的是鬼脸和三角符一类的东西。即使我在这个地方加一条指令mov al,3bh,屏幕上显示的也是一个鬼脸+b字符;说明下面的程序出了问题,而我把下面红字部分的程序单独拷贝出来另写一个程序执行结果就没有问题,程序在最下面(红色和蓝色的程序部分一模一样):
mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,00001111b
mov bl,ah
mov bh,0
mov ah,table[bx]
mov bl,al
mov bh,0
mov al,table[bx]
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah ;在屏幕上显示的是数字英文字符或鬼脸三角符一类的怪东西
mov es:[160*12+40*2+2],al
pop es
pop bx
pop ax
iret
asd:
mov ax,0
mov es,ax
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
mov ax,4c00h
int 21h
code ends
end start
——————————————————————————————————————————
assume cs:code,ds:data
data segment
table db '0123456789abcdef'
dw 0,0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
mov al,3bh ;这里给它赋值3bh
mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,00001111b
mov bl,ah
mov bh,0
mov ah,table[bx]
mov bl,al
mov bh,0
mov al,table[bx]
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah ;在屏幕上显示的也是3bh
mov es:[160*12+40*2+2],al
mov ax,4c00h
int 21h
code ends
end start
|
|