2016-12-05 4 views
0

Donc j'apprends l'assemblage et j'ai écrit un programme pour additionner les valeurs que je définis dans 'data_type'.Assembly Beginner: Définir une variable égale au nombre de valeurs dans DCD?

Atm Je dois définir manuellement une variable 'num' égale à la quantité de valeurs dans 'data_type' pour que la boucle les résume toutes.

Je me demandais s'il y avait une meilleure façon de faire cela?

Ou s'il y a un moyen de déclarer dynamiquement la variable 'num' pour supposer la quantité de valeurs dans 'type_données'?

Merci d'avance!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

Vous n'êtes pas sûr de votre assembleur, mais: 1) que se passerait-il si 'data_values' n'est pas aligné? Si cela fonctionne de la même manière que les autres assembleurs, ce symbole 'data_values' aura la valeur d'adresse non alignée, tandis que le' DCD' va définir les données alignées, donc votre code fera un accès non aligné aux mauvais octets de données. Je crois que vous devriez échanger ces deux, aligner d'abord, puis définir l'étiquette symbolique. 2) que se passe-t-il après 'BNE'? Ou est-ce que vous exécutez simplement ceci dans le débogueur jusqu'à ce point, ne le laissant jamais sortir de votre code défini? – Ped7g

+0

D'accord, je vais les échanger maintenant. Utilisation des outils Keil Je suis juste en train de lancer BNE dans un débogueur car c'est juste un exercice d'apprentissage, avez-vous des recommandations pour réaliser ce que j'ai demandé ci-dessus? – ohkneel

Répondre

1

Je me demandais s'il y a une meilleure façon de le faire?

Opinion basée ... et trop large. Il existe de nombreuses façons de structurer vos données, chacune d'entre elles pouvant vous convenir dans des situations différentes. Je vais essayer de lister tous les principaux (je parie que j'en oublierai quelques uns).

recompiler:

  • ce que vous avez fait
  • définissent non seulement l'étiquette au début des données, mais aussi à la fin des données, puis de leur différence, vous pouvez calculer la longueur en octets (si assembleur n » t supporte l'expression de base, cela peut nécessiter un calcul d'exécution).
  • De nombreux assembleurs supportent des expressions basiques, où au lieu de définir l'étiquette de fin, vous pouvez faire quelque chose comme num equ (($ - start_label)/4)$ est l'adresse actuelle dans certains assembleurs (probablement pas avec le vôtre, c'est l'exemple x86 TASM/MASM).
  • La taille de l'élément et du tableau est complètement fixée pour toujours (par exemple, "ensemble de 15 chaînes de 5 caractères" => 75 octets exactement et code écrit uniquement pour cela - probablement peu utilisable en cas d'angle limité .. ou mash-up rapide de l'exercice d'apprentissage en mettant l'accent sur quelque chose de différent, où le tableau fixe n'a pas d'importance).

Durée:

  • écrire du code de telle sorte que l'appelant de la fonction doit prendre en charge non seulement l'adresse du tableau, mais aussi sa taille (style API très polyvalent, vous pouvez généralement plier toute autre structure données à traiter par une telle API, bien qu'avec des tableaux à valeurs terminées, il peut ne pas être efficace de manière optimale, car vous devez d'abord calculer la taille) - cela délègue le problème de structure à l'appelant, ne le résout pas seul.
  • utiliser une valeur comme terminateur, comme ASCII Z les chaînes se terminent par la valeur 0.
  • utiliser une structure de données, comme C++ std::vector, où la structure de données interne contient non seulement un pointeur vers la mémoire, mais aussi une variable séparée pour stocker la taille du vecteur (plus plusieurs autres variables conservant la capacité de la mémoire allouée). , etc .. vérifier toute implémentation std::vector pour obtenir l'idée), dans votre cas, vous pouvez aller par exemple pour le plus simple DCD 5, 1, 1, 1, 1, 1 (premier mot est la taille, puis les données suivent).
  • tout ce que vous pouvez penser ..certains des exemples du monde réel sont diverses structures entrelacées, comme les plans de bits séparés dans les anciens modes graphiques couleur EGA 16, où une banque de mémoire stockait un bit par pixel, et pour dessiner un seul pixel, vous deviez passer par les quatre banques de mémoire , en écrivant dans chaque valeur de bit particulier. Vous pouvez à peu près tout créer, ce que vous pouvez définir mathématiquement et écrire du code pour cela.