我想创建一个菜单,用户只需按一个按钮,然后从屏幕上的选项中进行选择。
我已尝试使用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
答案 0 :(得分:1)
好的,找到了一个不需要汇编代码的解决方案。
它基本上是this线程的轻微调整,以便在g ++编译器下用C ++编译。
只需要在代码中更改名为new
的变量的名称,使其在g ++下编译。感谢您的帮助,我希望这也可以回答别人的问题。