Assembly read_char syscall在命令行spim中工作不正常

Assembly read_char syscall在命令行spim中工作不正常,assembly,mips,system-calls,spim,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的控制台不允许我粘贴程序的输入(我可以这样做,但它不会被读取)。 所以我尝试在spim for Linux

我在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的控制台不允许我粘贴程序的输入(我可以这样做,但它不会被读取)。 所以我尝试在spim for Linux(命令行)版本9.1.8中运行它。 它可以工作,但在输入角色时不会立即做出反应;它总是等待换行,即使输入字符时没有剪切和粘贴。所以我期待这种行为:

(spim) load "echo.asm"
(spim) run
hheelllloo
但我得到的是这个:

(spim) load "echo.asm"
(spim) run
hello [I press Enter here]
hello
有什么想法吗?
提前感谢。

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

stty -icanon
然后运行spim,程序将在键入字符时回显这些字符。完成后,应使用重新启用缓冲输入

stty icanon

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

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

stty -icanon
然后运行spim,程序将在键入字符时回显这些字符。完成后,应使用重新启用缓冲输入

stty icanon

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

谢谢!非常有用的答案。谢谢!非常有用的答案。