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:
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.