汇编 MIPS:由 syscall 12 服务提供的将字符粘在一起

Assembly MIPS: Sticking characters together given by syscall 12 service

我想做一个程序,读取几个字符,没有特别限制,只是按回车键(我发现回车键的ascii码是13,如果我错了请纠正我)并且有点"stitch" 他们在一起。

例如,如果用户输入字符“3”、“4”、“5”,程序应显示整数“345”。所以,每个字符应该匹配一位。

我试过如下循环:

.text
.globl main
main:

add $t0, $zero, $zero       #counter

loop:
    li  $v0, 12         #v0 = the character that was read
    syscall
    subi    $v0, $v0, 48        

#from the register column, I found that after the syscalls, the v0
#register always adds 48 to the given character

    beq $v0, 13, exit       #if Enter is given, exit from the loop

    move    $t1, $v0   #move the character to t1

    sb  $t1, ($t0)      #store the character to t0

    addiu   $t0, $t0, 1     #point to the next spot of the t0

j loop
exit:

add $a0, $t0, $zero         #load the contents of t0 to a0

li  $v0, 1                #print the result
syscall

li  $v0, 10
syscall

由于 "store byte" 命令,在我笨拙的代码中显示的错误是 "Runtime exception at 0x00400020: address out of range 0x00000000"。

我应该给一个补偿吗?

整个 "store byte" 事情从根本上是错误的吗?

每次都需要given_character-48吗?

我该怎么办?

你的代码和你如何理解事物的问题很少,一个是:

subi    $v0, $v0, 48

这会将 ASCII 数字从 '0' - '9' 个字符转换为值 0-9,以便您稍后可以将其用作数字进行计算。

因为你想"stitch it together"为字符串,你不想将ASCII字符转换成数字,保持原样。


另一个是:

sb  $t1, ($t0)

这从寄存器 t1 中获取值,并使用 "write it at address t0" 命令联系存储芯片。但是 t0 为零,内存地址 0x00000000 不可用于写入。

你不能在计算机中保存任意大小的数据,内存是有限的,所以你必须决定你想要保存的最大字符串(加上你以未压缩的形式保存它,所以保留的字节数因为您的字符串直接将您的字符串限制为相同数量的 ASCII 字符减一,最后一个保留用于字符串的空终止符)。

为结果分配一些内存缓冲区(在数据段),然后先la $t0,result_buffer

然后在最后一个字符之后(或在保留 space 之外的 运行 之后,所以如果你想创建正确的安全应用程序,你还应该有一些计数器来检查输入字符串的最大长度) 在它后面再存储一个字节,值为零,那么结果你将得到以 null 结尾的字符串。


并且可以使用函数 li $v0, 4 输出(并且 a0 应该再次包含 result_buffer 的地址)。 1 用于打印整数,您不是从输入构建整数。


如果你想从输入构建整数,那么[无需编码你自己的非本地长整数支持]你被限制为 32b 整数(你可以在输入期间将其存储到一些备用寄存器中,所以你不需要不需要在内存中保留space,只需在每一步都做result = 10 * result + input),这样你就可以输入最大数字231-1(如果"print integer" 适用于有符号数)。


编辑:当然 SPIM/MARS 有内置的调试器,你应该对你的代码逐个指令来查看它实际在做什么。尽管如果您没有意识到您正在从该错误消息写入 0x00000000,调试它并使用目标 t0 = 0 观看 sb 可能也不会响铃。

不过你至少应该尝试一下。您越早了解调试器及其显示机器的方式,您就越早能够自己编写代码。 (SO 不是调试服务,您的质量问题通常会被否决并关闭)。