Как я могу добавить содержимое двух регистров разного размера, чтобы сформировать эффективный адрес в сборке x86?

Рассмотрим следующую некорректную инструкцию в ассемблере x86:

imul    edx, [eax+cl], 2

Nasm жалуется, что эффективный адрес неверен. Я понимаю, что я не могу добавить два содержимого регистра разного размера. Как это правильно сделать? Может надо как-то добавить смещение - как это сделать в nasm? Примечание. Я не могу добавить весь ecx, так как старшие биты содержат данные.


person infoholic_anonymous    schedule 08.06.2014    source источник
comment
Как насчет сохранения ecx в другом регистре, а затем and с 255?   -  person emil    schedule 08.06.2014
comment
Как насчет movzx ecx,cl (без знака) или movsx ecx,cl (подписано)?   -  person rcgldr    schedule 08.06.2014
comment
mov ebx,ecx xor ecx,ecx mov cl,bl imul edx,[eax+ecx] [ссылка]courses.engr.illinois.edu/ece390/archive/spr2002/books/   -  person Dirk Wolfgang Glomp    schedule 09.06.2014


Ответы (1)


Один из способов — сохранить младшие 8 бит ecx следующим образом: (думаю, это должно работать)

movzx   edx, cl
imul    edx, [eax+edx], 2

Другой способ — запустить блок самомодифицирующегося кода, заменив «cl» «немедленным» смещением, обновляемым приложением при необходимости. Обратите внимание, что изменение выполняемого кода создает дополнительные задержки в новых процессорах, поэтому это редко бывает практичным.

person punpcklbw    schedule 23.06.2014