Встроенная сборка X86, Доступ к определенным частям регистра - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть регистр ecx со значением 0x01ABCDEF (шестнадцатеричное значение). Я хочу получить доступ только к BYTE 2 (AB) для выполнения операций над ним.Я пытался использовать cl или ch, но они не получают правильный байт.Я пытался сделать:

mov bh, [ecx+2]

, но это просто ошибки ... Спасибо заранее за ваше время и помощь!

1 Ответ

2 голосов
/ 11 ноября 2010

Да - CL даст вам EF, а CH даст вам CD в значении, которое вы указали выше. Так как они вам не нужны, вам придется сделать смену, чтобы получить байты в нужных местах:

mov ebx, ecx
shr ebx, 8

Теперь BH будет иметь AB, а BL будет иметь CD.

Edit: Из вашего комментария вам явно не нужно значение в BH - скорее, вы просто хотите манипулировать этим конкретным байтом, не затрагивая остальную часть ECX. В этом случае, вероятно, проще всего сделать что-то вроде этого:

ror ecx, 16
not cl    // placeholder for the manipulation
rol ecx, 16

Это просто вращает ECX, поэтому интересующий нас байт находится в CL, затем манипулирует CL, а затем поворачивает ECX назад, чтобы байты были там, где они начинались. Я должен добавить, что, хотя это просто, на некоторых процессорах это будет довольно медленно. У Pentium IV не было переключателя ствола, поэтому для поворота требуется время, пропорциональное количеству бит, на которые вы перемещаетесь. Хуже того, манипулирование CL с последующим использованием ECX может (и в этом случае, вероятно, приведет) к остановке Partial Register * . Будет ли это важно для вас, будет зависеть от того, что вы пытаетесь выполнить с этим, и будет ли оно окружено другими инструкциями, которые можно выполнить во время PRS.

...