0

我想知道如何在汇编中从键盘读取整数。我正在使用 Linux/x86 IA-32 架构和 GCC/GAS(GNU 汇编程序)。到目前为止,我发现的示例适用于 NASM 或其他一些与 Windows/DOS 相关的编译器。

我听说它与“int 16h”中断有关,但我不知道它是如何工作的(它需要参数吗?结果进入 %eax 或其任何虚拟寄存器 [AX, AH, AL] ?)。

在此先感谢,弗莱森。

:D

4

3 回答 3

2

简单的答案是您不是从键盘读取整数,而是从键盘读取字符。您也不会将整数打印到屏幕上 - 您打印字符。您将需要例程来转换“ascii-to-integer”和“integer-to-ascii”。您可以为一个“只调用 scanf”,而为另一个“只调用 printf”。如果用户表现良好并将输入限制为代表十进制数字的字符,“scanf”可以正常工作,但很难摆脱输入的任何“垃圾”!“printf”还不错。

虽然我是 Nasm 用户(它适用于 Linux - 不是真正的“Windows/dos 相关”),但我可能在 (G) 中有例程作为语法。如果你想不出来,我会看看能不能找到他们。

正如 Brian 指出的那样,int 16h 是一个 BIOS 中断 - 16 位代码 - 在 Linux 中没有用。

最好的,弗兰克

于 2012-07-18T18:33:07.797 回答
0

如果你的目标是“获得”一个程序,我会完全同意 Basile。如果您的目标是“学习汇编语言”,那么这些其他语言并没有真正的帮助。如果您的目标是了解硬件的细节,您可能需要汇编语言,但 Linux(或任何其他“保护模式”操作系统)将我们与硬件隔离开来,因此您可能想使用笨重的旧 DOS 甚至“编写自己的操作系统”。Flayshon实际上并没有说他的目标是什么,但既然他在这里问,他可能对汇编语言感兴趣......

我们中的一些人患有精神疾病,使我们认为用汇编语言写作很“有趣”。幽默我们!

最好的,弗兰克

于 2012-07-19T13:53:39.310 回答
0

在 2012 年,我不建议在汇编中编写整个程序。只编码最关键的部分(如果你绝对想要一些汇编代码)。编译器比人类优化得更好。因此,对于低级软件使用CC++ ,而使用Ocaml等高级语言。

在 Linux 上,您需要了解linux 内核系统调用的作用,这些都在手册页的第 2 节中记录。您可能至少需要read(2)write(2)(如果只处理应该已经由父进程打开的标准输入和标准输出,例如 shell),并且您可能需要许多其他系统调用(例如open ( 2 )关闭(2))。不要忘记进行缓冲(出于效率目的)。

我强烈建议通过阅读诸如Advanced Unix Programming之类的好书来学习 Linux 系统接口。

Linux Assembly Howto(至少对于 32 位的 x86 Linux)记录了如何在汇编中的机器级别完成系统调用。

于 2012-07-18T20:19:30.847 回答