如何将整个单词加载到寄存器中以便我可以在MIPS中测试我的函数?

时间:2012-03-02 02:08:41

标签: assembly mips mips32

我试图用mips测试我的字符串长度函数。我想用像“快乐”这样的词来测试它,或者像那样的东西......但是我不知道该怎么做。如果将它打印到屏幕上也会很棒。

这是我的代码:

.globl StringLength

StringLength:
li $t0,0

StringLengthLoop:
lb $t1,0($a0)
beq $t1,$zero, StringLengthExit
add $a0,$a0,1
add $t0,$t0,1
j StringLengthLoop

StringLengthExit:
move $v0, $t0
jr $ra

1 个答案:

答案 0 :(得分:1)

要打印到控制台,您将使用系统中可用的许多system calls之一。 (确切的系统调用值取决于您的系统/仿真器。)

字符串可以放在可执行文件的数据段中,并带有一个标签,可用于获取字符串开头的地址。 “.ascii”表示非空终止字符串,而“.asciiz”表示以空字符结尾的字符串。

这是一个关于如何打印字符串和整数值的简单示例:

        .data
str:    .asciiz "This is a string\n"  # a null-terminated string to be printed.
        .align 2                      # make sure it's aligned to word boundary
int:    .word 1234                    # some number

        .text
        .global main
main:
        la    $a0, str        # load the address of the start of our string
        li    $v0, 4          # syscall 4 usually means print string
        syscall

        la    $t0, int        # the address of our number
        lw    $a0, 0($t0)     # get our number
        li    $v0, 1          # syscall 1 usually means print int
        syscall

        li    $v0, 10         # syscall 10 usually means exit
        syscall               # exit.

更实际的例子:

如果我要使用你的函数,它将看起来像这样:(假设它遵循$ aN中参数的标准调用约定并返回$ vN中的值。确实如此。)

        .data
str:    .asciiz "This is an example"

        .text
        .global main
main:
        la    $a0, str        # first argument, a pointer to the string
        jal   StringLength    # call StringLength(str)

        # print the length
        add   $a0, $zero, $v0
        li    $v0, 1
        syscall

        li    $v0, 10
        syscall               # exit

大多数模拟器使用相同的系统调用。 Here is a list of system calls for the MARS simulator

最后注意:如果您打算使用lw指令加载一个值,请确保告诉汇编器将它与字边界(.align 2)对齐,就像我对第一个示例所做的那样。