Indirizzamento della memoria assembler ?

vincenzoj
#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
apatriarca
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]

vincenzoj
Si, scusami. Sto programmando in Assembly 8086.
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 ?

vict85
Muovi il quinto elemento dell'array in ecx. Il fatto che sia il quarto è perché esi = 4.

apatriarca
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].

vincenzoj
#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] 
?

apatriarca
La stessa cosa, cambia solo l'indice.

vincenzoj
Ok quindi in questo caso parto da c[1], quindi 2 e aggiungo 2 caselle, arrivando al valore 4. Giusto ?

apatriarca
È il quarto valore ma l'indice è uguale a \(3\).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.