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é
Il y a quelques problèmes avec ceci. –
Pouvez-vous me donner une idée de la suite? Je suis perdu. – DoctaMag
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. –