2016-06-05 29 views
5

L'istruzione LEA supporta lo spostamento negativo?istruzioni LEA aritmetica del puntatore di assemblaggio

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

Quando uso il codice di cui sopra nel mio file asm ho ottenuto l'errore:

$ nasm -f macho64 test.asm 
$ error: invalid effective address 

So che possiamo fare qualcosa di simile in C:

void foo(char *a, size_t b) { 
    *(a - b) = 1; 
} 

poi ho Supponiamo che:

lea rsi, [rsp - rax]  

funzionerà .

E cerco anche di vedere ciò che il compilatore GCC fare utilizzando:

$ gcc -S foo.c // foo.c has the function foo(above) in it 

ma il mio ASM knowleage non è sufficiente per me il comprendere l'uscita asm dal compilatore GCC.

qualcuno può spiegare il motivo per cui:

lea rsi, [rsp - rax] ;; invalid effective address 

non funziona. E sto usando questi per ottenere la samething:

;; assume rax has some positive number 
neg rax  
lea rsi, [rsp + rax] 
neg rax 

o

sub rsp, rax 
mov rsi, rsp 
add rsp, rax 

Che è un modo più standard di farlo?

sto usando NASM versione 2.11.08 compilato il 26 novembre 2015 su Mac OSX 10.11

vi ringrazio in anticipo per il vostro aiuto!

+2

Perché la CPU non supporta questo tipo di operazione? – MikeCAT

+1

Che ne dite di 'mov rsi, rsp \ sub rsi, rax' – harold

+0

@MikeCAT abbastanza semplicemente, potete farlo come risposte. Grazie! – user62453

risposta

7

L'istruzione lea non si preoccupa del segno dello spostamento. Ma è necessario sempre aggiungere i componenti insieme.

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

Ricordarsi che la sottrazione 1 equivale all'aggiunta di -1.