Как установить 45-й бит в поле 64-битного регистра? - PullRequest
0 голосов
/ 09 февраля 2012

Я пытался установить 46-й бит в регистре, который из 64-битной ширины, используя C. Как мне установить этот бит?

В настоящее время я делаю это:

uint32_t= address ;
uint64_t data =1ULL << 46;

Печать показывает, что устанавливается бит 14. Я не могу установить четный бит 32. Если я установил бит 32, он устанавливает бит 0. 33 установит бит 1. Похоже, что он выполняет круговое смещение после 0- 31 снова начинается с 0.

Регистрация в 64-битном формате.

Есть идеи, как мне установить этот бит?

Например:

reg_addr.val = FEATURE_REG;

printf(stdout, "Programming enable at address %x=%llx\n",
    reg_addr.val,reg_addr.val);

data.val = (1ULL << 46);

printf("Data value %llx\n",data.val);}

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Если вы используете типы как uint32_t или uint64_t, печать выполняется правильно:

printf(stdout, "Programming enable at address %" PRIu32 "=%" PRIu64 "\n",reg_addr.addr, reg_addr.val);

при условии, что reg_addr.addr имеет тип uint32_t, а тип reg_addr.val имеет тип uint64_t.

1 голос
/ 09 февраля 2012

Ваш код правильный.

Вы должны убедиться, что 64-битные целочисленные типы правильно поддерживаются на вашей платформе:

printf("%zu %zu\n", sizeof 1ULL, sizeof data);

следует напечатать

8 8

Если это так, ошибка, вероятно, (как упоминается @pmg в комментариях) в том, как вы проверяете, установлен ли бит.

В новом редакторе вы упомянули, что это регистр. Регистры ввода-вывода могут иметь особое поведение из-за их изменчивого свойства. Я предлагаю вам сначала проверить, чтобы установить бит с нормальным объектом.

0 голосов
/ 09 февраля 2012

Надеюсь, вы не проверили вывод этой строки, чтобы сделать вывод, что сдвиг не выполнен правильно!?

printf (стандартный вывод, «Программирование включено по адресу% x =% llx \ n», reg_addr.val, reg_addr.val);

Передача 64-битного значения два раза в printf, но использование% x (возможно, 32-битного) и% llx (64-битного) для вывода значений не будет работать. Полагаю, вы хотели взять адрес reg_addr.val в качестве первого параметра!?

printf (стандартный вывод, «Программирование включено по адресу% x =% llx \ n», & reg_addr.val, reg_addr.val);

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