2016-03-24 15 views
-1

Ich arbeite an einem Programm in ARM-Montage (Raspberry Pi), aber ich habe ein Problem.ARM Assembly - CMP falsche Ausgabe

Ich habe diesen Code, aber der untere Teil wird immer ausgeführt (skip $).

mov r1, #3 
mov r3, #4 
add r2, r1, r3 
bl Debug 
cmp r2, #0x0A 
ble skip$ 
    mov r0, #10 
    sub r0, r0, r1 
    mov r3, r0 

    bl Debug 
skip$: 

Was fehlt mir?

Die Debug-Funktion sendet nur r0 - r4 durch UART zu meinem PC.

Als ich das laufen, am Ende ist r3 7. Welche

Laurens Wuyts

bearbeiten noch 4.

Vielen Dank im Voraus sein sollte: Hier sind die anderen verwendeten Funktionen.

Debug: 
push {r0 - r4, lr} 
    mov r4, r0 

    mov r0, #10 
    bl UART_write 
    mov r0, r4 
    bl UART_write 

    mov r0, #11 
    bl UART_write 
    mov r0, r1 
    bl UART_write 

    mov r0, #12 
    bl UART_write 
    mov r0, r2 
    bl UART_write 

    mov r0, #13 
    bl UART_write 
    mov r0, r3 
    bl UART_write 
pop {r0 - r4, pc} 

UART_write: 
    push {r0 - r2, lr} 
    ldr r1, =UART0_FR 

    wait_write$: 
     ldr r2, [r1] 
     tst r2, #0x20 
    bne wait_write$ 

    ldr r1, =UART0_DR 
    and r0, #0x000000ff 
    str r0, [r1] 

    pop {r0 - r2, pc} 

2. Edit: Ich habe diesen Code für den Aufbau des Stapelzeigers verwendet.

setup_stack: 
    mov  r0, #0xD1  @ FIQ 
    msr  cpsr, r0 
    ldr  sp, =stack_fiq 
    mov  r0, #0xD2  @ IRQ 
    msr  cpsr, r0 
    ldr  sp, =stack_irq 
    mov  r0, #0xD7  @ ABT 
    msr  cpsr, r0 
    ldr  sp, =stack_abt 
    mov  r0, #0xDB  @ UND 
    msr  cpsr, r0 
    ldr  sp, =stack_und 
    mov  r0, #0xDF  @ SYS 
    msr  cpsr, r0 
    ldr  sp, =stack_sys 
    mov  r0, #0xD3  @ SVC 
    msr  cpsr, r0 
    ldr  sp, =stack_svc 
    mov  pc, lr 

Und das ist mein Linker:

.= ALIGN(0x1000); 

/* Stack space */ 
. = . + 0x800; 
stack_svc = .; 
. = . + 0x800; 
stack_und = .; 
. = . + 0x800; 
stack_abt = .; 
. = . + 0x800; 
stack_irq = .; 
. = . + 0x800; 
stack_fiq = .; 
. = . + 0x400000; 
stack_sys = .; 
+1

Also 'Debuggen 'beibehalten und alle Register, die es verwendet? – Notlikethat

+0

@Notlikethat Ja, ich habe Push und Pop für alle verwendeten Register verwendet. –

+0

also, wenn Sie die Debug-Zeile blamieren, dann scheitert es auch? –

Antwort

1

Ich habe das Problem (und die Antwort) dieser Frage gefunden.

Das Problem war, dass ich ein Byte von und Adresse mit ldr gelesen, so dass das Ausgabewort einige Müll an den oberen 24 Bits hatte.

Anstelle von ldr sollte ich ldrb (Lade-Byte) verwendet haben.

Die UART0_write-Funktion sendet nur das niedrigste Byte des Registers, also sah es richtig aus.

Laurens

1

Also habe ich diese Funktion, dies zu testen.

.globl TEST 
TEST: 
    mov r1, #3 
    mov r3, #4 
    add r2, r1, r3 
    cmp r2, #0x0A 
    ble skip 
     mov r0,#0x30 
     bx lr 
skip: 
    mov r0,#0x31 
    bx lr 

Und ich sende das Ergebnis (r0) an die uart. Und erhalten Sie eine 0x31 aus (die Zahl 1), wie erwartet, 7 ist weniger als 10.

Dies ist auf einem Raspberry Pi A +.

Wenn Sie den gleichen Code verwenden, was bekommen Sie?

+0

Ich bekomme 0x31, wie erwartet. BTW Ich benutze einen Raspberry Pi Null. –

+1

Ein offensichtlicher Unterschied hier ist, dass dieser Code keine Stapelzugriffe macht. @Laurens dein SP _ist_ zeigt auf irgendwo gesund und beschreibbar, nicht wahr? – Notlikethat

+0

Guter Punkt, ich habe es nicht gesehen! Siehe meinen Top-Post für weitere Informationen. –