сдвиг в С и сборка - PullRequest
       13

сдвиг в С и сборка

0 голосов
/ 07 января 2019

Рассмотрим следующий код C, который записывает и считывает данные ввода-вывода с отображением в память и из памяти.

volatile int* switches = (volatile int*) 0x1b430010; 
volatile int* leds = (volatile int*) 0xabbb8050; 
int temp = ((*switches) >> 6) & 0x3; 
*leds = (*leds & 0xff9f) | XXX;

Из приведенного выше кода C можно получить, что некоторые биты считываются с 16-разрядного порта коммутатора и используются для включения или выключения некоторых светодиодов, не влияя на другие светодиоды на 16-разрядном порту светодиодов. Одно отсутствующее выражение помечено как XXX. Запишите, каким должно быть выражение XXX, чтобы светодиоды правильно включались или выключались.

Ответ XXX = temp << 5. Когда я пытаюсь перевести на ассемблер и рассчитать в битах, я получил temp 0 после ((*switches) >> 6) & 0x3;, так почему temp << 5 здесь допустимо, потому что смещение 0 не делает ничего другого? (возможно, я просчитался, при необходимости могу предоставить все мои вычисления в битах)

1 Ответ

0 голосов
/ 07 января 2019

0xff9f - это 1111111110011111 в двоичном формате. Маска обнуляет биты 5 и 6, сохраняет остальные.

temp - это значение на 2 бита, потому что код и-маски с 0x3, 11 в двоичном формате (все остальные биты обнуляются). Вы должны сдвинуть его влево 5 раз, чтобы вставить окончательное значение с помощью маски |.

(Тот факт, что вы получаете 0 за temp, является либо ошибкой, либо ожидаемой в зависимости от входных данных, но это не меняет ответ выше)

...