С 16-битными режимами адресации могут использоваться только следующие индексные регистры:
bx
si
di
bp
bx + si
bx + di
bp + si
bp + di
Аналогично, адресация SIB недоступна в 16-битных режимах адресации.
Если вы хотите использоватьдругие регистры индекса, вы всегда можете использовать 32-битный режим адресации, например [eax]
.Это работает до тех пор, пока вы выполняете свой код на процессоре 80386 или новее.
Это ограничение существует, поскольку байт modr / m имеет только три бита для регистра (индекса).Как вы можете видеть выше, существует ровно 8 возможных комбинаций регистров индекса.Я не знаю, почему они разработали режимы адресации таким образом, но это звучит довольно разумно для 16-битного процессора 70-х годов, как 8086.
В 32-битном и длинном режимах эта схема былаизменено так, что 7 из 8 возможных регистров индекса относятся к eax, ebx, ecx, edx, esi, edi и ebp, в то время как то, что будет относиться к esp, вместо этого указывает на наличие байта sib, допускающего хорошо известные режимы адресации [base+index*scale]
.