Cosa significano le parentesi in x86 asm?

Dato il seguente codice:

L1 db "word", 0 mov al, [L1] mov eax, L1 

Cosa rappresentano le parentesi ([L1])?

[L1] indica il contenuto della memoria all’indirizzo L1. Dopo aver eseguito mov al, [L1] qui, il registro al riceverà il byte all’indirizzo L1 (la lettera ‘w’).

Significa semplicemente ottenere la memoria all’indirizzo contrassegnato dall’etichetta L1.

Se ti piace C, pensa in questo modo: [L1] è uguale a *L1

Operandi di questo tipo, come [ebp] , sono chiamati operandi di memoria .

Tutte le risposte qui sono buone, ma vedo che nessuno parla dell’afflizione nel seguire questa come una regola rigida – se si tratta di parentesi, quindi di dereferenziazione , tranne quando si tratta dell’istruzione lea .

lea è un’eccezione alla regola precedente. Dì che abbiamo

 mov eax, [ebp - 4] 

Il valore di ebp viene sottratto da 4 e le parentesi indicano che il valore risultante è preso come indirizzo e il valore che risiede in quell’indirizzo è memorizzato in eax . Tuttavia, nel caso di lea , le parentesi non significherebbe che:

 lea eax, [ebp - 4] 

Il valore di ebp viene sottratto da 4 e il valore risultante viene memorizzato in eax . Questa istruzione dovrebbe solo calcolare l’indirizzo e memorizzare il valore calcolato nel registro di destinazione. Vedi questo post per ulteriori dettagli.

Le parentesi significano de-referenziare un indirizzo. Per esempio

 mov eax, [1234] 

significa, sposta il contenuto dell’indirizzo 1234 su EAX. Così:

 1234 00001 

EAX conterrà 00001.

L’indirizzamento diretto della memoria – al verrà caricato con il valore situato all’indirizzo di memoria L1 .

Come con molti linguaggi assembler, questo significa indiretta. In altre parole, il primo mov carica al con il contenuto di L1 (il byte 'w' in altre parole), non l’indirizzo.

Il tuo secondo mov effettivamente caricato con l’ indirizzo L1 e puoi in seguito dereferenziarlo per ottenere o impostare il suo contenuto.

In entrambi i casi, L1 è concettualmente considerato l’indirizzo.

Significano che invece di spostare il valore del registro o il valore numerico L1 nel registro al , trattano il valore del registro o il valore numerico L1 come un puntatore nella memoria, recuperano il contenuto di quell’indirizzo di memoria e spostano quel contenuto in al .

In questo caso, L1 è una posizione di memoria, ma la stessa logica si applicherebbe se un nome di registro fosse tra parentesi:

 mov al, [ebx] 

Anche conosciuto come un carico.

Indica che il registro dovrebbe essere usato come un puntatore per la posizione effettiva, invece di agire sul registro stesso.