read_char 系统调用在命令行 spim 中无法正常工作

scr*_*lli 1 assembly mips system-calls spim

我用 MIPS 汇编写了这个简单的程序:

.data
.text
main:
li $v0, 12 # read_char
syscall
move $a0, $v0
li $v0, 11 # print_char
syscall
j main # repeat forever
Run Code Online (Sandbox Code Playgroud)

当我在 QtSpim 中运行它时,它工作正常:它从控制台获取一个字符,并在输入后立即打印它,然后重复。但是,QtSpim 的控制台不允许我为我的程序粘贴输入(我可以这样做,但不会被读取)。所以我尝试在spim for Linux(命令行)版本 9.1.8 中运行它。它可以工作,但是当输入一个字符时它不会立即做出反应;它总是等待换行符,即使在没有剪切和粘贴的情况下输入字符也是如此。所以我希望这种行为:

(spim) load "echo.asm"
(spim) run
hheelllloo
Run Code Online (Sandbox Code Playgroud)

但我得到了这个:

(spim) load "echo.asm"
(spim) run
hello [I press Enter here]
hello
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢。

Geo*_*edy 5

这是因为终端在默认情况下是行缓冲的。在读取整行之前,不会返回来自终端的读取。这是为了允许诸如退格键之类的东西与不使用专门的终端处理库(例如 ncurses、readline)的程序一起使用。您可以通过运行以下命令禁用此缓冲

stty -icanon
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​spim,程序将在输入字符时进行回显。完成后,您应该重新启用缓冲输入

stty icanon
Run Code Online (Sandbox Code Playgroud)

因为无缓冲模式可能会导致其他程序出现问题。