C ++:在没有使用程序集输入的情况下询问用户输入?

时间:2017-04-17 19:21:11

标签: c++ gcc assembly input g++

我想创建一个菜单,用户只需按一个按钮,然后从屏幕上的选项中进行选择。

我已尝试使用getchar()fgets(stdin)gets(),甚至getch()

我转向使用一些内联汇编从stdin获取一个字符。 我使用的代码如下:

char io::u_i() {
    char a;
    __asm__("INT 0x21;"     // Interruption vector for input
            "MOV %1, %0;"   // Move from stdin to a
            : "=r" (a)      // Output variable
            : "r" (stdin)   // Input variable
            : "%1"          // Obfuscated registers
            );
    return a;
}

如果我已经很好地理解了G ++如何编译汇编,它应该发送一个中断向量(0x21是我在网上找到的一个按键按键),然后移动G ++将在其中的寄存器中的内容输入(在这种情况下为stdin)到G ++将输出的寄存器。

我之前做过一些常规装配(AT& T语法),没有要求用户输入。所以这对我来说是一个新的领域。 G ++告诉我代码中的这一点有错误:

sources/io.cpp:7:11: error: invalid operand for instruction
                __asm__("INT 0x21;"     // Interruption vector for input
                        ^
<inline asm>:1:6: note: instantiated into assembly here
        INT 0x21;MOV %rcx, %r8b;
            ^~~~~
sources/io.cpp:7:11: error: unknown use of instruction mnemonic without a size suffix
                __asm__("INT 0x21;"     // Interruption vector for input
                        ^
<inline asm>:1:11: note: instantiated into assembly here
        INT 0x21;MOV %rcx, %r8b;
                 ^

但在我对装配的介绍中,除了INT 0x21;之外别无其他需要,所以我不知道G ++在这里期待什么。对于具有AT&amp; T语法的内联ASM,是否有特定的编译器选项?

我的代码片段是否会按照我的期望去做?

P.S。 :如果它可以以任何方式帮助你,我在macOS Sierra上编译它,这是g++ --version的输出:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.38)
Target: x86_64-apple-darwin16.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

1 个答案:

答案 0 :(得分:1)

好的,找到了一个不需要汇编代码的解决方案。

它基本上是this线程的轻微调整,以便在g ++编译器下用C ++编译。

只需要在代码中更改名为new的变量的名称,使其在g ++下编译。感谢您的帮助,我希望这也可以回答别人的问题。