Scanf ARM Assembly

我与影子孤独终老i 提交于 2020-06-23 05:16:09

问题


I know there's a question here but I really don't understand what the OP did. I've used x86 assembly before and for that you'd do something like this:

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

my guess for ARM is something like this

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

I'm sure I'm missing something simple but I'm really very lost. If ldr and push don't work then is there some other opcode to use? If one of those is correct, what combination of inputs does it need?

I also tried defining a num: .word 0 in the .data section and using ldr r1, =num anything in the .data section seems to be static or is there another way to pass them to scanf?

I'm using gcc on an ARMv7 processor in Qemu if that helps.

--EDIT--

Here's what I'm trying to do and some code. The app prints hello world, gets input, adds one, prints the new value. My code looks like this:

.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

Output: Hello, world.

Input: 6

Output: num: 3


Outout: Hello, world.

Input: d

Output: num: 2

the final output is always 3 so long as I input a number and 2 so long as I input characters.


回答1:


ldr should by all means work. This certainly compiles:

ldr r0, =fmtInput
ldr r1, =num
bl scanf

.data
num: .word 0
fmtInput: .string "%d"



回答2:


This is what ended up working for me:

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

The value the user inputs ends up in r4 in this case. I don't understand why Jesters way didn't work but it just gave a segfault every time.



来源:https://stackoverflow.com/questions/28973922/scanf-arm-assembly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!