C Структура регистров программирования - PullRequest
0 голосов
/ 27 февраля 2020

Попытка создать структуру регистров на 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;

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 27 февраля 2020

Ваш вопрос не очень понятен. Определение RegisterFrame не показывается, равно как и результаты последней попытки, о которой вы думали.

... но при условии, что вы пытаетесь «упаковать» значения разных размеров в переменную 'uint64_t', у вас было несколько проблем:

Первый: 0xffffffff - это 32-битное значение, а не 64-битное.

Второй: скажем, tempa содержит 4 бит , tempb содержит 8bit и temp c содержит 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; }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...