2012-10-24 5 views
2

Ceci est une question de devoirs, mais je suis bloqué.Plus grand entier dans l'assemblage ARM

La mission est de trouver le plus grand entier dans un tableau. Voici le code C on nous donne:

#include <stdio.h> 
#include <stdlib.h> 

extern int mybig(int array[]) ; 

void main(char * argv[], int argc) 
{ 
int array[] = { 5, 15, 100, 25, 50, -1 } ; 

int biggest ; 

biggest = mybig(array) ; 

printf("Biggest integer in array: %d\n", biggest) ; 

} 

J'ai fait une douzaine de versions de l'assemblée jusqu'à présent, mais est le plus proche, je suis devenu

.global mybig 
mybig: stmfd sp!, {v1-v6, lr} 
    mvn v1, #0 
loop: ldrb a4, [a1], #4 
    MOVLT a4, a1 
    cmp a1, v1 
    bne loop 
    ldmfd sp!, {v1-v6, pc} 
    .end 

Chaque fois que je créer un lien ensemble, j'ai frappé une boucle infinie, et je ne sais pas pourquoi. Toute aide serait grandement appréciée, le professeur ne nous a rien appris dans un cours d'introduction, nous a juste dit de le faire, et nous a donné un lien vers un toolchain pour compiler et assembler.

EDIT: C'est où je suis arrivé. Le programme ne fonctionne pas, frappe juste une boucle infinie.

.global mybig 
mybig: stmfd sp!, {v1-v6, lr} 
    mvn v1, #0 
    mov a3, a1 
loop: ldr a4, [a1], #4 
    cmp a4, a1 
    MOVMI a3, a1 
    cmp a1, v1 
    bne loop 
    mov a1, a4 
    ldmfd sp!, {v1-v6, pc} 
    .end 

code C n'a pas changé

+0

Il y a quelques problèmes avec ceci. –

+0

Pouvez-vous me donner une idée de la suite? Je suis perdu. – DoctaMag

+0

1.) Vous utilisez ldrb, qui charge des octets et non des mots. 2.) Il n'est pas nécessaire de pousser n'importe quel registre sur la pile, car vous pouvez utiliser librement a1-a4 et ip pour le stockage temporaire. Pour revenir à l'appelant, vous pouvez utiliser bx lr. 3.) Vous ne comparez pas la valeur que vous chargez avec votre valeur la plus élevée actuelle. Juste avec -1, qui est probablement censé être le marqueur de fin. Mais cette vérification échoue également à cause du ldrb. –

Répondre

1

Ce serait ma solution:

.global mybig 
mybig: 
    // a1 = Highest word, defaults to 0x80000000 = −2,147,483,648 
    // a2 = Pointer to array 
    // a3 = current word 
    mov a2, a1 
    mov a1, #0x80000000 
.Lloop: 
    ldr a3, [a2], #4 // Load word and advance pointer by 4 bytes 
    cmn a3, #1  // Compare with -1 
    bxeq lr   // Return if endmarker was found 
    cmp a1, a3  // Compare current highest word and new word 
    movlt a1, a3  // Replace highest word if it was smaller 
    b  .Lloop  // Loop again 
    .end 

Bien que ce n'est pas le meilleur code possible en ce qui concerne la performance, il devrait être auto expliquer.

+0

Merci beaucoup pour tous les commentaires. Je comprends ce que j'ai fait de mal, et je vais formuler mes propres réponses pour ne pas plagier votre solution. – DoctaMag

Questions connexes