试图在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;
任何帮助都将不胜感激!
您的问题不是很清楚。RegisterFrame
的定义没有显示,也不是您上次尝试的输出。
但是,假设您正试图将不同大小的值"打包"到'uint64_t'
变量中,您的尝试性问题很少:
第一:0xffffffff
是一个32位的值,而不是64位的值。
第二:假设tempa包含4bits,tempb包括8bits和empc含有 16bits第三:如果你想打包{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;
}