c++ - getch 相当于汇编语言

标签 c++ c assembly

我在汇编语言中编程,在 C++ 中使用 x86,我需要知道汇编语言中的 getch 等价物而不是 C++ 语言,因为我不想使用 C++ 编程语言中的任何函数。

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

最佳答案

这是一个特定于操作系统的问题。例如,如果您使用的是 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.

这实际上是在 x86 Linux 上发出系统调用的更过时的方法,但这是我脑海中浮现的一种方法。还有更快的 sysenter。并且有一个共享库映射到每个进程,它根据您的硬件支持抽象系统调用接口(interface)。 (linux-gate.so。)

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

更新:您在对@Anders K. 的评论中提到您正在写一些东西放在 MBR 上。您应该在问题的前面提到这一点。一种方法是使用 BIOS 调用:我相信您想要的是 int 16h with ah=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.

关于c++ - getch 相当于汇编语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7547506/

相关文章:

assembly - 在 MS-DOS/FreeDOS 应用程序中实现超时

c - 如何在内核中存储单个int值?

c - 避免 C 中的浮点运算

assembly - 不支持的指令 `lidt`

c++ - 包装数据结构

c++ - 如何从 c c++ 中具有多个路径的字符串中提取文件路径?

assembly - MIPS汇编判断硬件I/O中断是否发生?

C++递归线性搜索失败

C++字符串数组作用域问题

c++ - 合并两个 map c++