2010-05-19 5 views
4

J'ai un problème dans le langage d'assemblage que j'ai eu accès à l'élément d'un tableau ... supposons qu'un tableau contient des semaines jour ... comme le soleil, mon, mar, mar. ... je dois accéder au 2ème index du tableau ... Comment puis-je faire ça?accéder à l'élément de tableau dans le langage d'assemblage (windows)

+2

Langue de l'assemblage pour quelle plateforme? Z80? 6502? 80x86? 680x0? – Guffa

+0

Publiez n'importe quel code que vous avez écrit pour ceci jusqu'ici et alors les gens ici peuvent vous aider à le faire fonctionner. –

+0

@Guffa - Considérant qu'il dit windows, vraisemblablement assemblage x86 – PhiS

Répondre

11

L'indexation dans l'assemblage est fondamentalement identique à C/C++, sauf pour une différence: vous devez connaître la taille de vos éléments de données.

Par exemple, pour une boucle à travers un tableau d'octets (ou caractères dans une chaîne) dans l'assemblage, vous pouvez effectuer les opérations suivantes:

mov eax, 0 
mov ecx, 0 

loop_start: 
    cmp ecx, ARRAY_LENGTH 
    jge loop_end 

    add eax, BYTE PTR myArray[ecx] 

    add ecx, 1 
    jmp loop_start 
loop_end: 

Comme vous pouvez le voir, le tableau est mis en boucle par un élément à un temps en incrémentant ecx (que j'utilise comme compteur). Chaque élément est ajouté à eax qui contient la somme à la fin de la boucle. Notez que j'ai dû ajouter "BYTE PTR" en référence au tableau pour dire à l'assembleur quel type de données j'utilise.

maintenant un coup d'oeil à ce code qui fait la même chose pour les données DWORD (4 octets):

mov eax, 0 
mov ecx, 0 

loop_start: 
    cmp ecx, ARRAY_LENGTH 
    jge loop_end 

    add eax, myArray[ecx*4] 

    add ecx, 1 
    jmp loop_start 
loop_end: 

Seules deux choses ont changé: je ne avais plus besoin d'utiliser « BYTE PTR » ici parce que, à moins que autrement dit, l'assembleur suppose que vous utilisez des types de données 32 bits sur une machine 32 bits; J'avais aussi besoin de changer l'index du tableau en "ecx * 4" car chaque élément du tableau a une longueur de 4 octets. La plupart des types de données utilisés sur les machines 32 bits ont une taille de 32 bits, donc l'exemple suivant sera plus commun.

Pour répondre à votre question, voici une façon de boucle à travers un tableau de chaînes et de les afficher:

.data 
    sunday db "Sun",0 
    monday db "Mon",0 
    tuesday db "Tues",0 
    wednesday db "Wed",0 
    thursday db "Thurs",0 
    friday db "Fri",0 
    saturday db "Sat",0 

    daysOfWeek dd OFFSET sunday, OFFSET monday, OFFSET tuesday OFFSET wednesday 
      dd OFFSET thursday, OFFSET friday, OFFSET saturday 

.code 
mov ecx, 0 

loop_start: 
    cmp ecx, 7 
    jge loop_end 

    mov eax, daysOfWeek[ecx*4] 
    ; eax now contains the pointer to the 
    ; next element in the array of days 

    add ecx, 1 
    jmp loop_start 
loop_end: 

Parce que des pointeurs sur une machine 32 bits sont larges 32 bits, les traiter comme DWORDs comme dans le deuxième exemple.

+0

btw il est nitpicking mais vous pouvez simplifier l'assemblage en comptant vers le bas au lieu de vers le haut: 'mov ecx, ARRAY_LENGTH; loop_start: ajoute eax, BYTE PTR myArray [ecx]; dec ecx; jnz loop_start' – galois

+1

Je ne savais pas comment il allait utiliser les cordes. S'il allait les sortir à l'écran, il serait étrange de les voir dans l'ordre inverse. L'optimisation prématurée est la racine de tout Mal. – Sparafusile

Questions connexes