assembly - 对齐,模数;“因此,它可以在每个函数入口处依赖 ESP = 12 模 16。”
问题描述
我想知道是否有人可以在这里解释“模”的使用:
用于 32 位 Linux 和 Mac OS X 的 Gnu 编译器版本 3.x 及更高版本使堆栈指针在每个函数调用指令处对齐 16。因此,它可以在每个函数入口处依赖 ESP = 12 模 16。*
顺便说一句,我知道这里的字长是四个字节,而 12 模 16 是 12。除此之外,我真的不明白 ESP = 12 模 16 的说法。
解决方案
模运算的含义是标准的数学含义,x mod y
是余数x div y
,其中div
是整数除法。
当自然数存在周期性时,模数自然会出现,要看到这一点,只需计算x mod 5
前 30 个数。
对齐要求地址是某个数字n的倍数,因为x是n 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 字节上对齐(即esp
0 模 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请记住,堆栈会向下增长。
推荐阅读
- macos - 如何在 MATLAB 中检测 M1 mac 处理器?
- php - 控制器端请求中未设置 ApiTestCase 中上传的文件
- node.js - 激活 cors 的 axios 网络错误仍然返回错误
- python-3.x - 我正在为连接编写一个 Django 原始查询,例如: Models.obejcts.raw(query) 返回相同的查询
目的 - angular - Angular & Bootstrap 4 日期输入字段 - 模拟日历中的点击
- sql - MariaDB Connector/J 和 AWS RDS Aurora 出现奇怪的间歇性问题
- kql - Kusto 查询 JSON 数组值
- python - Geopandas 说它已经安装,但是当我尝试导入时,我得到了 OSError
- scikit-learn - 可以在 one-hot 编码的多标签分类上使用 sklearn 的 Bagging Classifier 吗?
- c# - Microsoft.Extensions.* nuget 包的 5.x 版本是否需要 .NET 5.0?