如何解决了解 x86 程序集中的 SIB 字节
我已经阅读了谷歌展示的关于 SIB 字节的每篇文章,以及 this video 和英特尔手册,但仍然有点不清楚。 This page 对以下内容特别有帮助:
import speech_recognition as sr
# get audio from the microphone
r = sr.Recognizer()
with sr.Microphone() as source:
print("Speak:")
audio = r.listen(source)
try:
print("You said ",r.recognize_google(audio))
except sr.UnkNownValueError:
print("Could not understand audio")
except sr.RequestError as e:
print("Could not request results; {0}".format(e))
哪里[ 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
是“比例”因子,就像您在 JavaScript 中的数组中执行此操作一样:
n
缩放本质上允许您按倍数跳转,因此如果您的内存是基于字节的,但您的对象是 32 位,那么您可以使用比例因子 4 每 4 个字节跳转。那种类型的东西。
我在正确的轨道上吗?我还不能完全确定。
让我感到困惑的是位移。位移如何影响这里的方程?如果你把它画成一个 JavaScript 数组......在最后一批例子的情况下,比如 base[index * scale]
,没有 [ disp + eax*n ]
(我正在考虑的“基础”) .这是否意味着基数为0?另外,reg
可以是另一个寄存器,还是只能是静态硬编码值?最后,所有可以用作基址和索引的寄存器是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。