MIPS 中的交换过程

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

enter image description here enter image description here 我在 CO 课程中学习 MIPS,我遇到了 MIPS 中的交换过程。

我想知道如果加载字和存储字只是在预期地址加载和存储“VALUE”,那么我们如何才能实际更改数组地址中的内容。因为我认为 $t0 和 $a0 (这是数组的地址)是不同的。谢谢大家的解释!

assembly mips cpu-architecture swap
1个回答
1
投票

该交换过程在 C: 中执行以下操作:

void swap(int v[], int k) {
    int *p = v + k;          // sll, add
    int temp1 = p[0];        // lw
    int temp2 = p[1];        // lw
    p[0] = temp2;            // sw
    p[1] = temp1;            // sw
}

假设

v
位于 0x10010000(某些 MIPS 内存模型的全局数据内存位置),
k
为 3。

含义/变量 内存地址 储值
v 又名 v[0] 0x10010000 5
v[1] 0x10010004 3
v[2] 0x1001000C 7
v[3], v[k] 因为 k=3 0x10010010 9
v[4], v[k+1] 0x10010014 2

然后分别从

v[k]
和 v
[k+1]
加载值 9 和 2,并分别存储回
v[k+1]
v[k]
,所以现在最后两行是:

含义/变量 内存地址 储值
v[3], v[k] 0x10010010 2
v[4], v[k+1] 0x10010014 9

如果我们在上下文中执行此操作,即在排序算法中多次执行此操作,则整个值数组将被排序,而索引位置和地址将保持固定。


我想知道加载字和存储字是否只是在预期地址加载和存储“VALUE”,

是的,预期地址处的“VALUE”就是我们要更改的内容。

sw
完成更新数组中的值。

那么我们如何才能真正改变数组地址中的内容呢?

数组中的内容和值是一样的。商店完成更改位置

k
k
+1 处的值。

地址(本身为数值)不受加载和存储的影响。内存有地址,但它们实际上是不可变的,只有存储在内存位置的值可以更新,所以这就是我们所做的。该数组有一个基地址和从该基地址开始的元素,然后每 4 个地址后面就是该数组的另一个元素。这些地址是固定的,但它们存储的值可以更新、交换等。我们通过将值从数组中的一个位置移动到另一个位置来对数组进行排序,而位置本身保持固定 - 就像在 C 代码中一样,我们不这样做不更改

k
v
,仅更改存储在
v[k]
v[k+1]
中的内容。

在另一种数据结构中,我们可以存储复杂的值,例如,值对:(优先级,值)。使用这样的结构,数组中的每个元素都有两个值。这改变了我们所做的索引:例如一对现在将占用 8 个字节,而不是

int
数组中的每个 4 个字节。我们可以对数组中的这些对进行更新、交换和排序。 (为了对它们进行排序,我们需要一个标准,例如按优先级和/或按值)。然而所使用的寻址仍然是固定的。

分配数组(在 C 中,例如使用

malloc
,或在汇编中)是一种操作,您提供一个大小作为字节数(例如,10 个整数的数组为 40),系统返回给您一个内存地址,该地址具有之后有足够的存储空间来容纳整个字节大小。一旦分配了数组,其基地址就保持固定,并且其所有元素都位于可从该基地址计算的地址处。在C中,我们可以
free
分配一个数组,然后用于数组的那些内存地址可以用于其他目的。

(其他语言具有更复杂的数据结构,允许将数组移动到新的分配,以动态扩展数组的大小,尽管所有这些都是根据不可变的内存地址完成的。)

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