2015-05-04 3 views
1

Я хочу извлечь 17-й бит из своего 32-битного (int) значения. Правильно ли я это делаю? Я использую синтаксис AT & T.Сборка - извлечь конкретный бит

movl $0x11112222,%eax 
movb $0b01000000,%bl 
andb %ah,%bl 

Я поместил 32-битное число в регистр 32 бит. Теперь 17-й бит находится в регистре ah (как и другие 16-23 бит). Теперь, поскольку это второй бит в регистре ah, я создал «маску». Затем я делаю и работаю. Я думаю об этом?

+0

Уверенный, что вы есть. Но вещь '% ah' будет изменена. Таким образом, если вы хотите, чтобы значение не изменилось, вы должны использовать 'test'. –

ответ

2

Общая идея может работать, но у вас неправильная константа и неправильный байт. Ваша маска должна быть 0b000000100000000000000000 (или более читаемо 0x20000), и вы должны использовать 32-битное маскирование, потому что вы не можете получить доступ к байту с битами 16-23. Вы ошибочно заявили, что живут в %ah, но это неправильно, так как %ah имеет бит 8-15.

Кроме того, эта операция оставит бит на месте. В зависимости от того, что именно вы хотите, вы можете сдвинуть весь eax на 17, а затем сохранить наименее значимый бит.

+0

Как правило, мне приходится писать сценарий, где я беру 17-й бит из нескольких чисел, затем XOR и т. Д. Является ли это и собственно операцией в этом случае? – DzikiChrzan

+0

С фиксированной константой, да, если вам всегда нужен бит # 17. Обратите внимание, что вы можете сначала просмотреть свои номера, а затем извлечь результат один раз. – Jester

+0

Подожди, я не заметил твоей ошибки ... '% ах' делает ** не ** имеет биты 16-23, у него бит 8-15! – Jester

Смежные вопросы