这段MIPS代码有什么问题吗?比如地址超出范围?代码的含义是什么?

问题描述 投票:0回答:1

描述:

“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

我希望有人能帮我解释一下代码的用途,并告诉我代码的问题。或者也许它是对的,但我脑子里有一些错误的理解。

assembly mips memory-address
1个回答
0
投票

该代码正在计算类似于 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 个字块的最后一个元素。

© www.soinside.com 2019 - 2024. All rights reserved.