Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Косвенная адресация на FASM.


Автор: Coder 24.7.2006, 04:53
почему компилятор Fasm выдает ошибку на такой строке:
Код

mov [ax],4 


как реализовать косвенную адресацию в FASM`e? 

Автор: Exekutor 24.7.2006, 08:27
Не только фасм, и тасм тоже. AX - это же регистр общего назначения. Воспользуйся регистрами SI или DI.  

Автор: sgi1981 29.7.2006, 18:47
Цитата(Coder @ 24.7.2006,  04:53)
почему компилятор Fasm выдает ошибку на такой строке:
Код

mov [ax],4 


как реализовать косвенную адресацию в FASM`e?

Потому что, при использовании 16-ти разрядного регистра ax вы пытаетесь использовать в режиме 16-разрядной адресации адресный регистр ax для задания составляющей адреса, а 16-разрядный регистр ax не может быть использован в качестве адресного для задания составляющей адреса.

Для справки
1) В режиме 16-разрядной адресации для задания составляющих адреса могут быть использованы следующие комбинации регистров и непосредственных смещений

[bx+si]
[bx+di]
[bp+si]
[bp+di]
[si]
[di]
смещение_16
[bx]
[bx+si]+смещение_8
[bx+di]+смещение_8
[bp+si]+смещение_8
[bp+di]+смещение_8
[si]+смещение_8
[di]+смещение_8
[bp]+смещение_8
[bx]+смещение_8
[bx+si]+смещение_16
[bx+di]+смещение_16
[bp+si]+смещение_16
[bp+di]+смещение_16
[si]+смещение_16
[di]+смещение_16
[bp]+смещение_16
[bx]+смещение_16

2) В режиме 32-разрядной адресации для задания составляющих адреса могут быть использованы следующие комбинации регистров и непосредственных смещений

[eax]
[ecx]
[edx]
[ebx]
[sib]
смещение_32
[esi]
[edi]
[eax]+смещение_8
[ecx]+смещение_8
[edx]+смещение_8
[ebx]+смещение_8
[sib]+смещение_8
[ebp]+смещение_8
[esi]+смещение_8
[edi]+смещение_8
[eax]+смещение_32
[ecx]+смещение_32
[edx]+смещение_32
[ebx]+смещение_32
[sib]+смещение_32
[ebp]+смещение_32
[esi]+смещение_32
[edi]+смещение_32

3) Важно учесть возможность адресации с помощью байта SIB (масштаб-индекс-база)
Например, в 32-разрядном режиме адресации возможна такая команда
mov ecx, [edx*8+ebx+45]

За дополнительной информацией - к справочнику.

И М Х О. Используйте вместо регистра ax регистр eax. Переходите на программирование в 32-разрядном режиме. Оно намного лучше.

  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)