Indirizzamento della memoria assembler ?
#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]
Risposte
Prima di tutto il codice che hai scritto funziona solo in particolari compilatori e piattaforme. Come stai imparando a programmare in assembler?
[*:2kt5djyw] Il tipo del puntatore, esattamente come in C, dipende dal tipo di dato su cui stai lavorando. In questo caso è [tt]dword[/tt] che significa 4 byte (32 bit). Il tipo [tt]int[/tt] è normalmente di 32 bit su architetture a 32/64 bit. Se avessi lavorato con degli [tt]short[/tt] avrebbe invece usato [tt]word[/tt] e per un char sarebbe stato [tt]byte[/tt]. Nota che in assembler conta solo la dimensione e non il contenuto, per cui non c'è differenza tra un [tt]int[/tt], un [tt]unsigned[/tt] o un [tt]float[/tt].[/*:m:2kt5djyw]
[*:2kt5djyw] L'istruzione [tt]mov[/tt] permette di fare alcune operazioni aritmetiche sugli indirizzi di memoria. Quell'istruzione sta copiando il valore del quinto elemento dell'array in [tt]ecx[/tt] se non sbaglio. Credo che il tutto stia in pratica calcolando [tt]c = v[0] + v[4][/tt].[/*:m:2kt5djyw][/list:u:2kt5djyw]
Si, scusami. Sto programmando in Assembly 8086.
Ok la spiegazione del dword.
Ma non mi è ancora ben chiaro cosa succede in questa istruzione :
Perchè viene copiato proprio il valore del quinto elemento dell'array ?
Ok la spiegazione del dword.
Ma non mi è ancora ben chiaro cosa succede in questa istruzione :
mov ecx, dword ptr [ebx+esi*4] .
Perchè viene copiato proprio il valore del quinto elemento dell'array ?
Muovi il quinto elemento dell'array in ecx. Il fatto che sia il quarto è perché esi = 4.
Hai scritto il valore del puntatore [tt]b[/tt] in [tt]ebx[/tt] 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 [tt]ecx[/tt].
#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 :
mov eax, dword ptr[ebx + 8]?
La stessa cosa, cambia solo l'indice.
Ok quindi in questo caso parto da c[1], quindi 2 e aggiungo 2 caselle, arrivando al valore 4. Giusto ?
È il quarto valore ma l'indice è uguale a \(3\).