今天一个网友在一个汇编群里问了一个问题,内容差不多就是,如何在8086汇编中用int 16h号中断接收alt+方向键(用这个组 合键移动光标)。
然后我试了一下,发现,int 16h对这个组合键没反应。
然后我没找到原因,不过找了个替补方法,就是用一直循环用int al,60h读取当前按下的键,判断是不是我需要的键。
下面方向键都为扫描码:
alt键的通码是38h,断码是b8h。左方向键是4bh,右方向键是4dh,上方向键是48h,下方向键是50h。
代码:
assume cs:code,ds:data,ss:stack
stack segment
db 256 dup (0)
stack ends
data segment
var_x db 0
var_y db 0
db 256 dup (0)
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,256
mov ax,data
mov ds,ax
;置光标
mov ah,2
mov bh,0
mov dh,var_y
mov dl,var_x
int 10h
loopstart1:
in al,60h
cmp al,38h
je loopstart2
cmp al,01h
je finishloopstart1
jmp loopstart1end
loopstart2:
in al,60h
cmp al,0b8h
je finishloopstart2
cmp al,50h
je down
cmp al,48h
je up
cmp al,4bh
je left
cmp al,4dh
je right
jmp loopstart2end
left:
dec var_x
mov ah,2
mov bh,0
mov dh,var_y
mov dl,var_x
int 10h
jmp loopstart2end
right:
inc var_x
mov ah,2
mov bh,0
mov dh,var_y
mov dl,var_x
int 10h
jmp loopstart2end
up:
dec var_y
mov ah,2
mov bh,0
mov dh,var_y
mov dl,var_x
int 10h
jmp loopstart2end
down:
inc var_y
mov ah,2
mov bh,0
mov dh,var_y
mov dl,var_x
int 10h
jmp loopstart2end
loopstart2end:
call far ptr fun_delay
jmp loopstart2
finishloopstart2:
loopstart1end:
jmp loopstart1
finishloopstart1:
mov ax,4c00h
int 21h
;延迟功能,自己设置dx和ax的值改变时间
fun_delay:
push ax
push dx
mov dx,0h
mov ax,0ffffh
fun_delay_b:
add ax,0
je fun_delay_a
dec ax
jmp fun_delay_b
fun_delay_a:
add dx,0
je fun_delay_c
dec dx
mov ax,0ddddh
jmp fun_delay_b
fun_delay_c:
pop dx
pop ax
retf
code ends
end start
功能:
你按alt+方向键可以往各个方向移动光标(没有检测超界),按esc可退出程序。
自然语言描述如下:
循环1开始
读60h端口中的数据
如果60h端口中的数据等于38h,就开始执行循环2,否则就跳到循环1开始
循环2开始
读60h端口中的数据
如果60h端口中的数据等于b8h,就说明已经松开alt键,这时跳到循环1开始
如果60h端口中的数据等于4bh,就将光标向左移动
如果60h端口中的数据等于4dh,就将光标向右移动
如果60h端口中的数据等于48h,就将光标向上移动
如果60h端口中的数据等于50h,就将光标向下移动
跳到循环2开始
跳到循环1开始
差不多就这个样子吧。
大家如果发现为啥int 16h不能接收alt+方向键的原因,可以与我分享下,我在这就谢谢各位了。