mips从寄存器中打印字符串

时间:2015-10-02 00:01:36

标签: string assembly printing mips

$ a0 - 用于传递参数

$ t0 - 来自$ a0的临时寄存器lw

这是我的代码

.data
    Str:    .asciiz "please input words "
    input:  .space20

main:
    la $a0, Str   # asciiz loaded at $a0
    li $v0, 4     # print string command
    syscall       # execute print string

    la $a0, input # space for input
    li $a1, 20    # space for input
    li $v0, 8     # read string command
    syscall       # execute reading string

    jal nextStep

nextStep:
    lw $t0, 0($a0) # load first word from address $a0
    move $a0, $t0  # move $t0 -> $a0
    li $v0, 4      # print string command
    syscall        # execute print string

    jr $ra

执行后,我收到一个错误'内存超出界限'在'移动$ a0,$ t0'。

我也试过

and $a0, $t0, $a0

而不是从上面移动线,但我仍然得到相同的错误

我想看到的是使用系统调用打印的$ t0(来自[lw $ t0,0($ a0)])的值。

例如,假设用户总是输入多于一个字的长度,我的期望是当用户输入' 1a2b3c4d5e6f'时,$ t0将包含' 1a2b3c4d' (单词长),那么它只会打印这些值,如果超过则不会显示其余值。

任何帮助都会感激不尽。

1 个答案:

答案 0 :(得分:0)

你确定你不想以通常的人类意义打印第一个单词吗?这是第一个空间的字符串的一部分?在任何情况下,逻辑都是相同的:在你想要结束字符串的位置放一个零字节,因为print string只会到那么远。

另请注意,您不应使用jal来调用nextStep,或者如果必须,请妥善保管返回地址。