accéder à la matrice de l'élément dans la langue de l'assembly (windows)
J'ai un problème en langage d'assemblage que j'ai eu accès à des éléments du tableau... supposons que le tableau contient des semaines de jour... comme de la dim,lun,mar,mer.... j'ai pour accéder à la 2ème indice du tableau... Comment puis-je faire cela?
Langage d'assemblage pour la plate-forme? Z80? 6502? 80x86? 680x0?
Poste le code que vous avez écrit pour ce si loin et puis les gens ici peuvent vous aider à obtenir ce travail.
Considérant qu'il dit windows, sans doute x86 assemblée
Poste le code que vous avez écrit pour ce si loin et puis les gens ici peuvent vous aider à obtenir ce travail.
Considérant qu'il dit windows, sans doute x86 assemblée
OriginalL'auteur user337099 | 2010-05-19
Vous devez vous connecter pour publier un commentaire.
Indexation dans le cadre de l'assemblée est fondamentalement le même que le C/C++, sauf pour une différence: vous devez connaître la taille de vos éléments de données.
Par exemple, pour parcourir un tableau d'octets (ou de caractères dans une chaîne de caractères) dans un assemblage, vous pouvez effectuer les opérations suivantes:
Comme vous pouvez le voir, le tableau est passé en boucle à travers un élément à la fois par incrémentation ecx (dont je suis à l'aide d'un compteur). Chaque élément est ajouté à eax qui contient la somme à la fin de la boucle. Avis j'ai dû ajouter "BYTE PTR" pour faire référence au tableau pour dire ce que l'assembleur quel type de données que j'utilise.
Maintenant, jetez un oeil à ce code qui fait la même chose pour les données DWORD (4 octets):
Seulement deux choses ont changé: je n'ai plus besoin d'utiliser de "BYTE PTR" ici, parce que, à moins d'avis contraire, l'assembleur suppose que vous êtes à l'aide de données de 32 bits sur une machine 32 bits, mais j'ai aussi besoin de changer l'index du tableau "ecx*4" parce que chaque élément de la matrice est de 4 octets de long. La plupart des types de données utilisés sur les machines 32 bits, 32 bits de taille de sorte que le plus tard exemple sera plus commune.
Pour répondre à votre question, voici un moyen de parcourir un tableau de chaînes de caractères et de les afficher:
Car les pointeurs sur une machine 32 bits 32 bits de large, de les traiter comme DWORDs comme dans le deuxième exemple.
mov ecx, ARRAY_LENGTH; loop_start: add eax, BYTE PTR myArray[ecx]; dec ecx; jnz loop_start
Je ne savais pas comment il allait utiliser les cordes. S'il allait à la sortie à l'écran, il serait étrange de les voir dans l'ordre inverse. L'optimisation prématurée est la racine de tous les maux.
add eax, BYTE PTR myArray[ecx]
de ne pas assembler. Vous avez besoin d'un distinctmovzx
oumovsx
instruction à zéro - ou le signe-s'étendre avant que vous pouvez ajouter à une version 32 bits de registre. Aussi, le idiomatiques structure de boucle en asm a la branche conditionnelle au bas](Pourquoi boucles toujours compilé dans "do...while" style " (queue de saut)?, de sorte que ces exemples sont douloureux à regarder.à moins d'avis contraire, l'assembleur suppose que vous êtes à l'aide de données de 32 bits sur une machine 32 bits Non, l'assembleur en déduit l'opérande de la taille d'un registre. Ou avec MASM, également à partir de la db/dw/jj/dq en
label dd 1,2,3
si vous utilisez un nom de symbole dans votre mode d'adressage.Cordes donc "add eax, memory_address" est le même que "add eax, BYTE PTR memory_address" parce que j'ai utilisé le même registre? Évidemment pas. Mon point est, et je ne pense pas que c'était pas clair, que vous n'avez pas besoin de spécifier la taille de l'opérande dans mon exemple, quand on est à 32 bits sur un ordinateur 32 bits. Cependant, vous pouvez clairement utiliser un 16 ou 8 bits de l'opérande, en indiquant expressément sa taille.
OriginalL'auteur Sparafusile