这是代码:
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
它有什么作用?我只知道它连接到定时器中断。什么在0x61
和0x20
?
附近可能有in al, 0x60
指示。
端口 0x60 和 0x61 与 PC 中的键盘控制器通信。端口 0x60 包含按下的键,而 0x61 包含状态位。
切换状态端口的高位表示您已获得密钥并想要下一个。
端口 0x20 是中断控制器,您可以在此处确认您已处理了中断。
这与 C++ 无关。它是纯粹的 x86 汇编语言,带有编译器特定的包装器,以允许在编译器中进行内联汇编。编译器可以是 Turbo C、Turbo Pascal 或 Microsoft 编译器或任何遵循 Borland/Microsoft 内联汇编约定的编译器...
这是 IBM PC(和克隆)代码
端口 0x61 与使用 PIT(可编程间隔定时器)的 PC 扬声器相关
端口 0x20 与 PIC(可编程中断控制器)有关
寻找用 PC 扬声器(不是声卡)播放声音的代码,你会发现类似的代码。
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.
}