Scanf ARM Assembly

Ich weiß, es ist eine Frage hier aber ich verstehe wirklich nicht, was der OP getan hat. Ich habe verwendet, x86 assembly vor und für, dass, würde man etwas wie das hier tun:

push dword int1
push dword fmtInput
call scanf
add esp, 12
; value is now in int1

meine Vermutung für den ARM ist so etwas wie das

ldr r0, fmtInput
push r1 @ says this is too complex, tried `ldr r1` but that also failed saying that ldr needed more inputs
bl scanf
@ I'm assuming the value is now in r1

Ich bin sicher, ich bin etwas fehlt einfach, aber ich bin wirklich sehr verloren. Wenn ldr und push nicht funktioniert, dann gibt es einige andere opcode verwenden? Wenn einer von denen richtig ist, welche Kombination von inputs braucht es?

Ich habe auch versucht, die Definition einer num: .word 0 im .data-Abschnitt und mit ldr r1, =num nichts in der .data-Abschnitt scheint statisch zu sein, oder gibt es einen anderen Weg, Sie zu übergeben zu scanf?

Ich bin mit gcc auf einem ARMv7-Prozessor in Qemu, wenn das hilft.

--EDIT--

Hier ist, was ich versuche zu tun, und einige code. Die app druckt " Hallo Welt, bekommt input, fügt ein, druckt den neuen Wert ein. Mein code sieht wie folgt aus:

.text
.align 4
.global main
main:
    @ keep stack 8-byte aligned
    push {ip, lr}

    @ print message
    ldr r0, =message
    bl printf

    @ scanf for number
    ldr r0, =fmtInt
    ldr r1, =num
    bl scanf

    @ add 2 to input and store in r3
    @ldr r1, =num
    mov r2, #2
    add r3, r2, r1

    @ print new value
    ldr r0, =textOut
    mov r1, r3
    bl printf

    @ return 0
    mov r0, #0

    @ reverse align
    pop {ip, pc}

@ vars and stuff
.data
message:    .asciz "Hello, world.\n"
fmtInt:     .string "%d"
textOut:    .asciz "num: %d\n"
num:        .word 1

Ausgabe: Hello, world.

Eingang: 6

Ausgabe: num: 3


Ausgang: Hallo, Welt.

Input: d

Ausgabe: num: 2

die endgültige Ausgabe ist stets 3 so lange, wie ich die Eingabe eine Zahl ist, und 2 so lange, wie ich die Zeichen.

  • ich weiß nicht, was Sie zu tun versuchen, und ich habe vergessen die meisten arm-assembly, aber ich habe noch ein problem gefunden. das ist die ersten paar Parameter übergeben werden über ein Register nicht vom Stapel.
  • Schreiben eine einfache Funktion in C, die Anrufe scanf kompilieren mit gcc -S, inspizieren Sie dann den generierten assembler-source und verwenden Sie es als Vorlage für Ihren eigenen code.
  • Technisch es hängt ganz davon ab, was die Bibliothek Umsetzung Sie verknüpfen mit, da es möglich ist, für das zu verwenden, was die geistige Aufrufkonvention es gerne, obwohl es unendlich wahrscheinlicher zu verwenden der standard.
  • Ich Schreibe eine extrem einfache app mit gcc-link. Blick auf die Ausgabe aus einem c-Programm hilft, aber es macht einen schon ein paar Dinge, die ich wirklich nicht verstehen. Ich nehme an, es könnte durchaus ein paar verschiedene Möglichkeiten, dies zu tun, aber ich bin wirklich nur daran interessiert, - ich verlange nicht, das eine hypothetische Frage.
  • Wie oft finde ich mich selbst sagen, ein wenig blip, was ich tun kann, um diese zu verbessern, Frage vielmehr, als nur downvoting, würde es geschätzt werden. Wenn ich etwas hinzufügen, um es klarer oder etwas klären, lass es mich wissen und ich werde sehen was ich tun kann!
InformationsquelleAutor dlkulp | 2015-03-10
Schreibe einen Kommentar