Does the LEA instruction support negative displacement?
mov rax, 1
lea rsi, [rsp - rax]
When I use the above code in my asm file I got the error:
$ nasm -f macho64 test.asm
$ error: invalid effective address
I Know that we can do pointer arithmetic like this in C:
void foo(char *a, size_t b) {
*(a - b) = 1;
}
then I assume that:
lea rsi, [rsp - rax]
will work.
And I also try to see what the GCC compiler do by using:
$ gcc -S foo.c // foo.c has the function foo(above) in it
but my asm knowleage is not enough for me the understand the asm output from the GCC compiler.
Can anyone explain why:
lea rsi, [rsp - rax] ;; invalid effective address
does not work. And I'm using these to achieve the samething:
;; assume rax has some positive number
neg rax
lea rsi, [rsp + rax]
neg rax
or
sub rsp, rax
mov rsi, rsp
add rsp, rax
What is a more standard way of doing it?
I'm using NASM version 2.11.08 compiled on Nov 26 2015 on MAC OSX 10.11
Thank you in advance for your help!
The lea
instruction doesn't care about the sign of the displacement. But you do need to always add the components together.
mov rax, -1
lea rsi, [rsp + rax]
Remember subtracting 1 is the same as adding -1.