Вычитание регистров с помощью инструкции LEA?

Поддерживает ли инструкция 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.

Заранее спасибо за вашу помощь!


person user62453    schedule 05.06.2016    source источник
comment
Потому что ЦП не поддерживает такую ​​работу?   -  person MikeCAT    schedule 05.06.2016
comment
Как насчет mov rsi, rsp \ sub rsi, rax   -  person harold    schedule 05.06.2016
comment
@MikeCAT достаточно просто, вы можете сделать это как ответы. Спасибо!   -  person user62453    schedule 05.06.2016
comment
@harold выглядит лучше, спасибо!   -  person user62453    schedule 05.06.2016
comment
Режимы адресации ARM могут добавлять или вычитать индексный регистр, но x86 может только добавлять (с дополнительным масштабным коэффициентом).   -  person Peter Cordes    schedule 05.06.2016


Ответы (1)


Инструкция lea не заботится о знаке смещения. Но вам нужно всегда добавлять компоненты вместе.

mov rax, -1
lea rsi, [rsp + rax]

Помните, что вычитание 1 - это то же самое, что прибавление -1.

person Sep Roland    schedule 05.06.2016