对齐,模数; "因此,它可以在每个函数入口处依赖ESP = 12模16。"

时间:2018-05-07 19:35:03

标签: assembly alignment modularity modular mod

我想知道是否有人可以解释使用" modulo"这里:

  

用于32位Linux和Mac OS X的Gnu编译器版本3.x及更高版本构成了堆栈   指针在每个函数调用指令处对齐16。因此它可以依赖ESP = 12   每个函数入口的模16。 *

BTW我知道这里的字大小是四个字节,12个模16是12.除此之外,我真的不理解ESP = 12模16的说法。

1 个答案:

答案 0 :(得分:4)

modulo operation的含义是标准的数学含义,x mod yx 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