首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8086汇编程序,整数16,2

8086汇编程序,整数16,2
EN

Stack Overflow用户
提问于 2009-11-11 06:43:36
回答 3查看 3.8K关注 0票数 4

我被这个东西卡住了,我想看看是否按下了右shift键,所以我有这个assambler代码:

代码语言:javascript
复制
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应该做的事情:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-11 20:17:38

你是如何测试它的?

出于好奇,我做了一个简单的程序(代码如下)。当在Windows控制台下运行时,它检测到左移(Result: 2),但从未检测到右移(预期为Result: 1,但仅获得Result: 0)。

当在纯DOS (在VMWare中)下运行时,它可以正确显示所有组合(0到3)。

所以它似乎是NTVDM (Windows DOS仿真)的产物,尽管我没有任何来源可以引用。

我的代码:

代码语言:javascript
复制
.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
票数 2
EN

Stack Overflow用户

发布于 2009-11-11 06:52:59

您应该能够通过执行以下操作来清理您的支票:

代码语言:javascript
复制
test al,1
jnz rshift
票数 1
EN

Stack Overflow用户

发布于 2009-11-11 06:50:54

我不能解释为什么你的代码不能工作,但是你可以替换

代码语言:javascript
复制
mov ah,10000000b
shl al,7 
and al,10000000b
cmp al,ah         ;check if first bit is 1

通过

代码语言:javascript
复制
test al, 1

如果汇编语言中有习语的话,它做的事情也是一样的,而且更地道。

编辑:正如Michael在下面的评论中指出的那样,如果您使用test指令,则需要反转条件跳转。如果且仅alC的逐位and为零,则test al, C设置ZF。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1711778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档