我被这个东西卡住了,我想看看是否按下了右shift键,所以我有这个assambler代码:
mov ah,2
int 16h ;calling INT 16,2 - Read Keyboard Flags interrupt
mov ah,10000000b
shl al,7
and al,10000000b
cmp al,ah ;check if first bit is 1
je rshift
jmp final
rshift:
mov ah,9
lea dx,rsh ;rsh is a string that says that "right shift button has been pressed"
int 21h
jmp final
final: ; quit program
mov ax,4c00h
int 21h为什么它不工作?,我认为问题是int16,2不能正常工作,如果是这样,为什么呢?下面是int16,2应该做的事情:
AH = 02
on return:
AL = BIOS keyboard flags (located in BIOS Data Area 40:17)
|7|6|5|4|3|2|1|0| AL or BIOS Data Area 40:17
| | | | | | | `---- right shift key depressed
| | | | | | `----- left shift key depressed
| | | | | `------ CTRL key depressed
| | | | `------- ALT key depressed
| | | `-------- scroll-lock is active
| | `--------- num-lock is active
| `---------- caps-lock is active
`----------- insert is active我从来没有看到过这条消息,我在debug中查看了AL寄存器,在我调用int16,2之后,它似乎没有改变。我在x86架构上运行Win 7,并且我正在使用tasm
发布于 2009-11-11 20:17:38
你是如何测试它的?
出于好奇,我做了一个简单的程序(代码如下)。当在Windows控制台下运行时,它检测到左移(Result: 2),但从未检测到右移(预期为Result: 1,但仅获得Result: 0)。
当在纯DOS (在VMWare中)下运行时,它可以正确显示所有组合(0到3)。
所以它似乎是NTVDM (Windows DOS仿真)的产物,尽管我没有任何来源可以引用。
我的代码:
.model small
.code
start:
mov ax, seg msg
mov ds, ax
mov ah, 2
int 16h
and al,3 ; get two lower bits - both SHIFTs
add digit, al ; convert to decimal
lea dx, msg
mov ah, 9
int 21h
mov ax, 4c00h
int 21h
.data
msg db 'Result: '
digit db '0'
db 13,10,'$',0
.stack
db 16384 dup(?)
end start发布于 2009-11-11 06:52:59
您应该能够通过执行以下操作来清理您的支票:
test al,1
jnz rshift发布于 2009-11-11 06:50:54
我不能解释为什么你的代码不能工作,但是你可以替换
mov ah,10000000b
shl al,7
and al,10000000b
cmp al,ah ;check if first bit is 1通过
test al, 1如果汇编语言中有习语的话,它做的事情也是一样的,而且更地道。
编辑:正如Michael在下面的评论中指出的那样,如果您使用test指令,则需要反转条件跳转。如果且仅al和C的逐位and为零,则test al, C设置ZF。
https://stackoverflow.com/questions/1711778
复制相似问题