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 mitgcc -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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
ldr
sollte mit allen Mitteln arbeiten. Dies ist sicherlich kompiliert:r1
hat jetzt den Wert oder dienum
?r1
hat die Adressenum
.mov r2, #2
undadd r3, r2, r1
sofort nach dem scanf den Wert immer 3 unabhängig davon, was ich Eingangs. Ich aktualisierte mein vollständiger code und Eingabe/Ausgabe um zu reflektieren, was passiertscanf
,r1
ist nicht definiert, es ist eine caller-saved register. Wissen Sie, wiescanf
funktioniert? Es weist die Werte per Zeiger übergeben. So ist der gelesene Wert wird innum
im Speicher. Müssen Sie laden Sie es von dort aus, wie durch tunldr r1, =num; ldr r1, [r1]
.ldr r1, =num
undldr r1, [r1]
vor dem scanf bekomme ich einen segmentation faultDies ist, was schließlich für mich arbeiten:
Den Wert, den der Benutzer eingibt, landet im r4 in diesem Fall. Ich verstehe nicht, warum die Narren Weg, hat nicht funktioniert, aber es gab nur einen segfault jeder Zeit.