我正在尝试执行一个封装在我自己的汇编代码中的二进制文件,有一些原因,比如我想进行一些初始化,看看二进制文件的行为,然而,即使没有任何这样的初始化,我也无法执行二进制文件,在uart上没有输出,lcd(我正在运行一个基于arm cortexa-8的qsd8250b芯片组,为mdp(移动开发平台)供电)我知道包装好的二进制文件在我的板上运行得很好,因为我以前(不到一天前)使用过它。
问题是,我不确定/info不可用关于二进制文件在内存中的加载位置。
这是我迄今为止的代码
.org 0
.type _start,#function
.globl _start
_start:
b main
@@ Snipped headers @@
.org 0x1000
main:
mov r9, pc @r9= address of loadlk in memory
ldr r2, =loadlk @r2= address of loadlk in objfile
loadlk:
sub r0, r9, r2 @r0= r9-r2 = address of _start in memory
add r0, r0, #0x1200 @r0= r0 + 0x1200 = lkbin_start (src)
add r3, r0, #0xD000 @r3= r0 + 0xd000 = lkbin_start + ~sz(lk.bin) = lkbin_end (end)
cpy:
ldr r1, =0x28000000 @r1= destination (dst)
ldr r2, [r0],#4
str r2, [r1],#4
cmp r0, r3 @current read address ?= end, r0 < r3 -> branch back
blo cpy
ldr r9, =0x28000000
ldr r4, =0xa9000864 @Flashlight
ldr r5, =0xa9000814
ldr r4, [r4, #0]
orr r6, r4, #0x200000
str r6, [r5, #0]
dsb sy
isb sy
bx r9
b .
.ltorg
.org 0x1200
lkbin_start:
.incbin "lk.bin"
lkbin_end:
.align 8
这是我的编译脚本
arm-none-eabi-as bootwrapper.S -o bootwrapper.o
arm-none-eabi-objcopy -O binary bootwrapper.o binary
当我看到我的手电筒闪烁时,它确实到达了手电筒代码,但随后什么也没发生,从我所能想到的,它将垃圾代码复制到目标并试图执行它
有什么帮助吗?
指令.org不会将代码放在您认为的地址中。它会生成认为自己在那个位置的代码。在执行代码之前,您需要将代码和数据放置在正确的布局中。
我建议您使用objdump-d来获得代码中实际生成内容的汇编视图。
好吧,我不知道我晚上会这么傻。。。
cpy:
ldr r1, =0x28000000 @r1= destination (dst)
ldr r2, [r0],#4
str r2, [r1],#4
cmp r0, r3 @current read address ?= end, r0 < r3 -> branch back
blo cpy
随着循环的进行,r1的值总是0x28000000,因此所有数据都被写入内存中的一个位置,覆盖了以前的内容。。。多么愚蠢。