Scanf BRAS de Montage

Je sais qu'il y a une question ici mais je ne comprends vraiment pas ce que l'OP n'. J'ai utilisé x86 assemblée, avant et pendant que vous feriez quelque chose comme ceci:

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

ma conjecture pour les BRAS, c'est quelque chose comme cela

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

Je suis sûr que je suis absent quelque chose de simple, mais je suis vraiment perdue. Si ldr et push ne fonctionne pas alors est-il un autre opcode à utiliser? Si l'un de ceux qui est correct, ce que combinaison d'entrées-t-il besoin?

J'ai aussi essayé de définir un num: .word 0 dans le .section des données et à l'aide de ldr r1, =num quoi que ce soit dans la .les données de la section semble être statique ou est-il une autre façon de les faire passer scanf?

Je suis en utilisant gcc sur un processeur ARMv7 dans Qemu si cela aide.

--EDIT--

Voici ce que je suis en train de faire et un peu de code. L'application affiche " hello world, obtient d'entrée, en ajoute un, imprime la nouvelle valeur. Mon code ressemble à ceci:

.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

De sortie: Bonjour tout le monde.

Entrée: 6

De sortie: num: 3


Sortie: Bonjour tout le monde.

D'entrée: d

De sortie: num: 2

le résultat final est toujours 3 si longtemps, comme je l'ai saisie d'un nombre et le 2 aussi longtemps que je le saisie de caractères.

  • je ne sais pas ce que vous êtes en train de faire et j'ai oublié la plupart des bras de montage, mais j'ai toujours trouvé un problème. c'est la première quelques paramètres sont passés au travers des registres non pas par la pile.
  • Écrire une fonction simple en C qui appelle scanf, de compiler avec gcc -S, puis inspectez l'assembleur généré source et l'utiliser comme modèle pour votre propre code.
  • Techniquement, il dépend entièrement de ce que la bibliothèque de la mise en œuvre, vous êtes le lien avec, car il est possible que de faire usage de quelque mentale convention d'appel qu'il aime, même si c'est infiniment plus susceptibles d'utiliser les standard.
  • Je suis en train d'écrire un extrêmement simple application à l'aide de gcc pour le lien. En regardant la sortie à partir d'un programme c à l'aide, mais en plus, il fait assez peu de choses vraiment, je ne comprends pas. Je suppose qu'il pourrait y avoir un certain nombre de façons différentes de faire cela, mais je suis vraiment intéressé seulement par un -- je ne demande pas d'une question hypothétique.
  • Comme souvent, je me surprends à dire, un peu écho à ce que je peux faire pour améliorer cette question plutôt que de simplement downvoting il serait appréciée. Si je dois ajouter quelque chose pour la rendre plus claire ou de clarifier quelque chose, faites le moi savoir et je vais voir ce que je peux faire!
InformationsquelleAutor dlkulp | 2015-03-10