2016-11-15 4 views
0
start 

read 

    BL getkey    ; read key from console 
    CMP R0, #0x0D   ; while (key != CR) 
    BEQ endRead    ; { 
    BL sendchar   ; echo key back to console  

    CMP R0, #' '   ; if (ro = ' ') 
    BNE nocount    ;{       
    ADD R7, R7, #1   ; r7 += 1 
    LDR R4, =0    ; r4 = 0 
nocount      ;} 

    MOV R6, R0    ; Store input in R6 
    SUB R6, R6, #'0'  ; Convert from decimal to hex 
    MULS R4, R5, R4   ; If there is another input, multiply total by 10 
    ADDS R4, R4, R6   ; Add the input to the total 

    ADD R8, R4, R8   ;sum 

    B read  

endRead     

end      

stop B stop 

    END 

Salut, J'essaie d'avoir mon code alors quand il y a un espace entré dans la console, 1 sera ajouté à R7 et R4 seront mis à 0.ARM Assembly, l'enregistrement n'étant pas défini sur 0?

Quand un espace est ajouté , R4 est mis à 0xFFFFFFF0, mais quand j'ajoute '5' à ceci, j'obtiens 0xFFFFFFF65. Je m'attends à juste obtenir 0x00000005. C'est bizarre, parce que quand je mets la même commande en dehors de la comparaison, ça marche. Toute aide est appréciée, merci.

Aussi je veux que r8 soit la somme des nombres entrés, il ne semble pas fonctionner correctement, quelqu'un peut-il me dire pourquoi?

+0

Je ne suis pas, je n'ai pas inclus cette partie du code. Chaque fois qu'il y a une entrée, j'enlève '0'. –

+2

OK - vous devez fournir un [mcve]. –

+2

BEQ n'est-il pas le mauvais test de branche? Quand 'espace' est entré, il saute les 2 lignes. –

Répondre

1

Avez-vous exploré l'exécution conditionnelle ADD, etc?

Suppose: ARMv7 Ma machine = Linux 4.4.26-v7 Raspberry Pi + # 915 SMP Jeu 20 octobre 17:08:44 CEST 2016 armv7l GNU/Linux

 cmp r0, #0x20   // white space - space char 
     addeq r7, r7, #1  // conditional add 
     eoreq r4, r4   // conditional zero 
+0

Je n'ai pas trop chaud sur ARM, mais est-ce que 'addeq r7, r7, # 1' n'affecterait pas le drapeau' Z' avant 'eoreq r4, r4'? –

+0

@WeatherVane Non, parce que c'est 'add', pas' adds';) – Notlikethat

+0

Oh, et il n'y a vraiment pas besoin d'obscur x86-isms sur ARM - quand tous les encodages d'instructions sont de la même taille, vous ne sauvegardez rien en n'utilisant pas l'évidence 'moveq, r4, # 0'. – Notlikethat

0
LDR R4, =0 

ne pas attribuer zéro au registre. Il charge le registre à partir de l'adresse de mémoire 0. Utilisez

MOV R4, #0 

à la place.

+0

Essayé cela déjà, même résultat –

+0

Ensuite, ce n'est pas votre seule erreur :) –

+1

Il ** fait ** attribuer zéro au registre. En fait, GAS le remplace même par un 'mov' automatiquement. – Jester

0

En ce qui concerne la somme des nombres; s'il vous plaît l'exemple ci-dessous d'une boucle simple décrémentée où la somme de chaque nombre est ajoutée à R1. J'espère que cela t'aides.

main: nop 

     eor r2, r2 
     mov r1, #0xf 
     1: 

     add r2, r2, r1 
     bl write 

     subs r1, #1 
     bne 1b 

SORTIE:

15 15 
14 29 
13 42 
12 54 
11 65 
10 75 
9 84 
8 92 
7 99 
6 105 
5 110 
4 114 
3 117 
2 119 
1 120 
0

tout le monde Désolé, le code est correct, il était tout simplement pas dans la bonne position, merci à tous!

+0

Non, ce n'est pas le cas. Vous devez au moins définir des registres aux valeurs initiales connues. –