我在这里有两个问题:
1)>第2行发生了什么。' la'伪指令是指加载地址,而不是文字“3444”。应该有一个标签。如何加载文字的地址
2)>如果你用" li $ a0 3444"替换第3行它将3444加载到寄存器#a0而不是地址。输出仍然是相同的。我想问的是,系统调用怎么知道#a0是变量的地址或变量本身。怎么可能打印整数的子程序是否正确工作#a0中存储的参数是地址还是整数值本身。
.text
li $v0 1
>>2 la $a0 3444 # When i replace 3444 literal with the label 'anint' it makes sense and the output of course is the same
syscall
.data
anint: .word 3444
输出:
3444
更新#2:我无法在评论中发布代码,所以......
IF la(加载地址)和li(加载立即数)都转换为相同的指令i-e将文字加载到#a0然后从下面的代码段解释第3行。
.text
li #v0 4
>>3 la #a0 msg #This loads the address of the label 'msg in #a0' not the label itself
syscall
.data
msg: .asciiz "This is a long string that can't be saved in the register!"
答案 0 :(得分:2)
系统调用怎么知道#a0是变量的地址还是变量本身
它没有。 SPIM / MARS中的系统调用1始终在$a0
中打印值。
li $a0,3444
和la $a0,3444
被翻译成相同的内容(某些指令会将值3334
加载到注册表$a0
中,例如ori $a0, $0, 3334
)。< / p>