Assembly 为什么右键不是';你不打算退出,其他的钥匙也要开了吗?涡轮汇编程序

Assembly 为什么右键不是';你不打算退出,其他的钥匙也要开了吗?涡轮汇编程序,assembly,keyboard,buffer,x86-16,tasm,Assembly,Keyboard,Buffer,X86 16,Tasm,有人知道为什么RightKeyUp不会退出,而其他键会退出? 它在Tasm Turbo汇编程序中的应用 当我清除缓冲区时 (mov-ah,0ch 莫夫艾尔,07h int 21h) 由于某些原因,我没有得到密钥释放 例如,此代码(永远不接受RightUp): 我选中了more选项,我知道这两个命令(mov-ah、0、int16h)的作用是相同的 但也得不到释放的钥匙 我真的需要帮助:) 更多更具体的代码: IDEAL MODEL large STACK 256 RightU

有人知道为什么RightKeyUp不会退出,而其他键会退出?
它在Tasm Turbo汇编程序中的应用

当我清除缓冲区时 (mov-ah,0ch 莫夫艾尔,07h int 21h)

由于某些原因,我没有得到密钥释放

例如,此代码(永远不接受RightUp):

我选中了more选项,我知道这两个命令(mov-ah、0、int16h)的作用是相同的 但也得不到释放的钥匙 我真的需要帮助:)

更多更具体的代码:

    IDEAL

MODEL large

STACK 256

    RightUP          equ 11001101b
    RightDown        equ 77
    EscKey           equ 1

DATASEG

    CanClick db 1

CODESEG   

Start:

        mov ax, @data
        mov ds, ax

        mov ah,00h
        mov al,03h
        int 10h

lbl1:
    mov [CanClick],1
lop:
        ;mov ah,0ch
        ;mov al,07h
        ;int 21h    
        ;in al,060h
        mov ah,0
        int 16h

        cmp ah,RightDown
        je lbl2

        cmp ah,RightUP
        je lbl1

        cmp ah,EscKey
        je lbl1
jmp lop

lbl2:
    cmp [CanClick],1
    jne lop

    mov ah,0eh
    mov al,97
    mov BH,0
    mov BL,0
    int 10h
    mov [CanClick],0
jmp lop

Exit:
        mov ax,04c00h
        int 21h

End Start
当您按下右键时,使用上述代码,DOS首先在
AL
寄存器中返回一个零,并希望您再次调用函数07h,以接收实际扫描代码,该扫描代码将为4Dh或77(十进制)。您对读取端口60h的使用可以被视为第二次调用,但它不会返回您所期望的任何键盘释放代码,如11001101b

第二个程序中的BIOS.WaitKeystroke函数也不会返回键盘释放代码


例如,使用端口60h可以帮助您查看

您是否尝试单步执行调试器并查看该按键在AL中实际得到的值?如果没有,就这样做。此外,您的分支过于复杂。只需将
lbl2
放在与
lop
相同的位置,而不是跳到另一个
jmp
。布置你的分支,这样你就不需要那么多的总分支,尤其是无条件分支。更容易理解和调试。我尝试签入一个调试器,但没有成功。你有什么办法解决它吗?仔细检查
RightUP
的定义和其他常量,它们与调试器在AL中看到的内容相匹配。将通过调试器找到的信息添加到问题中。AL==RightDown正在执行
je lbl2
,而其他人则跳转到
lbl1
。这就是你想要的区别吗。甚至不清楚你说的是什么正在发生,还是你想发生什么。看,RightUP的定义是正确的,问题是我不明白为什么这三个推荐(mov-ah,0ch-mov-al,07h-int-21h)不起作用,没有它们。。。。。。对于工作,我的意思是当RightUp按下跳转到ExitOk时,我想我可能理解你现在说的话。我不知道答案,但使用调试器查看在有/没有该代码的情况下在寄存器中得到的值。我想知道在程序启动时,键盘缓冲区中是否有释放返回键的事件?在中的
会读到吗?你最后的评论比问题中的文本解释得稍微好一点,所以你应该编辑它,以确保清楚这两种情况下发生了什么,以及你希望发生什么。
    IDEAL

MODEL large

STACK 256

    RightUP          equ 11001101b
    RightDown        equ 77
    EscKey           equ 1

DATASEG

    CanClick db 1

CODESEG   

Start:

        mov ax, @data
        mov ds, ax

        mov ah,00h
        mov al,03h
        int 10h

lbl1:
    mov [CanClick],1
lop:
        ;mov ah,0ch
        ;mov al,07h
        ;int 21h    
        ;in al,060h
        mov ah,0
        int 16h

        cmp ah,RightDown
        je lbl2

        cmp ah,RightUP
        je lbl1

        cmp ah,EscKey
        je lbl1
jmp lop

lbl2:
    cmp [CanClick],1
    jne lop

    mov ah,0eh
    mov al,97
    mov BH,0
    mov BL,0
    int 10h
    mov [CanClick],0
jmp lop

Exit:
        mov ax,04c00h
        int 21h

End Start
mov ah,0ch
mov al,07h
int 21h 
in ax,060h
 mov ah,0
 int 16h