C编程寄存器结构

问题描述 投票:0回答:1

[尝试在64位计算机上创建寄存器结构并将其提取。共有7个寄存器,2个寄存器为4位,3个寄存器为8位,后2个为16位。我将如何创建寄存器结构并将其提取。使用这些功能。

RegisterFrame create_registers(...?) {???}
??? extract_registers(RegisterFrame, ...) {???}

我的第一个猜测是使用打包和解包 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;

任何帮助将不胜感激!

c function hex
1个回答
0
投票

您的问题不是很清楚。没有显示RegisterFrame的定义,也没有显示您认为的最后尝试的输出。

但是假设您尝试将'uint64_t'值中的不同大小“打包”到新的uint64_t值中,那么您的尝试有一些问题:

首先:0xffffffff是32位值,而不是64位值。

第二:可以说tempa包含4bitstempb包含8bitstempc包含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; }

© www.soinside.com 2019 - 2024. All rights reserved.