我们在一个班级的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 更正确吗?
我错过了什么?
答案 0 :(得分:3)
我认为pos不会增加这个位置。这是在那里放置代码的指令。
所以“数组”从位置13开始,“和”从430开始。这使得主要开始于438,并且只留下417个数组。
稍后留一点空间进行更改总是一个好主意。如果您以后想要增加数组或添加另一条指令,则必须在整个代码中调整pos指令。如果访问阵列时出错,它还可以减少被破坏的总和。填充到430更具防御性。
答案 1 :(得分:1)
首先让我说我不是Y86的专家。但是,我编写了大量的汇编代码。
.pos 413
确切(正确)可能是正确的。我想,学生或老师只是留下了“一堆空间”,以便为irmovl ... jump
指令腾出空间,以避免必须像你所做的那样准确计算出需要多少空间。 / p>
您的思考方式是正确的,它表明了对教师应该高兴的材料的理解。