首页 > 解决方案 > MIPS 程序集,.space 数据

问题描述

对于家庭作业。我尝试.space 11使用循环打印数据并使用加载每个字节

lb $a0, data($t9)

我是否必须加载每个字节才能打印 . space项目还是有更好的方法?

loop2:
        lbu $t9, newNum($t8)
        
        li $v0, 11
            move $a0, $t9
            syscall
                
        addi $t8, $t8, 1
            lbu $t9, newNum($t8)
            bnez $t9, loop2
        

旁注:是否有另一种方法来检测 a 的结束.space

谢谢

标签: assemblymips

解决方案


我必须加载每个字节才能打印 .space 项目还是有更好的方法?

如果将空格格式化为 C 字符串,则可以使用“打印字符串”系统调用,4. 格式化为 C 字符串意味着有一个最终的空字符,看起来你已经有了。

顺便说一句,您的循环假定字符串至少有一个字符(其长度 >= 1),这通常不是真的(某些字符串的长度为 0),但在您的程序中可能如此。

旁注:是否有另一种方法来检测 .space 的结尾?

这取决于您如何使用空间。如果它是编译时常量字符串的固定缓冲区,则可以取两个标签之间的差异:

myspace:    .space 11
myspaceEnd:

...
la $t0, myspaceEnd
la $t1, myspace
sub $t3, $t0, $t1

这会将 .space 的大小放入$t3. 一些但不是所有的汇编器都允许常量表达式,例如myspaceEnd-myspace,因为这是一个编译常量,它会转换为一个运行时常量立即值,我们可以放弃编译时间常量的运行时计算(上述 3 条指令)。

但是,这些计算空间的静态/编译时大小。如果您将空间用作缓冲区:在运行时在那里放置一个字符串,其长度仅在运行时动态/已知,这不会计算该动态长度,它只会给出空间的静态长度(即最大允许长度)。

您可能正在使用该空间作为运行时字符串的缓冲区,该字符串可以是任意长度,因为该.space指令不允许初始化——而.asciizand.byte指令允许。

MARS & QtSpim 允许从控制台或文件中读取字符串。从控制台读取字符串时,系统调用不会给您字符串的长度,因此strlen需要使用 -type 操作来查找此类字符串的长度。我们能做的最好的事情就是在需要时计算长度,并在需要时将该长度存储在程序中的多个位置。

从文件读取时,系统调用确实返回一个长度,因此如果系统调用返回的长度strlen在程序需要时保留,则不需要该操作。


推荐阅读