4
votes

I'm new to ARM Assembly language. I have a project. The problem i have is how to get an input from user in arm assembly (in QEMU emulator) ? Just tried this, but looks like it won't work. The output is not matching with the input.

#Scanf

    .text
    .global main

main:
    sub sp, sp, #4
    str lr, [sp, #0]

# Prompt For An Input
    ldr r0, =prompt
    bl  printf

#Scanf
    ldr r0, =format
    sub sp, sp, #4
    mov r1, sp
    bl  scanf
    ldr r2, [sp, #0]
    add sp, sp, #4

# Printing The Message
    mov r1, r2
    bl  printf

    ldr lr, [sp, #0]
    add sp, sp, #4
    mov pc, lr

    .data

format:
    .asciz "Your Number Is %d \n"

prompt:
    .asciz "Enter A Number\n"
1

1 Answers

4
votes

You haven't defined what "it won't work" means, but I'm going to assume that the number displayed by the last printf doesn't match what you inputted.

The fact that you're passing "Your Number Is %d \n" as the format string to scanf is a problem, since it contains a bunch of non-format specifier characters. To quote from the documentation:

Non-whitespace character, except format specifier (%): Any character that is not either a whitespace character (blank, newline or tab) or part of a format specifier (which begin with a % character) causes the function to read the next character from the stream, compare it to this non-whitespace character and if it matches, it is discarded and the function continues with the next character of format. If the character does not match, the function fails, returning and leaving subsequent characters of the stream unread.

What you should be doing is declare another string that contains only a format specifier, i.e. something like this:

inputformat: .asciz "%d"

And pass that string to scanf instead of format.