描述:
“addi $t0, $t0, 4”这行代码每个周期加上$t0的地址4个字节,但是Array的地址空间是有限的。我认为这会超出范围。
代码如下:
.data
array: .word 1,1,1
tmp: .word 0 : 25
.text
.globl main
main:
la $t0, array
li $t1, 25
loop: lw $t3, 0($t0)
lw $t4, 4($t0)
lw $t5, 8($t0)
add $t2, $t3, $t4
add $t2, $t2, $t5
sw $t2, 12($t0)
addi $t0, $t0, 4
addi $t1, $t1, -1
bgtz $t1, loop
li $v0, 10 # system call for exit
syscall
我希望有人能帮我解释一下代码的用途,并告诉我代码的问题。或者也许它是对的,但我脑子里有一些错误的理解。
该代码正在计算类似于 3-斐波那契数列的内容,将彼此相邻的 3 个元素相加以生成下一个元素。它首先添加
array[0]
、array[1]
和 array[2]
,并将其存储在 array[3]
中。在下一次迭代中,它将添加 array[1]
、array[2]
和 array[3]
,并将结果存储在 array[4]
中。
它使用
tmp
空间(在 array
之后立即声明)来保存结果(以及未来的来源,这使得它与 fib 类似)。
该声明
tmp: .word 0:25
意味着重复0、25次,创建25个用0初始化的存储字。所以,array[3]
的地址与tmp[0]
的地址相同。
在汇编语言中,标签不是变量声明,而是位置声明,即标签具有值,并且它们的值是地址常量。
因此,与其他语言不同,在汇编中我们可以依赖这种并置定位——作者有效地声明了 28 个连续单词的存储,其中前 3 个被初始化(用 1),其余的用 0 初始化.
循环的最后一次迭代将访问
array[24]
、array[25]
和 array[26]
,将它们相加并存储在 array[27]
中。请记住,array[27]
相当于 tmp[24]
,它也是 28 个字块的最后一个元素。