Поддерживает ли инструкция LEA отрицательное смещение?
mov rax, 1
lea rsi, [rsp - rax]
Когда я использую приведенный выше код в моем asm-файле, я получаю сообщение об ошибке:
$ nasm -f macho64 test.asm
$ error: invalid effective address
Я знаю, что мы можем выполнять арифметические операции с указателями в C:
void foo(char *a, size_t b) {
*(a - b) = 1;
}
то я предполагаю, что:
lea rsi, [rsp - rax]
буду работать.
И я также пытаюсь увидеть, что делает компилятор GCC, используя:
$ gcc -S foo.c // foo.c has the function foo(above) in it
но моих знаний asm недостаточно для понимания вывода asm из компилятора GCC.
Кто-нибудь может объяснить, почему:
lea rsi, [rsp - rax] ;; invalid effective address
не работает. И я использую их, чтобы добиться того же:
;; assume rax has some positive number
neg rax
lea rsi, [rsp + rax]
neg rax
or
sub rsp, rax
mov rsi, rsp
add rsp, rax
Что можно сделать более стандартным?
Я использую NASM версии 2.11.08, скомпилированной 26 ноября 2015 года на MAC OSX 10.11.
Заранее спасибо за вашу помощь!
mov rsi, rsp \ sub rsi, rax
- person harold   schedule 05.06.2016