我想知道是否有人可以解释使用" modulo"这里:
用于32位Linux和Mac OS X的Gnu编译器版本3.x及更高版本构成了堆栈 指针在每个函数调用指令处对齐16。因此它可以依赖ESP = 12 每个函数入口的模16。 *
BTW我知道这里的字大小是四个字节,12个模16是12.除此之外,我真的不理解ESP = 12模16的说法。
答案 0 :(得分:4)
modulo operation的含义是标准的数学含义,x mod y
是x div y
的其余部分,其中div
是整数除法。
当自然数存在周期性时,模数自然会出现,为此,只需对前30个数字计算x mod 5
。
对齐是地址是某个数字 n 的倍数的要求,因为 x 是 n iif x mod的倍数n == 0 ,这将模数与对齐关联起来。
自然模数是一种操作,可以很容易地看到quotient group:当对齐 n 边界的地址时,有 n 可能的情况要考虑,尽管可能有无限的地址集
例如,为了在4边界处对齐和寻址,诸如1,5,9,13 ......之类的地址都是等价的,因为它们是高于4的倍数的一个值。
对于所有这些,我们只需要添加3.
因此,对于 n 边界的对齐,我们只考虑地址为0,1,2,... n -1字节的情况 n 的倍数。
措辞" ESP = 12模16"表示esp
比16的地址倍数高12个字节
注意,高于16的倍数的12个字节等于16的下一个倍数以下的4个字节
可视化0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
我们可以通过添加1向右移动,向左减去1。
调用后esp
为12模16的原因是,当执行像call function
这样的指令时,堆栈在16个字节上对齐(即esp
是0模16)然后在调用之后立即将堆栈降低4个字节 1 (由于call
指令按下返回地址),因此从前一个16的16个字节开始。
... 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 ...
^ ^-- Before the call
|__ After the call
1 请记住,堆栈增长 down 。