2011-09-25 90 views
4

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

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

+3

在您的程序需要什么操作系统下工作?你在用什么汇编语言? – Staven

+1

在DOS /引导加载程序代码中,可以使用[INT 16h,AH = 00h](http://www.ctyme。com/intr/rb-1754.htm) – user786653

回答

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调用它非常简单。调用汇编代码(或者生成内联汇编),以确保需要汇编语言。但总的来说,对于大多数实际问题,您会发现最好不要浪费时间与装配中的操作系统接口进行交谈。 (除非这是一个学习练习,在这种情况下,我全力以赴。)

更新:您提到作为@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. 
1

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

+0

我必须将代码写入mbr。所以它必须小于466字节。我认为在程序集中可以最小化尺寸 –

0

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

3

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

+0

正确的...我用它作为引导装载程序。我只用它来让程序停止,直到按下键 –

0

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