3

我们在一个班级中有一段 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 个字节来保存sum和另外 4 个字节来保存i,它放在位置 438。

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

我想我做对了,我唯一的问题很简单:
为什么我们使用.pos 430来为 100 个整数保留空间?我们应该只需要正好 400 个字节来保存所有这些。难道.pos 413 (因为之前的位置是 13 并且我们需要 400 个字节来存放 100 个整数,因此是 413)是否比.pos 430足够且更正确?

我错过了什么?

4

2 回答 2

3

我不认为 pos 增加了职位。这是一个将代码放在那里的指令。

所以“数组”从位置 13 开始,“总和”从 430 开始。这使得 main 从 438 开始,而数组只剩下 417。

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

于 2009-06-19T19:57:13.200 回答
1

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

您可能是正确的,这.pos 413将是准确的(并且是正确的)。我想学生或老师只是为了给指令腾出空间而留下“一堆空间”,irmovl ... jump以避免像你所做的那样准确计算需要多少空间。

你的思考方式是正确的,它表明你的导师对材料的理解应该感到高兴。

于 2009-06-19T19:52:10.777 回答