首页 > 解决方案 > ARMv8 Bare Metal with FASMARMfor a Raspberry Pi 3

问题描述

我在这方面非常努力。我的程序应该做的是,将我在代码中告诉它的任何文本闪烁为莫尔斯电码。但它不会编译...

这是完整的代码:

BCM2835_BASE = 0x3f200000
GPFSEL1 = 0x04
GPFSEL2 = 0x08
GPSET0 = 0x01c
GPCLR0 = 0x28

SET_BIT3 = 0x08
SET_BIT21 = 0x200000
SET_BIT27 = 0x8000000
SET_BIT19 = 0x80000
STACKP = 0x8000
TIMERADR = 0x3f003004
ONEUNIT = 0x3D090
THREEUNIT = 0xB71B0

format binary as 'img'
include 'LIB\FASMARM.INC'

main:
        mov sp,#0x8000
        ldr r0,[#BCM2835_BASE]
        ldr r1,[#SET_BIT3]
        str r1,[r0,#GPFSEL2]
        ldr r1,[#SET_BIT21]
        ldr r2,[#SET_BIT27]
        str r2,[r0,#GPFSEL1]
        ldr r2,[#SET_BIT19]
        ldr r8,[#TIMERADR]
        ldr r6,[#ONEUNIT]
        ldr r7,[#THREEUNIT]

        bl morse_s
        bl morse_o
        bl morse_s
        bl end_wait
b main

turnon_short:
        push {lr}
        str r1,[r0,#GPSET0]
        str r2,[r0,#GPSET0]
        bl delay_short
        pop {pc}

turnon_long:
        push {lr}
        str r1,[r0,#GPSET0]
        str r2,[r0,#GPSET0]
        bl delay_long
        pop {pc}

turnoff_short:
        push {lr}
        str r1,[r0,#GPCLR0]
        str r2,[r0,#GPCLR0]
        bl delay_short
        pop {pc}

turnoff_long:
        push {lr}
        str r1,[r0,#GPCLR0]
        str r2,[r0,#GPCLR0]
        bl delay_long
        pop {pc}

delay_short:
        push {lr}
        ldr r10,[r8]
        add r10, r10, r6
        bl compare
        pop {pc}

delay_long:
        push {lr}
        ldr r10,[r8]
        add r10, r10, r7
        bl compare
        pop {pc}

compare:
        push {lr}
        delay:
                ldr r9, [r8]
                cmp r10, r9
                bne delay
        pop {pc}

morse_a:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_b:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_c:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_d:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_e:
        push {lr}
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_f:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_g:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_h:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_i:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_j:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_k:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_l:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_m:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_n:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_o:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_p:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_q:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_r:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_s:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

morse_t:
        push {lr}
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_u:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_v:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_w:
        push {lr}
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_x:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_y:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_long
        pop {pc}

morse_z:
        push {lr}
        bl turnon_long
        bl turnoff_short
        bl turnon_long
        bl turnoff_short
        bl turnon_short
        bl turnoff_short
        bl turnon_short
        bl turnoff_long
        pop {pc}

end_wait:
        push {lr}
        ldr r10,[r8]
        add r10, r10, r7
        add r10, r10, r7
        add r10, r10, r6
        bl compare
        pop {pc}

如果我取出零件

        ldr r0,[#BCM2835_BASE]
        ldr r1,[#SET_BIT3]
        str r1,[r0,#GPFSEL2]
        ldr r1,[#SET_BIT21]
        ldr r2,[#SET_BIT27]
        str r2,[r0,#GPFSEL1]
        ldr r2,[#SET_BIT19]
        ldr r8,[#TIMERADR]
        ldr r6,[#ONEUNIT]
        ldr r7,[#THREEUNIT]

它可以编译(但 ofc 不起作用)。所以我犯的错误肯定在上面的那部分。我很确定我对 ldr 指令及其工作原理有误解。许多小时的搜索并没有帮助他解决这个问题。我希望你们中的一些人可以做到。非常感谢并提前感谢。

错误消息是:立即偏移超出范围(-0xfff 到 0xfff)

标签: assemblyraspberry-pi3gpiobare-metalfasm

解决方案


推荐阅读