5 Stimmen

Hilfe beim GBA ARM Assemblerprogramm

Ich habe versucht, die こん ARM-Assemblerprogramm (siehe unten auf der Seite), um Unterprogramme zu verwenden. Es sollte einen roten Bildschirm auf dem GBA anzeigen (und wenn ich das Beispielprogramm kompiliere, tut es das auch, also ist es kein Problem mit der Toolchain), aber wenn ich es ausführe, wird der Bildschirm stattdessen schwarz. Ich verwende 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

Die Frage ist, was in diesem Programm falsch ist.

4voto

Federico klez Culloca Punkte 24141

Ich habe es selbst gelöst.

Das Problem war die Art und Weise, wie ich den Stapel verwendet habe. Anstelle von stmdb y ldmdb Ich musste die stmfd y ldmfd .

1voto

old_timer Punkte 65318

stmdb bedeutet vorher abnehmen und dann diese Adresse verwenden, um mit dem Schreiben auf den Stack zu beginnen, ist dies korrekt.

ldmia bedeutet Inkrement nach beginnen Sie also mit dem aktuellen Stapelzeiger, um die Werte zurück in ihre Register zu lesen, und erhöhen Sie dann den Stapelzeiger.

El fd Die Nomenklatur hat für mich nie einen Sinn ergeben. So wie "jump if equal" und "jump if zero" für alle Prozessoren derselbe Befehl sind und einige Asms beide anbieten, gibt es nur zwei Varianten von ldm y stm die db , ia , fd fallen alle in diese beiden Geschmacksrichtungen.

Es fällt mir leichter, mir das Inkrement nach ( ldmia ) und vorher dekrementieren ( ldmdb ). Oder wenn Sie die Richtung des Ladens/Speicherns aus irgendeinem Grund umdrehen, dann wählen Sie immer noch das richtige Inkrement davor oder danach, je nachdem, was Sie zu tun versuchen.

In C ist es wie *(ptr++) vs *(++ptr)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X