5

这是代码:

push ax
in al, 0x61
or al, 0x80  ; 10000000b
out 0x61, al
and al, 0x7F ; 01111111b
out 0x61, al
mov al, 0x20
out 0x20, al
pop ax

它有什么作用?我只知道它连接到定时器中断。什么在0x610x20

4

3 回答 3

4

附近可能有in al, 0x60指示。

端口 0x60 和 0x61 与 PC 中的键盘控制器通信。端口 0x60 包含按下的键,而 0x61 包含状态位。

切换状态端口的高位表示您已获得密钥并想要下一个。

端口 0x20 是中断控制器,您可以在此处确认您已处理了中断。

于 2013-02-13T12:46:41.173 回答
2

这与 C++ 无关。它是纯粹的 x86 汇编语言,带有编译器特定的包装器,以允许在编译器中进行内联汇编。编译器可以是 Turbo C、Turbo Pascal 或 Microsoft 编译器或任何遵循 Borland/Microsoft 内联汇编约定的编译器...

这是 IBM PC(和克隆)代码

端口 0x61 与使用 PIT(可编程间隔定时器)的 PC 扬声器相关

端口 0x20 与 PIC(可编程中断控制器)有关

寻找用 PC 扬声器(不是声卡)播放声音的代码,你会发现类似的代码。

于 2013-02-13T07:55:27.147 回答
-1
asm {
    push ax            //normal push opr
    in al, 0x61        // in for input. 0x61 is hexadecimal number. just like 14,15 as in decimal.in c++ we use 0x

    or al, 0x80 // 10000000b  //or operation b/w lower butes of accumulator and 0x80
    out 0x61, al  //output 
    and al, 0x7F // 01111111b  //and opr b/w al and 0x7f
    out 0x61, al  //
    mov al, 0x20   //move 0x20 into  lower bytes of accumulator(al) 
    out 0x20, al   
    pop ax      //remove accumulator from stack.
    }
于 2013-02-13T07:49:56.183 回答