-1

我正在研究 ARM 程序集(Raspberry pi)中的程序,但我遇到了问题。

我有这段代码,但下半部分总是在执行(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$:

我错过了什么?

调试功能只是通过 UART 将 r0 - r4 发送到我的电脑。

当我运行这个时,最后,r3 是 7。应该仍然是 4。

提前致谢

劳伦斯·伍兹

编辑:这是使用的其他功能。

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}

第二次编辑:我已使用此代码设置堆栈指针。

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 = .;
4

2 回答 2

1

我发现了这个问题的问题(和答案)。

问题是,我正在读取一个字节并使用 ldr 寻址,所以输出字的前 24 位有一些垃圾。

而不是 ldr 我应该使用 ldrb (加载字节)。

UART0_write 函数只发送寄存器的最低字节,所以看起来是对的。

劳伦斯

于 2016-03-24T20:26:59.647 回答
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(数字 1),正如预期的那样,7 小于 10。

这是在树莓派 A+ 上。

当您使用相同的代码时,您会得到什么?

于 2016-03-24T18:22:36.483 回答