2016-06-05 15 views
5

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!

+2

Ponieważ procesor nie obsługuje tego rodzaju operacji? – MikeCAT

+1

Jak o "mov rsi, rsp \ sub rsi, rax' – harold

+0

@MikeCAT wystarczy, możesz zrobić to jako odpowiedzi. Dziękuję Ci! – user62453

Odpowiedz

7

Instrukcja lea nie zwraca uwagi na znak przesunięcia. Ale musisz zawsze dodawać składników razem.

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

Pamiętaj, że odjęcie 1 jest takie samo jak dodanie -1.