汇编语言中的getch等价物

时间:2011-09-25 18:11:10

标签: c++ c assembly

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

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

5 个答案:

答案 0 :(得分: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.

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

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

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

答案 1 :(得分:3)

看看你之前的问题,我假设这是你的启动加载器。在这种情况下,您没有任何可用的OS系统调用,因此您必须依赖BIOS。特别是,int 16h可用于访问IBM兼容PC上的基本BIOS键盘服务。

答案 2 :(得分:1)

这可能不是您正在寻找的但是为什么不在编译c ++代码后查看汇编列表?大多数编译器都有asm输出作为选项。

答案 3 :(得分:0)

实际上没有这样的事情。 `getch'只是标准C RTL的一部分;它是围绕一个或多个系统调用的库中的一些C代码,具体取决于您运行的系统。没有定义处理器指令意味着“从某个用户输入的任何地方读取字符”。您可以学习从汇编中调用CRTL例程,或者您可以研究相应的系统调用并学习调用它们。

答案 4 :(得分:0)

对于启动加载程序,您不应该使用getch之类的调用。如果您需要一次处理一个缓冲区,那么请编写一个逐步执行的循环,一次一个字节。如果绝对必须与控制台交互,那么编写一个C ++控制台程序,在调试器中逐步执行它,并查看运行时库执行的代码。它可能是一个中断指令,可能在中断指令之前设置参数。在PC上,中断将调用BIOS来执行实际的控制台IO。

相关问题