0

我正在尝试在 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
4

1 回答 1

1

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

可以将一个字符串放在可执行文件的数据段中,并带有一个标签,该标签可用于获取字符串开始的地址。“.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

大多数模拟器使用相同的系统调用。这是 MARS 模拟器的系统调用列表

最后提示:如果您计划使用 lw 指令加载一个值,请确保告诉汇编器将其对齐到字边界(.align 2),就像我在第一个示例中所做的那样。

于 2012-03-02T04:59:27.680 回答