做家庭作业。我尝试使用循环打印出.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附注:是否有其他方法可以检测.space的结尾
谢谢
发布于 2020-08-02 22:18:54
是否必须加载每个字节才能打印.space项目,或者是否有更好的方法?
如果您将空格格式化为C字符串,则可以使用"print string“syscall,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指令不允许初始化,而.asciiz和.byte指令允许初始化,所以您很可能将该空间用作运行时字符串的缓冲区,该字符串可以是任何长度。
MARS & QtSpim允许从控制台或文件中读取字符串。当从控制台读取字符串时,syscall不会给出字符串的长度,因此必须使用strlen-type of operation来查找字符串的长度。我们最多只能在需要时计算长度,如果需要,则将该长度存储在程序中的多个位置。
当从文件中读取时,syscall会返回一个长度,所以如果syscall返回的长度被保留到程序需要的时候,就不需要strlen操作了。
https://stackoverflow.com/questions/63213320
复制相似问题