我们在一个班级中有一段 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足够且更正确?
我错过了什么?