如何在某些击键组件上启动中断
How to start interruption on certain key stroke assembly
我想编写一个程序,不断打印一个数字(变量),当按下“+”时,数字会增加,当按下“-”时,数字会减少,但我不想要这个程序停止并等待输入,我希望中断从击键开始......
有任何想法吗???
我试图设置 "AH = 6" 和 int "21h",但随后程序等待输入。
我希望程序在运行
时等待输入
org 100h
mov ax, 127
array db "000", 0Dh,0Ah, 24h
temp dw 10
start:
followHeater:
in ax, 125
push ax
mov bx, offset array
push bx
call my_print_num
mov dx, offset array
mov ah, 9
int 21h
in ax, 125
cmp ax, temp
mov ax, 1
jl heat:
mov ax, 0
jmp continue
heat:
mov ax, 1
continue:
out 127, ax
jmp followHeater
mov ah, 0
int 16h
ret
jmp start
proc my_print_num
push bp
mov bp, sp
pusha
mov di, 10
mov si, 2
mov cx, 3
mov ax, [bp+6]
mov bx, [bp+4]
getNum:
xor dx, dx
div di
add dl, '0'
mov [bx+si], dl
dec si
loop getNum
popa
mov sp, bp
pop bp
ret
endp my_print_num
org 100h
mov ax, 127
array db "000", 0Dh,0Ah, 24h
temp dw 10
start:
这里的代码乱七八糟!您必须跳过数据。 (而且 mov ax,127
指令可能不是您想要的)。
org 100h
jmp Start
array db "000", 0Dh,0Ah, 24h
temp dw 10
start:
i want the program to wait for the input while running
为什么不能使用BIOS键盘功能?函数 01h 测试密钥是否可用,returns 立即报告 ZeroFlag 中存在密钥。如果某个键可用,您会在 AX
中收到它的预览,但该键仍保留在键盘缓冲区中。如果 ZF=0
您使用函数 00h 实际检索密钥。这不会花很长时间,因为您知道有一把钥匙在等着您!
mov ah,01h ;TestKey
int 16h
jz NoKey
mov ah,00h ;GetKey
int 16h
mov cx,1
cmp al,'+'
je SetTemp
neg cx
cmp al, '-'
je SetTemp
; Here you can test for more keys!
NoKey:
jmp followHeater
SetTemp:
add temp,cx
jmp followHeater
您的程序中存在严重错误。 my_print_num 过程在堆栈上使用 2 个参数调用。很好,但是您还需要从堆栈中删除它们。
callee 删除参数,如果你写:
ret 4
endp my_print_num
或者 调用者 删除参数,如果你写:
call my_print_num
add sp,4
你转暖的逻辑on/off太复杂了
下一个代码做同样的事情:
in ax, 125
cmp ax, temp
mov ax, 1 ;Heat ON
jl heat
dec ax ;Heat OFF
heat:
out 127, ax
或者,如果您被允许使用优于 8086 的指令。
in ax, 125
cmp ax, temp
setl al ;Sets AL=1 if condition Less, else sets AL=0
cbw ;Makes AH=0
out 127, ax
我想编写一个程序,不断打印一个数字(变量),当按下“+”时,数字会增加,当按下“-”时,数字会减少,但我不想要这个程序停止并等待输入,我希望中断从击键开始...... 有任何想法吗??? 我试图设置 "AH = 6" 和 int "21h",但随后程序等待输入。 我希望程序在运行
时等待输入org 100h
mov ax, 127
array db "000", 0Dh,0Ah, 24h
temp dw 10
start:
followHeater:
in ax, 125
push ax
mov bx, offset array
push bx
call my_print_num
mov dx, offset array
mov ah, 9
int 21h
in ax, 125
cmp ax, temp
mov ax, 1
jl heat:
mov ax, 0
jmp continue
heat:
mov ax, 1
continue:
out 127, ax
jmp followHeater
mov ah, 0
int 16h
ret
jmp start
proc my_print_num
push bp
mov bp, sp
pusha
mov di, 10
mov si, 2
mov cx, 3
mov ax, [bp+6]
mov bx, [bp+4]
getNum:
xor dx, dx
div di
add dl, '0'
mov [bx+si], dl
dec si
loop getNum
popa
mov sp, bp
pop bp
ret
endp my_print_num
org 100h mov ax, 127 array db "000", 0Dh,0Ah, 24h temp dw 10 start:
这里的代码乱七八糟!您必须跳过数据。 (而且 mov ax,127
指令可能不是您想要的)。
org 100h
jmp Start
array db "000", 0Dh,0Ah, 24h
temp dw 10
start:
i want the program to wait for the input while running
为什么不能使用BIOS键盘功能?函数 01h 测试密钥是否可用,returns 立即报告 ZeroFlag 中存在密钥。如果某个键可用,您会在 AX
中收到它的预览,但该键仍保留在键盘缓冲区中。如果 ZF=0
您使用函数 00h 实际检索密钥。这不会花很长时间,因为您知道有一把钥匙在等着您!
mov ah,01h ;TestKey
int 16h
jz NoKey
mov ah,00h ;GetKey
int 16h
mov cx,1
cmp al,'+'
je SetTemp
neg cx
cmp al, '-'
je SetTemp
; Here you can test for more keys!
NoKey:
jmp followHeater
SetTemp:
add temp,cx
jmp followHeater
您的程序中存在严重错误。 my_print_num 过程在堆栈上使用 2 个参数调用。很好,但是您还需要从堆栈中删除它们。
callee 删除参数,如果你写:
ret 4
endp my_print_num
或者 调用者 删除参数,如果你写:
call my_print_num
add sp,4
你转暖的逻辑on/off太复杂了
下一个代码做同样的事情:
in ax, 125
cmp ax, temp
mov ax, 1 ;Heat ON
jl heat
dec ax ;Heat OFF
heat:
out 127, ax
或者,如果您被允许使用优于 8086 的指令。
in ax, 125
cmp ax, temp
setl al ;Sets AL=1 if condition Less, else sets AL=0
cbw ;Makes AH=0
out 127, ax