首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS部件,.space数据

MIPS部件,.space数据
EN

Stack Overflow用户
提问于 2020-08-02 15:08:44
回答 1查看 147关注 0票数 0

做家庭作业。我尝试使用循环打印出.space 11数据,并使用以下命令加载每个字节

代码语言:javascript
复制
lb $a0, data($t9)

是否必须加载每个字节才能打印一个.space项,或者是否有更好的方法?

代码语言:javascript
复制
loop2:
        lbu $t9, newNum($t8)
        
        li $v0, 11
            move $a0, $t9
            syscall
                
        addi $t8, $t8, 1
            lbu $t9, newNum($t8)
            bnez $t9, loop2

附注:是否有其他方法可以检测.space的结尾

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-08-02 22:18:54

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

如果您将空格格式化为C字符串,则可以使用"print string“syscall,4。将其格式化为C字符串意味着有一个最终的空字符,看起来您已经拥有了。

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

旁注:有没有其他方法来检测.space的结尾?

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

代码语言:javascript
复制
myspace:    .space 11
myspaceEnd:

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

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

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

因为.space指令不允许初始化,而.asciiz.byte指令允许初始化,所以您很可能将该空间用作运行时字符串的缓冲区,该字符串可以是任何长度。

MARS & QtSpim允许从控制台或文件中读取字符串。当从控制台读取字符串时,syscall不会给出字符串的长度,因此必须使用strlen-type of operation来查找字符串的长度。我们最多只能在需要时计算长度,如果需要,则将该长度存储在程序中的多个位置。

当从文件中读取时,syscall会返回一个长度,所以如果syscall返回的长度被保留到程序需要的时候,就不需要strlen操作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档