16-битная сборка: не может разыменовать некоторые регистры - PullRequest
0 голосов
/ 10 октября 2018

Я пробую следующую 16-битную инструкцию Intel:

mov si, word [reg]

, где reg - некоторый регистр.Он прекрасно компилируется, если reg равен bx, но не когда ax, cx или dx.Я использую NASM в качестве моего ассемблера.Я уверен, что это связано с некоторыми ограничениями в наборе команд.Может кто-нибудь объяснить, пожалуйста, об ограничении и обосновании этого?

1 Ответ

0 голосов
/ 10 октября 2018

С 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].

...