我在汇编语言,C++中的x86,我需要知道在汇编语言而不是C++语言中的getch等价物,因为我不想使用C++编程语言中的任何函数。getch等效于汇编语言
我在网上找到了代码,但它将给定的值保存到一个变量中并用C++创建。我只想使用该功能来停止程序,直到按下任何键。我不必在进一步的编程中使用输入的键值。
我在汇编语言,C++中的x86,我需要知道在汇编语言而不是C++语言中的getch等价物,因为我不想使用C++编程语言中的任何函数。getch等效于汇编语言
我在网上找到了代码,但它将给定的值保存到一个变量中并用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
,它更快。还有一个共享库被映射到每个进程中,根据你的硬件支持什么来抽象系统调用接口。 (linux-gate.so
。)
作为一个品味问题,我会反对使用汇编语言进行系统调用的方法。从C调用它非常简单。调用汇编代码(或者生成内联汇编),以确保需要汇编语言。但总的来说,对于大多数实际问题,您会发现最好不要浪费时间与装配中的操作系统接口进行交谈。 (除非这是一个学习练习,在这种情况下,我全力以赴。)
更新:您提到作为@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.
这可能不是你正在寻找的,但为什么不在编译C++代码后查看汇编列表?大多数编译器都有asm输出作为选项。
我必须将代码写入mbr。所以它必须小于466字节。我认为在程序集中可以最小化尺寸 –
有没有真正的这样的事情。 `getch'只是标准C RTL的一部分;它是库中围绕一个或多个系统调用的一些C代码,具体取决于您正在运行的系统。没有将处理器指令定义为“从某个用户正在输入的地方读取字符”。您可以学习从汇编中调用CRTL例程,或者您可以研究相应的系统调用并学会调用它们。
看看你以前的问题,我假设这是你的引导装载程序。在这种情况下,您没有任何可用的OS系统调用,因此您必须依赖BIOS。特别是,可以使用int 16h
访问IBM兼容PC上的基本BIOS键盘服务。
正确的...我用它作为引导装载程序。我只用它来让程序停止,直到按下键 –
对于引导加载程序,您不应该使用getch之类的调用。如果你需要一次处理一个字符的缓冲区,那么写一个逐步循环的循环,一次一个字节。如果您绝对必须与控制台进行交互,请编写一个C++控制台程序,在调试器中逐步完成,并查看运行时库执行的代码。它可能是一个中断指令,并可能在中断指令之前设置参数。在PC上,中断将调用BIOS进行实际的控制台IO。
在您的程序需要什么操作系统下工作?你在用什么汇编语言? – Staven
在DOS /引导加载程序代码中,可以使用[INT 16h,AH = 00h](http://www.ctyme。com/intr/rb-1754.htm) – user786653