执行包装二进制

时间:2012-04-02 23:59:31

标签: assembly arm wrapper execute binary-data

我正在尝试执行一个包含在我自己的汇编代码中的二进制文件,有一些原因,比如我想做一些init并查看二进制文件的行为,但是即使没有任何这样的init,也无法执行二进制文件,没有输出on uart,lcd(我正在运行基于arm cortexa-8的qsd8250b芯片组为mdp [移动开发平台]供电)我知道包装的二进制文件在我的主板上完美运行,因为我之前已经使用过它(不到一天前)。 / p>

问题是,我不确定/有关二进制文件在内存中的加载位置的信息不可用。

这是我目前的代码

.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

当我看到我的手电筒闪烁时,它肯定会到达手电筒代码,但是没有任何反应,我认为它会将垃圾代码复制到目标并尝试执行它。

任何帮助?

2 个答案:

答案 0 :(得分:0)

指令.org不会将您的代码放在您认为的地址中。它会生成认为它位于该位置的代码。在代码执行之前,您需要将代码和数据放在适当的布局中。

我建议您使用objdump -d来获取从代码中生成的内容的程序集视图。

答案 1 :(得分:0)

好吧,我不知道我晚上会这么傻......

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,因此所有数据都写入内存中的一个位置,覆盖以前的内容......多么愚蠢。