assembly - 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
?
谢谢
解决方案
我必须加载每个字节才能打印 .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
指令不允许初始化——而.asciiz
and.byte
指令允许。
MARS & QtSpim 允许从控制台或文件中读取字符串。从控制台读取字符串时,系统调用不会给您字符串的长度,因此strlen
需要使用 -type 操作来查找此类字符串的长度。我们能做的最好的事情就是在需要时计算长度,并在需要时将该长度存储在程序中的多个位置。
从文件读取时,系统调用确实返回一个长度,因此如果系统调用返回的长度strlen
在程序需要时保留,则不需要该操作。
推荐阅读
- go - 有没有办法生成一个充满特定字符的字节片?
- phpstorm - PhpStorm 上传到服务器和部署未出现在新项目的上下文菜单中
- python - Groupby 级别熊猫
- java - JAXB Marshaller 和输出 XML 的格式
- java - 从 db JdbcTemplate 检索超过 200 MB 的大数据
- c# - 基于基类属性的派生类型
- python - For循环和程序,用于提取以特定字符开头的单词并将它们打印在单个文件行中
- c# - c#让父类方法使用子类变量
- javascript - 不知道如何将输入文件更改为静态文件夹文件
- ffmpeg - ffmpeg 转置源和缩放水印以适应不同的视频大小