Czy instrukcja LEA obsługuje ujemne przesunięcie?instrukcja arytmetyczno-montażowa instrukcji LEA
mov rax, 1
lea rsi, [rsp - rax]
Gdy używam powyższy kod w moim pliku asm mam błąd:
$ nasm -f macho64 test.asm
$ error: invalid effective address
wiem, że możemy zrobić coś takiego w C:
void foo(char *a, size_t b) {
*(a - b) = 1;
}
potem załóżmy, że:
lea rsi, [rsp - rax]
będzie działać .
I ja także spróbować zobaczyć, co zrobić kompilator GCC za pomocą:
$ gcc -S foo.c // foo.c has the function foo(above) in it
ale mój ASM knowleage nie jest wystarczająco dla mnie zrozumieć wyjście asm kompilator GCC z.
Czy ktoś może wyjaśnić dlaczego:
lea rsi, [rsp - rax] ;; invalid effective address
nie działa. I używam ich do osiągnięcia samething:
;; assume rax has some positive number
neg rax
lea rsi, [rsp + rax]
neg rax
lub
sub rsp, rax
mov rsi, rsp
add rsp, rax
Co jest bardziej standardowy sposób to zrobić?
Używam nasm wersję 2.11.08 skompilowany w dniu 26 listopada 2015 roku na MAC OSX 10.11
Z góry dziękuję za pomoc!
Ponieważ procesor nie obsługuje tego rodzaju operacji? – MikeCAT
Jak o "mov rsi, rsp \ sub rsi, rax' – harold
@MikeCAT wystarczy, możesz zrobić to jako odpowiedzi. Dziękuję Ci! – user62453