Indirizzamento della memoria assembler ?

Messaggioda simonerusso64 » 24/07/2019, 16:31

Codice:
#include <stdio.h>
int main()
{
int v[5] = { 1,2,3,4,5 };
int c = 0;
int *b;
b = &v[0];
__asm {
mov ebx,b
mov eax, dword ptr [ebx]
mov esi,4
mov ecx, dword ptr [ebx+esi*4]
add eax,ecx
mov c,eax
}
printf("%d", c);
}


Sto cominciando ad approcciarmi all'assembler. Tuttavia sto trovando problemi con l'indirizzamento della memoria. In particolare non capisco in base a che cosa devo stabilire l'identificatore di tipo ( dword ptr, word ptr o byte ptr ).
Inoltre se potete spiegarmi nel dettaglio cosa succede qui : mov ecx, dword ptr [ebx+esi*4]
simonerusso64
Junior Member
Junior Member
 
Messaggio: 96 di 212
Iscritto il: 30/10/2017, 22:44

Re: Indirizzamento della memoria assembler ?

Messaggioda apatriarca » 25/07/2019, 02:09

Prima di tutto il codice che hai scritto funziona solo in particolari compilatori e piattaforme. Come stai imparando a programmare in assembler?

  • Il tipo del puntatore, esattamente come in C, dipende dal tipo di dato su cui stai lavorando. In questo caso è dword che significa 4 byte (32 bit). Il tipo int è normalmente di 32 bit su architetture a 32/64 bit. Se avessi lavorato con degli short avrebbe invece usato word e per un char sarebbe stato byte. Nota che in assembler conta solo la dimensione e non il contenuto, per cui non c'è differenza tra un int, un unsigned o un float.
  • L'istruzione mov permette di fare alcune operazioni aritmetiche sugli indirizzi di memoria. Quell'istruzione sta copiando il valore del quinto elemento dell'array in ecx se non sbaglio. Credo che il tutto stia in pratica calcolando c = v[0] + v[4].
apatriarca
Moderatore
Moderatore
 
Messaggio: 5274 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Indirizzamento della memoria assembler ?

Messaggioda simonerusso64 » 25/07/2019, 02:44

Si, scusami. Sto programmando in Assembly 8086.
Ok la spiegazione del dword.
Ma non mi è ancora ben chiaro cosa succede in questa istruzione :
Codice:
 mov ecx, dword ptr [ebx+esi*4] .

Perchè viene copiato proprio il valore del quinto elemento dell'array ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 97 di 212
Iscritto il: 30/10/2017, 22:44

Re: Indirizzamento della memoria assembler ?

Messaggioda vict85 » 25/07/2019, 12:06

Muovi il quinto elemento dell'array in ecx. Il fatto che sia il quarto è perché esi = 4.
vict85
Moderatore
Moderatore
 
Messaggio: 9772 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Indirizzamento della memoria assembler ?

Messaggioda apatriarca » 25/07/2019, 12:18

Hai scritto il valore del puntatore b in ebx poche istruzioni più in alto. A questo indirizzo sommi \(4×4\) bytes. Siccome ogni elemento dell'array è di \(4\) bytes stai accedendo all'elemento di indice \(4\), cioè al quinto. L'istruzione quindi prende questo valore e lo copia in ecx.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5275 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Indirizzamento della memoria assembler ?

Messaggioda simonerusso64 » 25/07/2019, 12:35

Codice:
#include <stdio.h>

int main() {
   int a;
   int *b;
   int c[5] = { 1, 2, 3, 4, 5 };
   b = &c[1];
      __asm{
      mov ebx, b
         mov eax, dword ptr[ebx + 8]
         mov a, eax
   }
   printf("%d", a);
}


Ok, invece qui cosa succede :
Codice:
 mov eax, dword ptr[ebx + 8]
?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 98 di 212
Iscritto il: 30/10/2017, 22:44

Re: Indirizzamento della memoria assembler ?

Messaggioda apatriarca » 25/07/2019, 12:37

La stessa cosa, cambia solo l'indice.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5276 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Indirizzamento della memoria assembler ?

Messaggioda simonerusso64 » 25/07/2019, 13:00

Ok quindi in questo caso parto da c[1], quindi 2 e aggiungo 2 caselle, arrivando al valore 4. Giusto ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 99 di 212
Iscritto il: 30/10/2017, 22:44

Re: Indirizzamento della memoria assembler ?

Messaggioda apatriarca » 25/07/2019, 21:07

È il quarto valore ma l'indice è uguale a \(3\).
apatriarca
Moderatore
Moderatore
 
Messaggio: 5277 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite