assembly - 了解 x86 汇编中的 SIB 字节
问题描述
我已经阅读了谷歌展示的关于 SIB 字节的每篇文章,以及这个视频和英特尔手册,但仍然有点不清楚。这个页面特别有用,内容如下:
[ reg32 + eax*n ] MOD = 00
[ reg32 + ebx*n ]
[ reg32 + ecx*n ]
[ reg32 + edx*n ]
[ reg32 + ebp*n ]
[ reg32 + esi*n ]
[ reg32 + edi*n ]
[ disp + reg8 + eax*n ] MOD = 01
[ disp + reg8 + ebx*n ]
[ disp + reg8 + ecx*n ]
[ disp + reg8 + edx*n ]
[ disp + reg8 + ebp*n ]
[ disp + reg8 + esi*n ]
[ disp + reg8 + edi*n ]
[ disp + reg32 + eax*n ] MOD = 10
[ disp + reg32 + ebx*n ]
[ disp + reg32 + ecx*n ]
[ disp + reg32 + edx*n ]
[ disp + reg32 + ebp*n ]
[ disp + reg32 + esi*n ]
[ disp + reg32 + edi*n ]
[ disp + eax*n ] MOD = 00, and
[ disp + ebx*n ] BASE field = 101
[ disp + ecx*n ]
[ disp + edx*n ]
[ disp + ebp*n ]
[ disp + esi*n ]
[ disp + edi*n ]
哪里n = 1, 2, 4 or 8
。
根据我的理解(尽管没有一个文档似乎明确地显示了这一点),reg
是“基础”,eax
等等是索引,而n
是“比例”因子,就好像你在 JavaScript 中的数组中执行此操作一样:
base[index * scale]
比例尺本质上允许您跳跃倍数,因此如果您的内存是基于字节的,但您的对象是 32 位的,那么您可以使用 4 的比例因子每 4 个字节跳跃一次。那种东西。
我在正确的轨道上吗?我还不能完全说清楚。
我感到困惑的是位移。位移如何影响这里的方程?如果您要将其绘制为 JavaScript 数组...在最后一批示例的情况下,例如[ disp + eax*n ]
,没有reg
(我正在考虑的“基础”)。这是否意味着基数为0?另外,可以disp
是另一个寄存器,还是只能是静态硬编码值?最后,所有可以用作基数和索引的寄存器是什么?
另外,这是什么意思disp + reg8 + eax*n
?我们真的在这里做加法吗?
解决方案
推荐阅读
- android - Gradle:错误:程序类型已存在:androidx.activity.R$attr
- java - 正则表达式:用空字符串替换所有无效字符
- python - 如何将一个类实例的变量存储在另一个类的实例中
- c++ - range-v3:用分隔符连接管道范围
- java - 使用 long Always 在 SQLite 中插入数据时遇到问题,返回 -1
- c++ - 使用通配符字符串作为键的高效 ID 查找
- angular - 如何使用动态路由器链接的方法
- python - 如何在嵌套的for循环中解析来自两个不同api调用的json响应?
- python - Tkinter 按钮直到鼠标悬停在它上面才显示
- coldfusion - 从 Coldfusion 11 升级到 Coldfusion 2018 后,cfgrid 无法正常工作