Modulo di indirizzamento della memoria Intel

1

Sto cercando di capire l'indirizzamento della memoria del codice macchina per x86, e ho incontrato due form generici opposti per l'indirizzamento (usando i byte ModRM e SIB).

La maggior parte delle risorse non ufficiali che consulto suggeriscono che l'indirizzamento della memoria è fatto in un sottoinsieme della forma generale [register1 + scale * register2 + displacement] . Un esempio potrebbe essere [EAX+disp8] per qualche spostamento di 8 bit. Le risorse di esempio sono:

link

link

Ma consultando il manuale di intel (Vol.2A, 2.1.5) sembra che la forma generale sia invece [register1] + [scale * register2] + displacement . Ad esempio, nella colonna di sinistra della Tabella 2-2, mostra [EAX]+disp8 . Le note in fondo alla tabella suggeriscono lo stesso.

Quindi quale forma generale è corretta? La prima forma produce un valore in memoria. La seconda forma produce un indirizzo di memoria, ma lo fa prima accedendo ad altri valori in memoria.

Tenendo presente che l'operatore [] non è distributivo, ovvero [register1 + register2] !== [register1]+[register2] , le due forme generali non sono identiche. Immagino che il primo modulo sia corretto e non sto interpretando correttamente il manuale di intel.

    
posta Joseph Johnston 06.06.2017 - 17:52
fonte

1 risposta

2

Sto osservando la tabella delle modalità di indirizzamento , e dice ~:

[registro1] + [registro2 * scala] + [spostamento]

Nonostante il significato normale di [] s, non c'è modo che quanto sopra significhi che il contenuto della memoria è indirizzato individualmente da ciascuno di

  • register1
  • register2 * scale
  • spostamento

Ok, register1 può contenere un indirizzo di memoria valido, ma register2 * scale (in generale) non crea un indirizzo di memoria valido, né lo spostamento (se è un piccolo spostamento, come 8 o 16 bit).

Quindi, all'interno di questo particolare testo, dobbiamo supporre che [] s non significhi riferimenti alla memoria, e siano proprio come una parentesi regolare.

Il processore offre un indirizzo di memoria calcolato da r1 + r2 * costante-scala + costante-disp. Il calcolo dell'indirizzo non implica la lettura / scrittura (dati) della memoria, è solo utilizzando i valori all'interno dei registri (e utilizzando i valori dei byte di istruzioni per lo spostamento).

L'indirizzo di memoria calcolato viene quindi dereferenziato in base all'opcode dell'istruzione - da cui l'indirizzo può essere letto, scritto o entrambi (sebbene per LEA (Load Effective Address), viene utilizzato solo l'indirizzo, non il contenuto della memoria lì) .

    
risposta data 06.06.2017 - 19:33
fonte

Leggi altre domande sui tag