在汇编中从键盘读取整数(Linux IA-32 x86 gcc gas)

时间:2012-07-18 13:38:28

标签: linux gcc assembly interrupt gas

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

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

提前致谢, Flayshon。

:d

3 个答案:

答案 0 :(得分:2)

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

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

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

最佳, 弗兰克

答案 1 :(得分:0)

2012年,我不建议在汇编时编写整个程序。仅编码最关键的部分(如果您绝对需要一些汇编代码)。编译器优于人类。因此,对于低级软件和更高级别的语言,请使用 C C ++ Ocaml 而不是。

在Linux上,您需要了解linux kernel中记录的system callssection 2 of man pages的角色。您可能至少需要read(2)write(2)(如果只处理 stdin stdout ,它们应该已由父进程打开,例如shell),您可能需要许多其他系统调用(例如open(2)close(2))。不要忘记进行缓冲(为了提高效率)。

我强烈建议您阅读一本好书,例如Advanced Unix Programming

来学习Linux系统界面

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

答案 2 :(得分:0)

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

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

最佳, 弗兰克