Sto lavorando a livello universitario con il linguaggio ASM della GNU.
Mi sono imbattuto in programmi che compilavano ma creavano risultati sbagliati a causa di mie possibili incomprensioni di alcuni costrutti.
Il mio principale dubbio risiede in una forma di indirizzamento di memoria.
Faccio un esempio veloce:
es1:
MOVL 12(%EBP, %EIP, 4), %ECX
e
es2:
MOVL 12(%EBP), %EAX
MOVL (%EAX, %EIP, 4), %ECX
ponendo il caso che 12(%EBP) sia l'indirizzo del vettore "int v[5]", io utilizzo "12(%EBP, %EIP, 4)" e incremento ciclicamente %EIP per scorrere all'interno degli elementi del vettore che hanno INDIRIZZO = [12 + %EBP + (%EIP*4)], con 4 che ovviamente rappresenta la grandezza di ogni elemento (INT o LONG)
mi è capitato però di vedere usare anche:
MOVL 12(%EBP), %EAX
MOVL (%EAX, %EIP, 4), %ECX
nella mia ignoranza ho pensato che fossero due modi diversi per scrivere la stessa cosa, ma compilando i risultati erano diversi e quindi mi viene ovvio da pensare che pensavo male.
Qualcuno potrebbe perfavore spiegarmi che differenze ci sono tra "es1" e "es2"?
Grazie a tutti per l' attenzione!
![]()