对此Y86汇编代码的内存位置感到困惑

时间:2009-06-19 19:38:29

标签: c assembly y86

我们在一个班级的C中有一段代码,我们需要将它转换为Y86,这当然是由一些人在董事会上写的,当然是教师的纠正。

但是,我在代码的初始部分混淆了内存位置和.pos指令:

int array[100], sum, i;

int main() {
    sum = 0;

    for(i = 0; i < 100; i++) {
        array[i] = i;
        sum += array[i];
    }
}

.pos 0
    irmovl Stack, %esp
    rrmovl %esp, %ebp
    jmp main
array:
.pos 430

sum: .long 0
i: .long 0

main:
  // (rest of the code that doesn't really matter here)

我从这段代码中理解的是:
它从位置0开始( .pos 0 ), irmovl 指令占用6个字节,因此,下一个 rrmovl 指令从位置6开始,该指令占用2个字节,我们现在位于第8位。

jmp 指令从8开始占用5个字节,我们现在处于第13位。

现在保存堆栈空间以保存数组的100个整数是驯服的,为此我们使用.pos 430来保存至少400个字节(4个字节* 100个整数)和17个以上(下一个位置减去当前位置,430-13 = 17)。

我们现在处于430位置,我们需要再保存4个字节以保持总和,另外4个保存 i ,这将位于438位置。

在438位是我们程序的主要代码将开始的地方。

我认为我把事情做对了,唯一的问题很简单:
为什么我们使用 .pos 430 来保存100个整数的空间?我们应该只需要400个字节来保存所有这些字节。不会 .pos 413 (因为前一个位置是13,我们需要100个整数的400个字节,因此413)足够且比 .pos 430 更正确吗?

我错过了什么?

2 个答案:

答案 0 :(得分:3)

我认为pos不会增加这个位置。这是在那里放置代码的指令。

所以“数组”从位置13开始,“和”从430开始。这使得主要开始于438,并且只留下417个数组。

稍后留一点空间进行更改总是一个好主意。如果您以后想要增加数组或添加另一条指令,则必须在整个代码中调整pos指令。如果访问阵列时出错,它还可以减少被破坏的总和。填充到430更具防御性。

答案 1 :(得分:1)

首先让我说我不是Y86的专家。但是,我编写了大量的汇编代码。

.pos 413确切(正确)可能是正确的。我想,学生或老师只是留下了“一堆空间”,以便为irmovl ... jump指令腾出空间,以避免必须像你所做的那样准确计算出需要多少空间。 / p>

您的思考方式是正确的,它表明了对教师应该高兴的材料的理解。