Sé que hay una pregunta aquí pero realmente no entiendo lo que el OP lo hizo. He usado x86 asamblea antes y para el que te gustaría hacer algo como esto:

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

mi conjetura por el BRAZO es algo como esto

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

Estoy seguro de que me estoy perdiendo algo simple pero de verdad que estoy muy perdido. Si ldr y empuje no funciona, entonces hay algún otro código de operación a utilizar? Si una de ellas es la correcta, ¿qué combinación de entradas ¿es necesario?

También traté de definir un num: .word 0 en el .sección de datos y el uso de ldr r1, =num nada en el .sección de datos parece ser estática o hay otra forma de pasar a scanf?

Estoy usando gcc en un procesador ARMv7 en Qemu si que ayuda.

–EDIT–

Aquí es lo que yo estoy tratando de hacer y algo de código. La aplicación imprime hola mundo, y es de entrada, añade uno, se imprime el nuevo valor. Mi código es este:

.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 salida: ¡Hola, mundo.

De entrada: 6

De salida: num: 3


Outout: Hola, mundo.

Entrada: d

De salida: num: 2

el resultado final es siempre 3 siempre que la entrada de un número y 2 tanto tiempo como yo de entrada de caracteres.

  • no sé lo que usted está tratando de hacer y me he olvidado de la mayoría de montaje del brazo, pero me encontré con un problema. que es de los primeros parámetros que se pasan a través de los registros no por pila.
  • Escribir una función en C que se llama scanf, compilar con gcc -S, luego de inspeccionar el ensamblador generado fuente y utilizar como una plantilla para su propio código.
  • Técnicamente depende enteramente de lo que sea implementación de la biblioteca estás enlazando con el, ya que es posible que la utilización de cualquier mental de la convención de llamada que le gusta, aunque es infinitamente más probable que el uso de estándar.
  • Estoy escribiendo una muy sencilla aplicación, utilizando gcc a link. Mirando a la salida de un programa en c que ayuda pero no es bastante un par de cosas que realmente no entiendo. Supongo que podría estar bastante un par de maneras diferentes de hacer esto, pero estoy muy interesado sólo en uno, no le estoy pidiendo una pregunta hipotética.
  • Como a menudo me encuentro a mí mismo diciendo, una pequeña porción de lo que puede hacer para mejorar esta pregunta en lugar de sólo downvoting sería muy de agradecer. Si tengo que agregar algo para hacerla más clara o aclarar algo, hágamelo saber y voy a ver qué puedo hacer!
InformationsquelleAutor dlkulp | 2015-03-10

2 Comentarios

  1. 4

    ldr debe por todos los medios de trabajo. Esto sin duda se compila:

    ldr r0, =fmtInput
    ldr r1, =num
    bl scanf
    
    .data
    num: .word 0
    fmtInput: .string "%d"
    
    • así r1 ahora tiene el valor o num?
    • r1 tiene la dirección de num.
    • cuando me mov r2, #2 y add r3, r2, r1 inmediatamente después de la scanf el valor es siempre 3, independientemente de lo que yo de entrada. He actualizado mi código completo y de entrada/salida para reflejar lo que está sucediendo
    • Después de el scanf, r1 es indefinido, es una persona que llama-guarda registro. ¿Sabe usted cómo scanf funciona? Asigna valores a través de los punteros que pase. Por lo que el valor leído es en num en la memoria. Usted necesita para cargar desde allí, como haciendo ldr r1, =num; ldr r1, [r1].
    • Sé que en c se pasa una cadena como primer parámetro y un puntero para el segundo parámetro y que después de la scanf llamar a la variable pasa en el valor.
    • y sé que en x86 asamblea se pasa una cadena y un puntero a un var y var tiene el valor después de la llamada a scanf
    • también, cuando me ldr r1, =num y ldr r1, [r1] antes de la scanf puedo obtener un fallo de segmentación

  2. 2

    Esto es lo que terminó trabajando para mí:

    sub     sp, sp, #4
    
    @ Call scanf and store value in r4
    ldr     r0, addrInp
    mov     r1, sp
    bl      scanf
    ldr     r4, [sp]
    
    add     sp, sp, #4
    

    El valor de las entradas de usuario termina en r4 en este caso. No entiendo por qué Bufones de manera que no funcionó, pero sólo se dio una violación de segmento cada vez.

    • Gracias. Los bufones no trabajo, pero esto es lo que ha funcionado para mí.

Dejar respuesta

Please enter your comment!
Please enter your name here