微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解 x86 程序集中的 SIB 字节

如何解决了解 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 可以是另一个寄存器,还是只能是静态硬编码值?最后,所有可以用作基址和索引的寄存器是什么?

另外,disp 是什么意思?我们真的在这里做加法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。