assembly MARS MIPS CLI在调用read char syscall时不接受换行符,而是返回错误

3okqufwl  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(84)

我有下面的程序,它读取一个字符并打印出来:

.macro print_char
    li $v0, 11
    lbu $a0, ($s0)
    syscall
.end_macro
 
.macro read_char
    li $v0, 12
    syscall
    sb $v0, ($s0)
.end_macro
 
.text
    # Initialize registers.
    li $s0, 0x10010000
    li $t0, 0x0
 
    read_char
    print_char

它在MARS MIPS IDE中工作,我可以按Enter键,模拟器将打印一个换行符。但是当我尝试使用MARS MIPS CLI做同样的事情时,它返回invalid char input (syscall 12)错误。为什么会这样?

hm2xizp9

hm2xizp91#

下面的代码包含一个异常处理程序,它处理syscall#12错误输入的异常,然后将0xc更改为0xd;前进异常pc(epc)并恢复用户代码:

.macro print_char
    li $v0, 11
    lbu $a0, ($s0)
    syscall
.end_macro
 
.macro read_char
    li $v0, 12
    syscall
    sb $v0, ($s0)
.end_macro
 
.text
    # Initialize registers.
    li $s0, 0x10010000
    li $t0, 0x0
 
    read_char
    print_char
    
    li $v0, 10
    syscall             # terminate program
    

.ktext 0x80000180       # install this next code as kernel exception handler
    li $v0, 0xd         # change 0xc in $v0 to 0xd
    mfc0 $k1, $14       # fetch epc (address of the offending syscall)
    addi $k1, $k1, 4    # advance to next instruction
    mtc0 $k1, $14       # update epc
    eret                # resume user code

请注意,这个处理程序绝对没有错误检查-特别是,它假设调用它的唯一原因是处理syscall#12错误。

相关问题