执行封装的二进制文件



我正在尝试执行一个封装在我自己的汇编代码中的二进制文件,有一些原因,比如我想进行一些初始化,看看二进制文件的行为,然而,即使没有任何这样的初始化,我也无法执行二进制文件,在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,因此所有数据都被写入内存中的一个位置,覆盖了以前的内容。。。多么愚蠢。

相关内容

  • 没有找到相关文章

最新更新