【问题标题】:Convert MIPS32 to C: adding an array's base address to arbitrary value and its meaning将 MIPS32 转换为 C:将数组的基地址添加到任意值及其含义
【发布时间】:2013-02-07 02:51:17
【问题描述】:

我现在正在做家庭作业,我收到了以下信息:

$s6是数组A的基地址的位置,$s0f的值的位置(未指定)。

它希望我将一些指令转换为 C 语句。这是我的问题,因为如果这个问题得到解答,我可以很容易地解决这个问题的其余部分:

添加$t0、$s6、$s0

这是在说$t0 = (the base address of array A) + f 还是说$t0 = A[0+f]

因为如果 A 的基地址是 0x04000000 并且我使用 addi 将 4 添加到该基地址,产生 0x04000004,并将该值分配给 t0,我的意思是 t0 = A[1](假设我'm 存储整数)。

但由于我不知道 f 的值,我不确定如何在 C 中表示它,因为我知道我正在修改索引,但我不知道修改了多少。更准确地说(根据上面的说明):

$t0 = A[f/4]

我对这一切都不熟悉哈。希望我证明我已经做了一些研究来试图弄清楚这一点。

谢谢

OSFTW

【问题讨论】:

    标签: c assembly mips


    【解决方案1】:

    此指令中没有取消引用:

    add $t0, $s6, $s0
    

    好像是说

    t0 = s6 + s0;
    

    在类似 C 的伪代码中。或者以您的为例:

    t0 = (char *)A + f;
    

    要从 A 中获取一个值,它看起来像:

    lw $t1, 0($t0)
    

    在完成前面的add 指令后,$t0 指向数组中的正确位置。

    【讨论】:

    • 哦,这有点像选角?因为在 s6 只有一个内存地址,对吗?所以我们将其转换为(在这种情况下)一个 int?
    • 铸造只有在你有类型的情况下才有意义,而汇编语言没有。我不确定你到底在说什么。
    • 这就是我的困惑所在:我们正在将地址添加到某个不起眼的整数。结果是没有意义的,除非放在该数组的上下文中,并且除非该整数可以被四整除(在整数数组的情况下)。为了帮助澄清,后来的问题如下:lw $s0,0($t0) 所以它现在将 t0 视为一个数组,试图从它的基地址访问它。而且,假设 f 可以被 4 整除并且是正数,那么所做的就是在某个递增索引处引用数组的一个元素,只是以不同的方式,对吗?比如:s0 = A[f/4]
    • 好的,很好。所以下面这几行代码基本意思是f = A[f/4] ?: add $t0, $s6, $s0 lw $s0,0($t0)
    • 假设fs0 中,并且指向A 的第一个元素的指针在s6 中(如您的问题中所述),是的。而A 是一个 4 字节对象数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2016-07-26
    • 2020-12-14
    相关资源
    最近更新 更多