assembly MIPS中的交换过程

doinxwow  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(76)

enter image description hereenter image description here我在CO课程中学习MIPS,我在MIPS中遇到了交换过程。
我想知道,如果加载字和存储字只是加载和存储“值”在预期的地址,那么我们如何才能真正改变数组的地址中的内容。因为我假设$t0和$a0(数组的地址)是不同的。谢谢你的解释!

3zwjbxry

3zwjbxry1#

该swap过程在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位于0x 10010000(某些MIPS内存模型的全局数据内存位置),k为3。
| 存储器地址|存储值| stored value |
| --|--| ------------ |
| 0x10010000|五个| 5 |
| 0x10010004|三个| 3 |
| 0x10010008|七个| 7 |
| 0x1001000C|九个| 9 |
| 0x10010010|二个| 2 |
然后值9和2分别从v[k]和v [k+1]加载,并分别存储回v[k+1]v[k],所以现在最后两行是:
| 存储器地址|存储值| stored value |
| --|--| ------------ |
| 0x1001000C|二个| 2 |
| 0x10010010|九个| 9 |
如果我们在上下文中执行此操作,即在排序算法中,整个值数组被多次排序,而索引位置和地址简单地保持固定。
我想知道,如果加载字和存储字只是加载和存储“值”在预期的地址,
是的,预期地址处的“VALUE”就是我们要更改的内容。sw完成更新数组中的值。
那么我们如何才能真正改变数组地址中的内容。
数组中的内容和值是相同的。存储器完成改变位置kk +1处的值。
地址(本身为数值)不受加载和存储的影响。内存有地址,但它们实际上是不可变的,只有存储在内存位置的值才能被更新,这就是我们所做的。数组有一个基地址和从该基地址开始的元素,然后每隔4个地址是数组的另一个元素。这些地址是固定的,但它们存储的值可以更新、交换等。我们通过将值从数组中的一个位置移动到另一个位置来对数组进行排序,而位置本身保持不变-就像在C代码中一样,我们不改变kv,只改变存储在v[k]v[k+1]中的内容。
在另一种数据结构中,我们可以存储复杂的值,例如,值对:(优先级,值)。对于这样的结构,我们将在数组中的每个元素有两个值。这改变了我们所做的索引:例如,一对现在将各自占用8个字节,而不是X1 M13 N1 X阵列的各自占用4个字节。我们可以在它们的数组中更新、交换和排序这些对。(为了对它们进行排序,我们需要一个标准,例如按优先级和/或按值)。然而,所使用的地址仍然是固定的。
分配一个数组(在C中,例如使用malloc,或在汇编中)是一种操作,其中您提供大小作为字节计数(例如,40(对于10个整数的数组),系统返回给你一个单一的内存地址,它有足够的存储空间来容纳整个字节大小。一旦数组被分配,它的基地址保持固定,并且它的所有元素都在从该基地址可计算的地址处。在C中,我们可以free一个已分配的数组,然后用于该数组的那些内存地址可以用于其他目的。
(其他语言有更复杂的数据结构,允许将数组移动到新的分配,以动态扩展数组的大小,尽管所有这些都是在不可变的内存地址方面完成的。

相关问题