Недопустимое использование регистра в режиме адресации

Почему mov rax, [rbp + 8*r8] является действительным адресом, а mov rax, [rbp - 8*r8] - нет? mov rax, [rbp - 8] тоже нормально. Я не смог найти ничего при отрицательном значении scale*index, что является проблемой. Мне кажется, что это следует шаблону SBI. (Я не хотел сбрасывать здесь свой код, так как это единственная строка кода, для которой я получаю ошибку).

поскольку разрешены только коэффициенты масштабирования 1,2,4,8, а не -1, -2, -4, -8

Michael Petch 10.08.2018 16:55

Что если r8 содержит отрицательное значение?

monolith937 10.08.2018 16:56

Содержимое регистра может быть любым, коэффициент масштабирования ограничен.

Michael Petch 10.08.2018 16:57

@ monolith937 Тогда еще можно делать rbp + 8*r8. Что содержит r8, значения не имеет.

fuz 10.08.2018 17:08

Это задокументировано в руководстве по базовой архитектуре, раздел 3.7.5 Указание смещения, в частности Рисунок 3-11. Вычисление смещения (или эффективного адреса) и «Каждый из этих компонентов может иметь как положительное, так и отрицательное (дополнение 2s) значение, за исключением коэффициента масштабирования»..

Jester 10.08.2018 17:10

См. wiki.osdev.org/X86-64_Instruction_Encoding#SIB, чтобы понять, почему у вас не может быть отрицательной шкалы: это только 2-битное поле, которое может кодировать сдвиг влево 0..3. Чтобы разрешить вычитание вместо сложения, потребуется еще 1 бит.

Peter Cordes 11.08.2018 03:10
0
6
26
0

Другие вопросы по теме