Assembly MIPS程序集.空间数据
做家庭作业。 我试图使用循环打印Assembly MIPS程序集.空间数据,assembly,mips,Assembly,Mips,做家庭作业。 我试图使用循环打印.space 11数据,并使用 lb $a0, data($t9) 我必须加载每个字节才能打印。空格项,还是有更好的方法 loop2: lbu $t9, newNum($t8) li $v0, 11 move $a0, $t9 syscall addi $t8, $t8, 1 lbu $t9,
.space 11
数据,并使用
lb $a0, data($t9)
我必须加载每个字节才能打印。空格
项,还是有更好的方法
loop2:
lbu $t9, newNum($t8)
li $v0, 11
move $a0, $t9
syscall
addi $t8, $t8, 1
lbu $t9, newNum($t8)
bnez $t9, loop2
旁注:是否有其他方法检测.space
的结尾
多谢各位
我必须加载每个字节才能打印.space项,还是有更好的方法
loop2:
lbu $t9, newNum($t8)
li $v0, 11
move $a0, $t9
syscall
addi $t8, $t8, 1
lbu $t9, newNum($t8)
bnez $t9, loop2
如果将空间格式化为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允许从控制台或文件中读取字符串。从控制台读取字符串时,系统调用不会给出字符串的长度,因此strlen
-必须执行某种类型的操作才能找到此类字符串的长度。我们能做的最好的事就是在需要时计算长度,如果我们需要的话,在程序中的几个地方存储这个长度
从文件读取时,系统调用确实返回长度,因此如果系统调用返回的长度在程序需要时保留,则无需执行strlen
操作