Scanf ARM组装

时间:2015-03-10 20:55:33

标签: assembly arm scanf

我知道有一个问题here但我真的不明白OP做了什么。我之前使用过x86程序集,为此你会做这样的事情:

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

我对ARM的猜测是这样的

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

我确定我错过了一些简单的东西,但我真的很迷茫。如果ldr和push不起作用,那么是否还有其他操作码可供使用?如果其中一个是正确的,它需要什么样的输入组合?

我还尝试在.data部分中定义num: .word 0并使用ldr r1, =num .data部分中的任何内容似乎都是静态的,还是有其他方式将它们传递给scanf?

如果有帮助的话,我在Qemu的ARMv7处理器上使用gcc。

- 编辑 -

这是我正在尝试做的和一些代码。应用程序打印hello world,获取输入,添加一个,打印新值。我的代码如下所示:

.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

输出:你好,世界。

输入:6

输出:num:3


Outout:你好,世界。

输入:d

输出:num:2

只要我输入一个数字和2,只要我输入字符,最终输出总是3。

3 个答案:

答案 0 :(得分:4)

ldr应该通过各种方式工作。这肯定会编译:

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

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

答案 1 :(得分:1)

最终为我工作的是:

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

在这种情况下,用户输入的值最终在r4中结束。我不明白为什么Jesters的方式不起作用,但每次都只是一个段落错误。

答案 2 :(得分:1)

@Jester 提供了完全有效的答案。我来补充几点

@ scanf for number
ldr r0, =fmtInt
ldr r1, =num
bl scanf
@ scanf puts write value into addr provided by r1 (eg addr of 'num')
@ scanf does not put read value into register!
@ r0, r1, r2, r3 are volatile registers and might be changed by scanf

@ add 2 to input and store in r3
ldr r1, =num     <--- load addr of 'num' into r1
ldr r1, [r1]     <--- read value from 'num' addr into r1.
mov r2, #2
add r3, r2, r1   <--- r3 = scanf-ed value + 2
...

.data
message:    .asciz "Hello, world.\n"

.align 2         <--- align address of 'num' by 4 (2^2)
num:        .word 1