汇编语言中的getch等价物

Far*_*man 4 c c++ assembly

我在汇编语言中使用C++编写x86,我需要用汇编语言而不是C++语言来了解getch等价物,因为我不想使用C++编程语言中的任何函数.

我在网上找到了代码,但是它将给定的值保存到变量并用C++创建.我想只使用该功能来停止程序,直到按下任何键.我不必在进一步的编程中使用输入的键值.

asv*_*kau 7

这是一个特定于操作系统的问题.例如,如果您使用的是Linux,则可以发出如下read系统调用:

; Allocate some stack buffer...
sub esp, 256

mov eax, 3      ; 3 = __NR_read from <linux/asm/unistd.h>
mov ebx, 0      ; File descriptor (0 for stdin)
mov ecx, esp    ; Buffer
mov edx, 256    ; Length

int 80h         ; Execute syscall.
Run Code Online (Sandbox Code Playgroud)

这实际上是在x86 Linux上发布系统调用的更为陈旧的方式,但它是我所知道的最重要的一个.还有sysenter哪个更快.并且有一个共享库映射到每个进程,根据您的硬件支持来抽象系统调用接口.(linux-gate.so.)

作为一个品味问题,我会反对使用汇编语言进行系统调用的方法.从C语言中执行此操作要简单得多.调用汇编代码(或生成内联汇编)以获取绝对需要汇编语言的内容.但总的来说,对于大多数实际问题,您会发现最好不要浪费时间与汇编中的OS接口进行交流.(除非这是一次学习练习,在这种情况下我都是为了它.)

更新:你提到了对@Anders K的评论,你正在写一些东西放在MBR上.您应该在问题的前面提到过这一点.一种方法是使用一个BIOS调用:我相信你想要的是int 16hah=0.另一种方法是安装键盘中断处理程序.这是BIOS调用的样子:

xor ah, ah    ; ah = 0
int 16h       ; call BIOS function 16h

; al now contains an ASCII code.
; ah now contians the raw scancode.
Run Code Online (Sandbox Code Playgroud)