首页 > 解决方案 > 了解 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?我们真的在这里做加法吗?

标签: assemblyx86machine-codeaddressing-mode

解决方案


推荐阅读