提问人:Thibault de Villèle 提问时间:4/18/2017 更新时间:4/18/2017 访问量:887
C++:使用程序集在不按回车键的情况下询问用户输入?[复制]
C++ : Ask user input without pressing enter using assembly? [duplicate]
问:
我想创建一个菜单,用户只需按下一个按钮,然后从屏幕上的选项中进行选择。
我试过使用 、 、 甚至 .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++ 将接受输入的寄存器中的内容(在本例中如此)移动到 G++ 将接受输出的寄存器。stdin
我之前做过一些常规汇编(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;
^
但是在我对汇编的介绍中,除了 之外不需要其他任何东西,所以我在这里看不到 G++ 对我的期望。是否有针对内联 ASM 和 AT&T 语法的特定编译器选项?INT 0x21;
我的一段代码甚至会做我所期望的吗?
PS :如果它可以以任何方式帮助您,我正在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赞
Thibault de Villèle
4/18/2017
#1
好的,找到了一个不需要汇编代码的解决方案。
它基本上是对这个线程的轻微调整,使其在 g++ 编译器下以 C++ 编译。
只需要更改代码中调用的变量的名称,使其在 g++ 下编译即可。感谢您的帮助,我希望这也能回答其他人的问题。new
评论
$
Int $0x21
int $0x21
kbhit()
getch()
%%
%
%rcx
%%rcx
MOV %rcx, %r8b
tcsetattr
termios
getch