mips .word函数和2个代码之间的差异

时间:2016-05-20 16:37:59

标签: assembly mips

我对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

1 个答案:

答案 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

msgmsg_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-instructionlui/ori指令对的宏,用于将32位立即值加载到寄存器中。该直接值是您的地址标签的地址,结果为la,即加载地址