今天一個網友在一個彙編羣裏問了一個問題,內容差不多就是,如何在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+方向鍵的原因,可以與我分享下,我在這就謝謝各位了。