首页 > 解决方案 > 对齐,模数;“因此,它可以在每个函数入口处依赖 ESP = 12 模 16。”

问题描述

我想知道是否有人可以在这里解释“模”的使用:

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

顺便说一句,我知道这里的字长是四个字节,而 12 模 16 是 12。除此之外,我真的不明白 ESP = 12 模 16 的说法。

标签: assemblyalignmentmodularitymodularmod

解决方案


模运算的含义是标准的数学含义,x mod y是余数x div y,其中div是整数除法。
当自然数存在周期性时,模数自然会出现,要看到这一点,只需计算x mod 5前 30 个数。

对齐要求地址是某个数字n的倍数,因为xn iif x mod n == 0的倍数,这将模数与对齐联系起来。

自然数上的模是一种很容易可视化商群的操作:当在n边界对齐地址时,有n种可能的情况需要考虑,尽管可能有无限的地址集。
例如,要在 4 边界对齐和寻址,像 1、5、9、13、... 这样的地址都是等价的,因为它们是 4 的倍数以上的一个值。
对于所有这些,我们只需添加3.

因此,对于n边界处的对齐,我们只考虑地址是n的倍数以上的0、1、2、... n -1 个字节的情况。

措辞“ESP = 12 modulo 16”表示比 16 的倍数高 12 个字节esp
请注意,比 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 字节上对齐(即esp0 模 16),那么在调用之后堆栈立即低 4 字节1(由于call指令推入返回地址),因此前一个 16 的倍数的 12 个字节。

... 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请记住,堆栈会向下增长。


推荐阅读