我们在一节课上有一段 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 指令占用 5 个字节,从 8 开始,我们现在在位置 13。
现在节省堆栈空间来保存 array 的 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 更正确?
我错过了什么?
最佳答案
我认为 pos 不会增加职位。这是一个将代码放在那里的指令。
所以“array”从位置 13 开始,“sum”从 430 开始。这使得 main 从 438 开始,数组只剩下 417。
为以后进行更改留一点空间总是一个好主意。如果您稍后想要增加数组或添加另一条指令,则必须在整个代码中调整 pos 指令。如果访问数组出现错误,它还可以避免 sum 被破坏。填充到 430 更具防御性。
关于对这个 Y86 汇编代码的内存位置感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019716/