首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS模拟器-将指令读入内存(C++)

MIPS模拟器-将指令读入内存(C++)
EN

Stack Overflow用户
提问于 2015-05-29 05:22:16
回答 2查看 521关注 0票数 2

我需要读取十六进制格式的32位地址(例如: 0129ef12),并将32位拆分为6-5-5-16个数据包,分别表示操作码-Rd-Rs-Immediate。

这就是我到目前为止所知道的:

代码语言:javascript
复制
typedef unsigned char u8;
typedef unsigned short u16;

union {
   unsigned int address;
   struct {
       u16 imm : 16;
       u8 rs : 5;
       u8 rd : 5;
       u8 opcode : 6;
   } i;
} InstRead;

InstRead.address = 0x0129ef12;

cout << hex << int(InstRead.i.opcode) << "\n";
cout << hex << int(InstRead.i.rs) << "\n";
cout << hex << int(InstRead.i.rd) << "\n";
cout << hex << int(InstRead.i.imm) << "\n";

然而,这并不能给出正确的输出...也就是说,没有按照我指定的长度6-5-5-16选择比特...我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-05-29 07:09:44

代码语言:javascript
复制
union {
   unsigned int address;
   unsigned int imm : 16,
       rs : 5,
       rd : 5,
       opcode : 6;

} InstRead;

看看你和那个联盟有没有更好的运气。不过,这将取决于您的编译器。

票数 1
EN

Stack Overflow用户

发布于 2015-05-29 08:28:35

你的代码适用于我(Windows7下的gcc 4.8.3 )。

您可以使用位操作以更便携的方式提取字段:

代码语言:javascript
复制
imm = address & 0xffff;
rs  = address & 0x1f0000 >> 16; 
// et cetera
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30517315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档