C++:使用程序集询问用户输入而不按回车? [复制]

Posted

技术标签:

【中文标题】C++:使用程序集询问用户输入而不按回车? [复制]【英文标题】:C++ : Ask user input without pressing enter using assembly? [duplicate] 【发布时间】:2017-04-17 19:21:11 【问题描述】:

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

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

我已经转向使用一些内联汇编从标准输入中获取一个字符。 我使用的代码如下:

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&T 语法的内联 ASM 的特定编译器选项吗?

我的代码是否会达到我的预期?

附: : 如果它对你有任何帮助,我正在 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

【问题讨论】:

在 AT&T 语法中,像 0x21 这样的立即数需要在前面加上 $Int $0x21。但我更担心的是,这不会作为用户应用程序在 Linux 或 OSX 等操作系统下运行(你似乎在 OSX 上)。int $0x21 通常是 DOS 中断。你打算在什么环境下运行这个程序?操作系统开发了吗? 奇怪,kbhit() + getch() 应该够了 其他问题。对于内联扩展 asm,所有寄存器名称都必须有 %% 而不仅仅是 %。所以%rcx 应该是%%rcx 等等。您也可以将一个64 位寄存器移动到一个8 位寄存器,您正在尝试使用MOV %rcx, %r8b 您不能在 Mac OS 上使用 MS-DOS API。要消除用户在程序看到用户输入之前按 Enter 键的需要,您需要使用 tcsetattr 更改为非规范输入处理。您不需要为此使用程序集。请参阅developer.apple.com/legacy/library/documentation/Darwin/… 或者,您可能希望使用具有更简单接口的 curses 库来处理此类事情。 如果您正在寻找 OS/X 和 Linux 解决方案,您可能希望查看这个 SO 答案:***.com/a/7469410/3857942。它使用termios 功能修改终端io 设置以创建getch 类似功能。 【参考方案1】:

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

基本上是对this线程稍作调整,使其在g++编译器下用C++编译。

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

【讨论】:

以上是关于C++:使用程序集询问用户输入而不按回车? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从键盘读取输入而不按回车[重复]

jquery终端提交命令而不按回车

C++,怎么让程序模拟用户输入指令,并自行回车以执行该指令(不是写个输出函数只做样子)?

从 UITextField 保存文本数据而不按其他键(需要帮助)

TextArea 如何用js判断每11个字符就让他换行,有回车的效果,假如我一直输入不按回车也会判断有多少行

制作一个随机询问用户5个问题而不重复问题的程序[重复]