выполнение упакованного двоичного файла - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь выполнить двоичный файл, заключенный в свой собственный ассемблерный код, есть причины, по которым я хочу выполнить некоторую инициализацию и посмотреть, как ведет себя двоичный файл, однако я не могу выполнить двоичный файл даже без такой инициализации, без выводана uart, lcd (я использую чипсет qsd8250b на базе cortexa-8, использующий mdp [платформу мобильной разработки]). Я знаю, что упакованный двоичный файл отлично работает на моей плате, поскольку я использовал его ранее (менее дня назад).

Проблема в том, что я не уверен, что / информация недоступна относительно того, где двоичный файл загружен в память.

Это мой код до сих пор

.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 голосов
/ 29 июня 2012

Хорошо, я не знал, что могу быть таким глупым ночью ...

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, поэтому все данные были записаны в одинместо в памяти перезаписывает предыдущее содержимое ... как глупо.

0 голосов
/ 13 апреля 2012

Директива .org не будет размещать ваш код по адресу, который вы считаете. Он будет генерировать код, который думает, что он находится в этом месте. Вам нужно разместить свой код и данные в правильной компоновке, прежде чем код будет выполнен.

Я бы посоветовал вам использовать objdump -d, чтобы получить представление сборки того, что действительно сгенерировано из вашего кода.

...