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

时间:2013-02-08 17:16:35

标签: 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

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

(spim) load "echo.asm"
(spim) run
hheelllloo

但我得到了这个:

(spim) load "echo.asm"
(spim) run
hello [I press Enter here]
hello

有什么想法吗? 提前谢谢。

1 个答案:

答案 0 :(得分:4)

这是因为默认情况下,终端是线路缓冲的。在读取整行之前,终端的读取将不会返回。这是为了允许像退格这样的东西使用不使用专门的终端处理库的程序(例如ncurses,readline)。您可以通过运行命令

来禁用此缓冲
stty -icanon

然后运行spim,程序将在输入字符时回显它们。完成后,您应该使用

重新启用缓冲输入
stty icanon

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