推送到堆栈时的数组地址

时间:2010-10-11 01:24:27

标签: assembly

我写了一个简单的c函数:

void function(){
    int n;
    char s[6];
    n = 1;
    s[0] = 2;
    s[5] = 3;
}

这反汇编:

pushl %ebp
movl %esp, %ebp
sub $40, %esp
movl $1, -12(%esp)
movb $2, -40(%esp)
movb $3, -35($esp)
leave
ret

我试图理解为什么char []被赋予从-40开始的地址。

它是一个6字节的数组,所以我认为它需要8个字节(4个字节的多个字),在这种情况下它将分配给内存地址-20(%esp)

为什么-40(%esp)?

由于

编辑:我也假设n的偏移量为-12(%esp),因为整数和寄存器是4个字节,eip被推到-4(%esp),ebp被推到-8 (%ESP)。这是对的吗?

提前谢谢!!

1 个答案:

答案 0 :(得分:1)

应该有movl $ 1,-12(% ebp )等等。

s []是一个缓冲区,因此编译器可能会为安全检查分配额外的空间(但没有任何检查)。

有以下布局:

esp+44: ebp+04: return address
esp+40: ebp+00: prev ebp value
.......
esp+12: ebp-12: n
.......
esp+04: esp-3C: s[4:6]
esp+00: ebp-40: s[0:4]
相关问题