Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 单词功能和两种代码之间的差异_Assembly_Mips - Fatal编程技术网

Assembly 单词功能和两种代码之间的差异

Assembly 单词功能和两种代码之间的差异,assembly,mips,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 在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

在MIPS上,指向数据的指针大小为
.word
,通常为32位。此外,MIPS要求根据数据本身的类型(即大小)进行修改

首先,让我们看看您在程序的
.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\u 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

您还可以查看,这是一个针对
lui/ori
指令对的宏,用于将32位立即数加载到寄存器中。该立即值是地址标签的地址,导致
la
,即加载地址。

第一个值从内存加载指针,指针可以指向任何地方,并且可以更改,第二个值直接获取字符串的地址。