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
答案 0 :(得分:3)
是否有可以直接编译的数据结构
不,没有与之对应的结构:
OpCode 1or2 byte
也就是说,你不能拥有一个结构,其值 一个或两个字节长。结构在编译时具有固定的大小。
您的主要选择是:
使用漂亮的Rust功能,如枚举和结构。这可能与实际指令的位模式不匹配。
制作struct Instruction([u8; 4])
之类的内容,并实现使用按位运算的方法。这将允许您匹配位模式。
由于您不想使用按位操作并且必须匹配位表示,我不相信您的问题目前可以用您喜欢的方式解决。
就个人而言,我可能会使用枚举路由并实现方法来将原始指令从实现Read
和Write
的类型解析回字节。
您可能对 bitfields 感兴趣,就像这个C ++示例一样:
struct S {
unsigned int b : 3;
};
在Rust中没有直接的支持,但是一些crate似乎支持宏来创建它们。也许那会很有用。