2016-03-24 2 views
-1

Я работаю над программой в сборке ARM (Raspberry pi), но у меня есть проблема.ARM Assembly - CMP неправильный вывод

У меня есть этот код, но нижняя часть всегда выполняется (пропустить $).

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$: 

Что мне не хватает?

Функция отладки просто отправляет r0-r4 через UART на мой компьютер.

Когда я запускаю это, в конце концов, г3 7. Какой должна быть еще 4.

Заранее спасибо

Лоренса Уитс

Edit: Вот другие функции, которые используются.

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} 

второй Edit: Я использовал этот код для установки указателя стека.

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 

И это мой линкер:

.= ALIGN(0x1000); 

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

Так что 'Debug' сохраняет и восстанавливает все регистры, которые он использует? – Notlikethat

+0

@Notlikethat Да, я использовал push и pop для всех используемых регистров. –

+0

поэтому, когда вы комментируете строку «Отладка» bl, тогда это также не удается? –

ответ

1

Я нашел проблему (и ответ) на этот вопрос.

Проблема заключалась в том, что я читал байты и адреса, используя ldr, поэтому выходное слово содержало мусор в верхних 24 битах.

Вместо ldr я должен был использовать ldrb (load byte).

Функция UART0_write отправляет только младший байт регистра, поэтому он выглядел правильно.

Laurens

1

Так что я создал эту функцию, чтобы проверить это.

.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 

И отправлю результат (r0) на uart. И получите 0x31 out (число 1), как и ожидалось, 7 меньше 10.

Это на малине pi A +.

Когда вы используете тот же код, что получаете?

+0

Я получаю 0x31, как и ожидалось. BTW Я использую ноту малины Pi. –

+1

Одно из очевидных различий здесь в том, что этот код не создает никаких стековых доступов. @Laurens ваш SP _is_ указывает на что-то здравомыслящее и доступное для записи, не так ли? – Notlikethat

+0

Хорошо, я этого не видел! См. Мой главный пост для получения дополнительной информации. –