assembly - 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)
解决方案
推荐阅读
- javascript - Safari 在 URL 中将“”(空字符串)转换为 0
- c# - 如何将一个类的对象转换为另一个类(类成员不同)
- c++ - 如何防止 CMake 在生成项目的根目录添加 CMakeLists.txt?
- javascript - 在 jasmine 测试中覆盖 ajax 调用
- ios - 将复杂的 JSON 解析为 UITableView 和 UICollectionView
- outlook - 如何在 Windows 桌面应用程序中调试 Outlook 插件?
- android - Android Studio 无法正确安装构建 apk 文件
- grails - 我们如何使用 Grails 域或 GORM 截断表?
- python - 我的 val_loss 波动,每 5 步我的 val_los 都很高
- vue.js - Vue js + HighChart - 如何在组件渲染之前进行同步 axios 调用?