问题
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!
回答1:
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.
来源:https://stackoverflow.com/questions/37642256/subtracting-registers-with-an-lea-instruction