Question

Je cherche à lire de la mémoire principale en utilisant l'assemblage de masm32 et pour ce faire, je créé (comme recommandé précédemment dans une réponse à une autre de mes questions ici) un tableau qui contiendra les emplacements de mémoire très séparés (pour éviter la lecture du cache). J'ai réussi à créer le tableau et l'ont en cours de lecture, cependant, j'ai un problème. Ce tableau, je l'ai déjà fait et testé travaille avec des données je lui ai donné (à savoir le nombre) et tout fonctionne. Mais j'ai besoin des emplacements de mémoire et je ne trouve nulle part une carte ou des références à celles-ci. Je veux dire que je besoin de quelque chose comme:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

mais au lieu d'utiliser les numéros que je devrais utiliser l'emplacement de mémoire correspondant mots réservés. Mais je ne peux pas les trouver = (ou même avoir une idée de ce que d'autre à chercher.


Modifier

Je vais vérifier si je l'ai bien compris, vous dites-moi que je pouvais (au lieu d'utiliser un tableau utiliser les variables avec tout l'espace entre les forcer à la lecture de la mémoire principale droite?

Était-ce utile?

La solution

est un tableau de (contigus) octets, comme vous avez dit:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

est une variable qui occupe 10 Mo (ce qui est grand par rapport au cache du processeur):

wasted_space BYTE 10485760 DUP(?)

Voici plusieurs variables avec beaucoup d'espace perdu entre:

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

(création de variables dans votre segment de données) est un moyen d'obtenir des adresses de mémoire de données (les variables ne contiennent pas l'adresse ... plutôt, les variables sont à des adresses).

Une autre façon d'obtenir des adresses de mémoire est d'appeler les API O / S, qui allouent la mémoire du tas et renvoyer l'adresse de cette mémoire allouée, par exemple peut-être le HeapAlloc ou VirtualAlloc API.


Je ne sais pas pourquoi vous faites cela dans ASM (sauf pour apprendre l'assemblage). Si elle est d'en apprendre davantage sur la mise en cache, je l'aurais pensé que vous pourriez le faire tout aussi bien (et, plus facilement) en utilisant C.

Quoi qu'il en soit, je me suis curieux de savoir la mise en cache: la quantité d'espace est suffisant pour provoquer un manque de cache? Combien de différentes variables sont nécessaires pour commencer à causer des misses (étant donné que le cache est divisé et ne peut donc contenir plusieurs (mais seulement quelques-uns) caches de mémoire largement espacées)?

(mise en cache) a, au fil des ans, est devenu un sujet complexe, apparemment. http://lwn.net/Articles/252125/ est un article de Wikipedia lié. Cet article comprend des graphiques, par exemple Figure 3.11:. Lecture séquentielle pour plusieurs tailles

Autres conseils

Accès mémoire indirecte à l'Assemblée

Pour traiter les octets dans le tableau que les adresses mémoire, vous devez les charger dans un registre qui peut servir d'adresse de base, puis accéder à la mémoire pointée par le registre:

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

A propos de caches

Notez que votre cache est probablement beaucoup plus grande que la durée des adresses mémoire couvertes par ce tableau, de sorte que tous cadrerait dans le cache.

En outre, considérez que votre cache est probablement associative, ce qui signifie que les adresses très éloignées peuvent tenir ensemble dans le cache si elles ne se produisent pas être sur les lignes de cache même (complet).

Pour exécuter réellement le cache et la garantie que vous devrez accéder à la mémoire directement, vous devez accéder (en boucle) un ensemble d'emplacements de mémoire consécutifs plus gros que le cache. C'est à dire. créer un tableau aussi grand que votre cache. En outre prendre en compte qu'il ya probablement plusieurs couches de cache (L1, L2, L3 et peut-être plus), donc la taille que vous devez être dépend de ce que cache vous voulez dépassement.


J'ai écrit un programme en C pour la mémoire de temps et cache qui accède comme qu'une fois, et avec un calcul statistique et de compensation pour les frais généraux de mesure du temps (qui est non négligeable dans ces échelles peu de temps), a obtenu des résultats vraiment précis ( ce qui pourrait être fait aussi précis que nécessaire en exécutant le test plus longtemps et en attente de l'écart-type pour aller vers le bas).

Mon programme n'a cependant pas la façon la plus efficace de le faire, et n'a pas non plus allusion beaucoup sur l'associativité du cache (je dois mesurer que séparément avec la connaissance du système de coloration). Toutefois, les deux ont été fait assez efficacement d'une manière relativement indépendante l'architecture avec quelques tours de pensée dans la Sigmetrics 2005 travail de Larry McVoy et Carl Staelin .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top