了解 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 (将#修改为@)