如何解决x86 Assembly中ModR / M和SIB字节的寻址模式编码?
因此,我正在尝试将自定义语言转换为字节码,以便在JavaScript环境中进行解释。我试图从x86汇编中获得启发,并想了解Intel Manual中的“ ModR / M和SIB字节的寻址模式编码”部分。
据我了解,您可以为指令使用不同类型的操作数“编码”:
- 硬编码值
- 硬编码地址
- 从单个寄存器计算的值
- 从单个寄存器计算出的地址
- 从多个寄存器计算出的值
- 从多个寄存器计算出的地址
所以您可能有:
mul rax,-8(rbp)
mov rax,rbp + 10
其中-8(rbp)
计算rbp的-8偏移量。我想知道确切地如何将其翻译成机器代码,以便我可以看到在如此简单的语法糖中实际上秘密编码的所有信息是什么,因此可以使我的解释器类似地工作。
所以我似乎认为这是我应该看的,这是正确的吗?
这似乎是说,对于寄存器的每个组合,我们将在指令中的实际“数据”之前有一组唯一的位,这将告诉我们如何使用该数据。例如,[bx + si]
变为00,[bx + di]
变为01。这告诉我们,例如,“通过添加bx
和si
计算地址”。因此,基本上,在机器代码中的某个地方,相对/偏移语法糖被转换为特定的代码。因此,[bx + si] + disp32
意味着通过计算bx + si
然后添加以下位移位来定位地址。
我正确吗?
所以基本上您需要了解的信息是:
- 如果要计算地址或值。
- 如果地址或值是原义的或存储在内存中的其他位置。
- 相对于您所引用的内存位置的偏移量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。