c - C 编程寄存器结构
问题描述
尝试在 64 位机器上创建寄存器结构并提取它。总共有 7 个寄存器,2 个寄存器是 4 位,3 个寄存器是 8 位,最后 2 个是 16 位。我如何能够创建一个寄存器结构并提取它。使用这些功能。
RegisterFrame create_registers(...?) {???}
??? extract_registers(RegisterFrame, ...) {???}
我的第一个猜测是使用 pack 和 unpack
RegisterFrame pack(uint64_t a1,uint64_t a2, uint64_t b0, uint64_t b1, uint64_t b2, uint64_t c1, uint64_t c2);
RegisterFrame unpack(uint64_t a1,uint64_t *a2, uint64_t *b0, uint64_t *b1, uint64_t *b2, uint64_t *c1, uint64_t *c2;
但这是错误的,因为我们需要使用位操作:
我想
RegisterFrame create_register(uint64_t a1,uint64_t a2, uint64_t b0, uint64_t b1, uint64_t b2, uint64_t c1, uint64_t c2){
uint64_t retval = 0x0, tempa1, tempa2, tempb0, tempb1, tempb2, tempc1, tempc2
tempa1 = (a1&0xffffffff)
tempa2 = (a2&0xffffffff) << 4
tempb0 = (b0&0xffffffff) << 8
tempb1 = (b1&0xffffffff) << 8
tempb2 = (b2&0xffffffff) << 8
tempc1 = (c1&0xffffffff) << 16
tempc2 = (c2&0xffffffff) << 16
retval = tempa1|tempa2|tempb0|tempb1|tempb2|tempc1|tempc2;
任何帮助将不胜感激!
解决方案
你的问题不是很清楚。未显示的定义RegisterFrame
也未显示您认为的最后一次尝试的输出。
...但是假设您尝试将不同大小的值“打包”到'uint64_t'
变量中,那么您的暂定问题很少:
首先:0xffffffff
是一个 32 位的值,而不是一个 64 位的值。
第二:假设tempa包含4bits,tempb包含8bits和tempc包含16bits,但它们都是 uint64_t 变量。
第三:如果你想打包 {tempa0,tempa1,tempb0,tempb1,tempb2,tempc0,temp1} 你的错误没有掩盖你想要的实际大小(所有情况下都是 32 位而不是 4、8、16 位)并且没有正确旋转(如果例如,您旋转两个值<<4
,然后按位使用,或者|
您基本上是在“或”位 [7:4] 之间的值)
可能(未经测试)你想要的是类似于下面的代码:
RegisterFrame create_register(uint64_t a1,uint64_t a2, uint64_t b0, uint64_t b1, uint64_t b2, uint64_t c1, uint64_t c2){
uint64_t retval = 0x0, tempa1, tempa2, tempb0, tempb1, tempb2, tempc1, tempc2
tempa1 = (a1&0xf) << 0
tempa2 = (a2&0xf) << 4
tempb0 = (b0&0xff) << 8
tempb1 = (b1&0xff) << 16
tempb2 = (b2&0xff) << 24
tempc1 = (c1&0xffff) << 32
tempc2 = (c2&0xffff) << 48
retval = tempa1|tempa2|tempb0|tempb1|tempb2|tempc1|tempc2;
return retval;
}
推荐阅读
- c# - 如何从我的 WebAPI 服务的 JSON 输出中删除回车?
- ruby-on-rails - 如何让 Rails 4 在自定义序列化程序上使用嵌套根序列化 ActiveModel JSON?
- javascript - 如何通过传递 TZ 格式来获取时区的 BCL 格式
- c - 为什么 scanf 只返回它已成功读取的输入数?
- jquery - 某些 PC 出现错误是加载资源失败:服务器响应状态为 414 (Request-URI Too Long)
- spring-security - 我们可以在编写自定义身份验证提供程序时添加密码编码器吗?
- java - java进程“无响应”的分析?
- hive - 使用分区创建 hive 外部表
- php - 如何在 CakePHP 3 中获取分页检索的记录总数?
- npm - 如何加快 webpack 开发