Assembly MIPS程序集-标签值修改

Assembly MIPS程序集-标签值修改,assembly,label,mips,post-increment,Assembly,Label,Mips,Post Increment,在MIPS中,是否可以在执行期间更改标签的值,或创建具有特定值的标签 我这样问是因为当使用指令lw$a0,label($s0)时,每次循环时,我都想增加label+4的值,指示数组的新内存地址。我知道我可以做lw$a0,label+4($s0),但label的新值不会被存储 有什么建议吗 否。在MIPS中,取消引用时必须在括号外有一个常量(措词不当)。如果可以更改标签的值,那么它将不再是常量。为了解决这个问题,你可以做如下的事情 la $t1, label #t1 holds

在MIPS中,是否可以在执行期间更改标签的值,或创建具有特定值的标签

我这样问是因为当使用指令
lw$a0,label($s0)
时,每次循环时,我都想增加label+4的值,指示数组的新内存地址。我知道我可以做
lw$a0,label+4($s0)
,但label的新值不会被存储


有什么建议吗

否。在MIPS中,取消引用时必须在括号外有一个常量(措词不当)。如果可以更改标签的值,那么它将不再是常量。为了解决这个问题,你可以做如下的事情

la $t1, label          #t1 holds address of label
add $t1, $t1, $s0      #t1 now holds address of label + s0 offset
lw $a0, 0($t1)         #load word from t1's location

addi $t1, $t1, 4       #t1 was incremented by 4 bytes now
lw $a0, 0($t1)         #load the next word
如果s0始终为非负,则建议使用addu


编辑:不能更改标签的值。它只是内存中某个位置的别名。在文本部分,它是以下指令位置的别名。在“数据”部分中,它是内存中以下空格位置的别名。

否。在MIPS中,取消引用时括号外必须有一个常量(措词不当)。如果可以更改标签的值,那么它将不再是常量。为了解决这个问题,你可以做如下的事情

la $t1, label          #t1 holds address of label
add $t1, $t1, $s0      #t1 now holds address of label + s0 offset
lw $a0, 0($t1)         #load word from t1's location

addi $t1, $t1, 4       #t1 was incremented by 4 bytes now
lw $a0, 0($t1)         #load the next word
如果s0始终为非负,则建议使用addu


编辑:不能更改标签的值。它只是内存中某个位置的别名。在文本部分,它是以下指令位置的别名。在数据部分,它是以下空间内存中位置的别名。

我确实认为应该澄清答案并重新回答“是”。我认为“地址”和“价值”之间存在误解和混淆

我目前有一个数组,我想导航它进行冒泡排序。为了知道何时停止,我需要一个索引值来与持久的数组长度进行比较

我创建了
arrayLength
标签,在看到这个答案上的“否”后,我被困了4个小时,试图用用户提供的值更改
arrayLength
的值,直到我记起store word
sw

从技术上讲,是的,您不能更改数组的基址,但可以读取后面的下一个地址

以下是获取数组长度以使用读取整数在数组上迭代的方法:

li $v0, 5
syscall

.data
.word
.assign 2
arrayLength: 0

.text
sw $v0, arrayLength
lw $t0, arrayLength
此时,由用户定义的
arraylelength
取自
$v0
,放入
arraylelength
,然后存储在
arraylelength
中的
$t0
,并可用于在数组上进行比较和迭代

换句话说,为了回答您的问题,
arrayLength
中0的值被覆盖(例如,让我们假设为10)。所以,是的,你可以全天覆盖标签。您不能做的是修改该标签的地址

据我所知,创建标签后,会将其分配给一个地址,并根据您识别标签的方式分配以下地址(
.byte
.half
.word
,等等)。从这里开始,除非有办法删除标签并重新创建,否则不能修改地址。这将导致内存管理出现很多问题,并且毫无理由地效率低下且非常复杂


现在继续。请注意,如果您不知道,可以使用
.space[number]
预定义数组。我认为默认情况下每个值是32位,所以是4个字节(一个字)。因此,如果您愿意,比如说5个项目(单词),您可以执行5 x 4,因此
.space 20
可以将5个单词存储到数组中

在这种情况下,我们现在假设已经从
10
arrayLength
中创建并填充了
array
,并且我们正在打印每个索引处的值,如下所示:

add $t1, $zero, $zero  #index value 0, our base address index

loop:

li $v0, 1
lw $a0, array($t1)
syscall

addi $t1, $t1, 4 #increase the address index by 4 (each index is 4 bytes long)
addi $t3, 1, $zero #increase the index identifier by 1
blt $t3, arrayLength, loop

#exit
所以地址索引(
$t1
)是文本地址位置。每个索引,即:字,长度为4字节(32位)。因此,我们的$t3是一个标识符(例如),“嘿,我们在10的索引位置2,”但实际上,我们在地址位置
array+8
array+40

您可能会丢弃索引标识符,只需将$t3作为
arrayLength x 4
的值,然后执行
blt$t1、$t3、loop


希望这有帮助。

我确实认为应该澄清答案,并重新回答“是”。我认为“地址”和“价值”之间存在误解和混淆

我目前有一个数组,我想导航它进行冒泡排序。为了知道何时停止,我需要一个索引值来与持久的数组长度进行比较

我创建了
arrayLength
标签,在看到这个答案上的“否”后,我被困了4个小时,试图用用户提供的值更改
arrayLength
的值,直到我记起store word
sw

从技术上讲,是的,您不能更改数组的基址,但可以读取后面的下一个地址

以下是获取数组长度以使用读取整数在数组上迭代的方法:

li $v0, 5
syscall

.data
.word
.assign 2
arrayLength: 0

.text
sw $v0, arrayLength
lw $t0, arrayLength
此时,由用户定义的
arraylelength
取自
$v0
,放入
arraylelength
,然后存储在
arraylelength
中的
$t0
,并可用于在数组上进行比较和迭代

换句话说,为了回答您的问题,
arrayLength
中0的值被覆盖(例如,让我们假设为10)。所以,是的,你可以全天覆盖标签。您不能做的是修改该标签的地址

据我所知,创建标签后,会将其分配给一个地址,并根据您识别标签的方式分配以下地址(
.byte
.half
.word
,等等)。从这里开始,除非有某种方法可以删除标签并重新创建它,否则不能修改标签