是否有方便的方法在结构或其他语言功能中表示x86指令?

时间:2017-01-03 17:12:17

标签: rust

Rust没有“位”数据类型,但是,x86指令有一个“字段”,其大小为位。是否有任何数据结构可以直接编译为x86指令集或任何二进制协议所需的“内存/字节对齐”,而不是使用逐位操作?

OpCode 1or2 byte
Mod-R/M 0 or 1 byte
    Mod 7,6 bit
    Reg/OpCode 5,4,3 bit
    R/M 2,1,0 bit
SIB 0 or 1 byte
    SS 7,6
    Index 5,4,3
    Base 2,1,0
Displacement 0,1,2 or 4 byte
Immediate 0,1,2 or 4

1 个答案:

答案 0 :(得分:3)

  

是否有可以直接编译的数据结构

不,没有与之对应的结构:

OpCode 1or2 byte

也就是说,你不能拥有一个结构,其值 一个或两个字节长。结构在编译时具有固定的大小。

您的主要选择是:

  1. 使用漂亮的Rust功能,如枚举和结构。这可能与实际指令的位模式不匹配。

  2. 制作struct Instruction([u8; 4])之类的内容,并实现使用按位运算的方法。这将允许您匹配位模式。

  3. 由于您不想使用按位操作并且必须匹配位表示,我不相信您的问题目前可以用您喜欢的方式解决。

    就个人而言,我可能会使用枚举路由并实现方法来将原始指令从实现ReadWrite的类型解析回字节。

    您可能对 bitfields 感兴趣,就像这个C ++示例一样:

    struct S {
        unsigned int b : 3;
    };
    

    在Rust中没有直接的支持,但是一些crate似乎支持宏来创建它们。也许那会很有用。