2012-05-15 22 views
7

Domanda veloce per voi ragazzi, nel mio ciclo ho bisogno di usare CMP, BLT e BGT per confrontare alcuni valori. Come utilizzerebbero dette istruzioni nel seguente ciclo?ARM Assembler - Come si usano CMP, BLT e BGT?

Sto provando a utilizzare BGT, BLT e CMP perché ne ho bisogno per far funzionare la mia applicazione. Il problema è che non ho idea di come usarli. Se volessi usare CMP per confrontare r6, con r4 e mettere la differenza in r7, come farei? La stessa domanda se volessi usare BLT se r7 è minore di 0, come farei?

BGT ??????? ; branch if greater than 5 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BGT ???????? ;branch if r7 is greater than 0 

Ecco il mio intero ciclo:

LoopStart 

    BL WaitBUT1 
    BL readTemp 
    BL checkTemp 
    BGT ??????? ; branch if greater than 5 
    BL errorVal 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BL FanOn 
    BL errorLedOn 
    BL systemLedOn 
    BL heaterOn 
    BGT ???????? ;branch if r7 is greater than 0 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 
    BL WaitBUT2 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 

    B LoopStart 
+0

Le tue domande non sono chiare. Si prega di precisare. –

+1

Ho aggiunto un'ulteriore descrizione alla mia domanda. – user1080390

risposta

9

Non è possibile eseguire un ramo condizionale senza prima impostare il registro delle condizioni in qualche modo. Questo può essere fatto con cmp o aggiungendo s alla maggior parte delle istruzioni. Controlla la documentazione dell'assembly ARM per i dettagli. rapido esempio:

Branch se r0 superiore a 5:

cmp r0, #5 ;Performs r0-5 and sets condition register 
bgt label_foo ;Branches to label_foo if condition register is set to GT 

Confronta r6 con r4, messo differenza in r7, ramo se r7 < 0:

subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register 
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4) 
1

se volevo usa CMP per confrontare r6, con r4 e metti la differenza in r7, come farei?

subs r7, r6, r4 /* r7 ← r6 - r4 */ 

La stessa domanda se volevo usare BLT se R7 è minore di 0, come farei questo?

bmi _exit   /* branch if r7 < 0 */ 

BMI (minus/negativa) Quando N è abilitata (N è 1) dove N è un flag che sarà attivata se il risultato dell'operazione produce un numero negativo. Diversamente disabilitato.

Perché subS anziché sub? Poiché S è un suffisso opzionale che quando viene specificato, i flag di condizione (come N) vengono aggiornati sul risultato dell'operazione.

Saluti.