Помощь с программой сборки GBA ARM - PullRequest
4 голосов
/ 26 апреля 2010

Я пытался изменить эту программу сборки ARM (см. Внизу страницы) для использования подпрограмм. Он должен отображать красный экран на GBA (и компилировать пример программы, которую он на самом деле делает, так что это не проблема использования цепочки инструментов), но, когда я запускаю его, экран становится черным. Я пользуюсь devkitARM 30

.arm
.text
.global main
main:
    mov r0, #0x4000000
    mov r1, #0x400
    add r1, r1, #3
    str r1, [r0]
    mov r0, #0x6000000
    stmdb sp!, {r0, r2, lr} @push registers before calling
    mov r0, #0xff
    mov r1, #0
    mov r2, #0
    bl set_rgb
    mov r1, r0
    ldmdb sp!, {r0, r2, lr} @restore registers
    mov r2, #0x9600
loop1:
    strh r1, [r0], #2
    subs r2, r2, #1
    bne loop1
infin:
    b infin

set_rgb:
    @r0: R; r1: G; r2: B; r0: RGB

    @truncate everything but the least significant five bits
    and r0, r0, #0x1f
    and r1, r1, #0x1f
    and r2, r2, #0x1f
    @form the color
    orr r0, r0, r1, lsl #5
    orr r0, r0, r2, lsl #10
    mov pc, lr @return

Вопрос в том, что не так в этой программе?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

Я решил это самостоятельно.

Проблема была в том, как я использовал стек. Вместо stmdb и ldmdb мне нужно было использовать stmfd и ldmfd.

0 голосов
/ 26 апреля 2010

stmdb означает уменьшение до, а затем использовать этот адрес для начала записи в стек, это правильно. ldmia означает приращение после, поэтому начните с текущего указателя стека, чтобы прочитать значения обратно в их регистры, затем увеличьте указатель стека. номенклатура ФД для меня никогда не имела смысла. Как и переходы при равенстве и переходы, если ноль - это одна и та же инструкция для всех процессоров, и некоторые асмы предлагают оба варианта, есть только два варианта ldm и stm, и все db, ia, fd отображаются в эти два варианта. Мне легче запомнить увеличение после (ldmia) и уменьшение до (ldmdb). Или, если вы по какой-то причине поворачиваете бит направления загрузки / сохранения, вы все равно выбираете правильный шаг до или после, в зависимости от того, что вы пытаетесь сделать.

В C это похоже на * (ptr ++) против * (++ ptr)

...