Pagina 1 di 1

Indirizzamento della memoria assembler ?

MessaggioInviato: 24/07/2019, 16:31
da simonerusso64
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]

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 02:09
da apatriarca
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].

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 02:44
da simonerusso64
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 ?

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 12:06
da vict85
Muovi il quinto elemento dell'array in ecx. Il fatto che sia il quarto è perché esi = 4.

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 12:18
da apatriarca
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.

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 12:35
da simonerusso64
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]
?

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 12:37
da apatriarca
La stessa cosa, cambia solo l'indice.

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 13:00
da simonerusso64
Ok quindi in questo caso parto da c[1], quindi 2 e aggiungo 2 caselle, arrivando al valore 4. Giusto ?

Re: Indirizzamento della memoria assembler ?

MessaggioInviato: 25/07/2019, 21:07
da apatriarca
È il quarto valore ma l'indice è uguale a \(3\).