使用 ARM 汇编语言获取用户输入

Thi*_*ruG 5 io assembly arm input scanf

我是 ARM 汇编语言的新手。我有一个项目。我遇到的问题是如何在arm assembly(在QEMU模拟器中)中获取用户的输入?刚刚尝试过这个,但看起来不起作用。输出与输入不匹配。

#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"
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 4

您还没有定义“它不起作用”的含义,但我假设最后显示的数字与printf您输入的数字不匹配。

"Your Number Is %d \n"您作为格式字符串传递的事实scanf是一个问题,因为它包含一堆非格式说明符字符。引用文档

非空白字符,格式说明符 (%) 除外:任何不是空白字符(空白、换行符或制表符)或格式说明符(以 % 字符开头)一部分的字符都会导致函数读取下一个字符从流中,将其与该非空白字符进行比较,如果匹配,则将其丢弃,并且该函数继续处理格式的下一个字符。如果字符不匹配,则函数失败,返回并保留流的后续字符未读。

您应该做的是声明另一个仅包含格式说明符的字符串,即如下所示:

inputformat: .asciz "%d"
Run Code Online (Sandbox Code Playgroud)

并将该字符串传递给scanf而不是format.