Domanda

Così sto viene insegnato assemblaggio e noi abbiamo un compito che è quello di trovare la differenza di tempo tra la lettura dalla memoria e la lettura dalla cache. Dobbiamo fare questo con la creazione di 2 passanti e li tempi. (Si legge dalla memoria principale e l'altro dalla cache). Il fatto è che non lo so e non riesco a trovare nulla che mi dice come leggere sia da cache o memoria principale = /. Potrebbe ragazzi mi può aiutare? Lo sto facendo in Masm32. Capisco come fare loop e così la maggior parte del linguaggio assembly, ma non riesco proprio a farlo leggere = /


Modifica

Ho una domanda, ho fatto questo ...

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

... vorrei che essere ok?


Modifica 2:

beh, allora, non intendo fare leva e apprezzo il vostro aiuto, non mi resta che un'altra domanda, dal momento che si tratta di due cicli che devo fare. Ho bisogno di confrontarli in qualche modo, ho cercato per un'istruzione timer, ma non ho trovato alcun ho trovato solo: timeGetTime , GetTickCount e contatori di prestazioni , ma per quanto ne capisco queste istruzioni per la restituzione del non tempo di sistema il tempo necessario per il ciclo alla fine. C'è un modo per fare davvero quello che voglio? o ho bisogno di pensare ad un altro modo?

Inoltre, per leggere da diversi registri nel secondo ciclo (quello non leggere dalla cache) è ok se io do varie istruzioni "mov"? o sono di base totalmente fuori qui?

Ci scusiamo per tutte queste domande, ma ancora una volta grazie per il vostro aiuto.

È stato utile?

Soluzione

Per leggere dalla cache. hanno un ciclo che legge dalla stessa (o molto simili) indirizzo di memoria:

  • La prima volta che si legge da questo indirizzo, i valori che l'indirizzo di memoria (e da altri, indirizzo di memoria nelle vicinanze) verrà spostato nella cache
  • Il Avanti il tempo di leggere da questo stesso l'indirizzo, i valori sono già memorizzate nella cache e così stai leggendo dalla cache.

Per leggere la memoria memorizzata nella cache, un ciclo che legge da molti, molto diverso (cioè più distanti rispetto alla dimensione della cache) indirizzi di memoria.


Per rispondere alla tua seconda domanda:

  • Le cose che stai facendo con ECX e jnz guardare OK (non so come precisa / sensibile il timer è, ma si potrebbe desiderare di ciclo più di 100 volte)

  • Il mov eax, eax non è "leggere la memoria" ... si tratta di un no-op, che si muove in eax eax. Invece, credo che la sintassi MASM per la lettura dalla memoria è qualcosa di più simile a mov eax,[esi] ( "leggere il dalla locazione di memoria il cui indirizzo è contenuto in esi")

  • A seconda di cosa O / S che si sta utilizzando, è necessario leggere da un indirizzo di memoria che in realtà esiste ed è leggibile. Su Windows, ad esempio, un'applicazione non sarebbe permesso di fare mov esi, 0 seguito da mov eax, [esi] perché un'applicazione non è permesso di leggere la memoria il cui indirizzo / posizione è pari a zero.


Per rispondere alla tua terza domanda:

  

timeGetTime, GetTickCount e contatori di prestazioni

Il tuo menzionare timeGetTime, GetTickCount e contatore delle prestazioni implica che si sta eseguendo in Windows.

Sì, questi restituire l'ora corrente, a diverse risoluzioni / precisione: per esempio, GetTickCount ha una risoluzione di circa 50 msec, quindi non riesce a eventi temporali che durano meno di 50 msec, è imprecisa quando temporizzazione eventi che durano solo 50-100 msec. Ecco perché ho detto che 100 nel vostro ecx probabilmente non è abbastanza grande.

La funzione QueryPerformanceCounter è probabilmente il timer più preciso che si ha.

Per usare qualsiasi di questi timer come un timer a intervalli:

  • Prendi il tempo, prima di iniziare a ciclo
  • Prendi il tempo ancora una volta, dopo aver finito di loop
  • Sottrarre questi due volte: la differenza è l'intervallo di tempo
  

E 'ok se io do varie istruzioni "mov"?

Sì penso di sì. Penso che si possa fare in questo modo (attenzione non sono sicuro / non ricordo se questa è la sintassi MASM giusto per la lettura da una posizione di memoria nome) ...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

... dove memory1 attraverso memory5 sono indirizzi delle variabili globali ampiamente distanziati nel segmento di dati.

In alternativa, si potrebbe fare ...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

... dove esi sta puntando al fondo di un lungo pezzo di memoria, ed è un po 'edx incremento che è pari a circa un quinto della lunghezza del pezzo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top