我在汇编语言中使用C ++编写x86,我需要用汇编语言而不是C ++语言来了解getch等价物,因为我不想使用C ++编程语言中的任何函数。
我在网上找到了代码,但是它将给定的值保存到变量并用C ++创建。我想只使用该功能来停止程序,直到按下任何键。我不必在进一步的编程中使用输入的键值。
答案 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。