我们在一个类中有一段代码,我们需要将它转换为Y86,这是由一些人在老师的校正当然写在板上。对这个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持有我,这使在位置438
在438位置是主我们的程序代码将开始。
我觉得我得到的一切权利,我唯一的问题很简单:
为什么要用.POS 430为100个整数按住空格?我们应该只需要400个字节来保存所有的字节。不会.pos 413(因为之前的位置是13,我们需要400个字节的100个整数,因此413)是足够的和更正确的比.pos 430?
我错过了什么?
你误解了我的解释,因为我从来没有说过.pos增加了位置。如果仔细观察,你会发现我只是在指令上而不是指令上增加了位置。留出空间供以后更改与问题无关。 – 2009-06-19 20:05:21