我写了一个简单的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)。这是对的吗?
提前谢谢!!
答案 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]