2009-06-19 19 views
3

我们在一个类中有一段代码,我们需要将它转换为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

我错过了什么?

回答

3

我不认为pos增加了位置。这是放置代码的指令。

所以“数组”从位置13开始,“总和”从430开始。这使主开始于438,并且仅剩417个数组。

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

+0

你误解了我的解释,因为我从来没有说过.pos增加了位置。如果仔细观察,你会发现我只是在指令上而不是指令上增加了位置。留出空间供以后更改与问题无关。 – 2009-06-19 20:05:21

1

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

你可能是正确的,.pos 413将是确切(和正确的)。我想象这位学生或老师刚刚离开“一堆空间”,以便为irmovl ... jump指示腾出空间,以避免必须像计算完成一样准确计算需要多少空间。

你对此的思考方式是正确的,它表明你对教师应该感到满意的材料的理解。