2017-01-24 14 views
0

У меня есть% ecx, содержащий количество мест, в которых я хочу, чтобы значение% esi было сдвинуто влево, но, насколько я понимаю, источник shl должен быть немедленным значением.Перемещение битов по значению в регистре

Может кто-нибудь помочь мне понять, как я буду перемещаться по значению% ecx? Я осмотрелся и видел, как люди рекомендуют использовать регистр CL. Но есть ли альтернатива?

спасибо.

ответ

0

80386 архитектура обеспечивает команду сдвига влево с величиной сдвига в %cl, который маскируется с 31 по DWORD сдвигов, 15 для смены слов и т.д. Обратите внимание, что регистр %cl является наименьшим 8 бит регистра %ecx:

0  8  16    32        64 
+---------------------------------------------------------------+ 
| rcx               | 
+-------------------------------+-------------------------------+ 
| ecx       | 
+---------------+---------------+ 
| cx   | 
+-------+-------+ 
| cl | ch | 
+-------+-------+ 

Поэтому shll %cl,%esi уже делает то, что вы ожидаете, и сдвигает содержание %esi по количеству мест, указанных в %ecx как старшие биты на самом деле не важно, в любом случае (величина сдвига маскируется с 31 до перехода) ,

+1

... или замаскировано на 63 для 64-разрядных регистров – Anty

+0

Высокие разряды могут иметь значение для программы, и в этом случае следует обратить особое внимание на результат. Вы можете ожидать, что '1 << 33' будет' 0' не '2'. – Jester

+0

@Jester Это правильно. Однако, поскольку shll маскирует операнд сдвига с 31, не имеет значения, установлены ли какие-либо высокие биты в ecx, поскольку они все же маскируются. – fuz