80x86 16-разрядный asm: lea cx, [cx*8+cx] вызывает ошибку на NASM (компилирующий .com файл)

Ошибка, которую дает NASM (несмотря на мою рабочую ОС) является "недопустимым исполнительным адресом".

Теперь я видел много примеров того, как использовать ЛЕЮ, и я думаю, что разобрался в нем, но моему NASM не нравится он. Я попробовал lea cx, [cx+9] и это работало; lea cx, [bx+cx] не сделал.

Теперь, если я расширил свои регистры до 32 битов (т.е. lea ecx, [ecx*8+ecx]) все было бы хорошо, но я ограничиваюсь для использования 16-и 8-разрядные регистры только.

Действительно ли здесь кто-либо так хорошо осведомлен, кто мог объяснить меня, ПОЧЕМУ мой ассемблер не позволяет мне использовать lea путем, я предположил, что он должен использоваться?

6
задан Peter Cordes 26 June 2016 в 00:19
поделиться

2 ответа

Это потому, что [bx + cx] недействителен ни в каком режиме адресации на 16-битном x86, см. ] сайт для получения дополнительной информации.

lea cx, [bx + di] или lea cx, [bx + si] должны работать.

Если ваш код будет работать на 386 или новее в 16-битном режиме, вы можете использовать lea cx, [ecx + 9] (префикс размера адреса, но все же 16-битный размер операнда).

См. Также эти вопросы и ответы о режимах адресации x86 (в основном обсуждаются 32/64-битные режимы адресации и тег wiki .

9
ответ дан 8 December 2019 в 12:58
поделиться

lea cx, [cx * 8 + cx] не работает, потому что адресация «масштаб-индекс-база» доступна только с 32-битными регистрами. Это не ограничение ассемблера - это ограничение процессора.

6
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: