我对MIPS很陌生,并试图了解以下两个汇编指令之间的差异和目的。在程序的开头我声明:
.data
msg: .word msg_data
msg_data: .asciiz "Hello world"
所以在主要功能中,以下两个作品都有,但每个作品的目的是什么?
la $t0, msg
lw $a0, 0($t0)
li $v0, 4
syscall
另一个是:
la $a0, msg_data
li $v0, 4
syscall
答案 0 :(得分:0)
在MIPS上,指向数据的指针大小为.word
,通常为32位。此外,MIPS要求您的data is aligned to certain addresses取决于数据本身的类型(即大小)。
首先,让我们看一下您在程序.data
部分中声明的指针和数据:
msg: .word msg_data ; Declare a pointer: use the address of msg_data as value for msg
msg_data: .asciiz "Hello world" ; Declare a zero-terminated string in memory
msg
和msg_data
可以被视为您的数据的标签或符号名称,您可以在代码中使用这些标签来引用对你的数据。
现在有两种不同的方法可以将指针加载到字符串中。第一种方式是间接的:
la $t0, msg ; Load address of .word 'msg' into $t0
lw $a0, 0($t0) ; Load pointer from address in $t0+0, this loads the pointer stored in 'msg' which is the address of 'msg_data'
第二种方法是直接加载字符串的地址:
la $a0, msg_data ; Load the address of 'msg_data' into $a0
您还可以查看la
pseudo-instruction,lui/ori
指令对的宏,用于将32位立即值加载到寄存器中。该直接值是您的地址标签的地址,结果为la
,即加载地址。