使用Scanf Assembly ARM从用户读取多个值

时间:2015-10-30 09:18:48

标签: assembly arm

我想知道如何使用scanf从用户那里获取多个输入。我正在阅读Raspbian初学者一书,但没有提到如何实现这一目标。这是我的代码。如果我回显R2,我会收到我输入的值,但是当我回显R1时,我会收到一个随机值。任何帮助将不胜感激。

.data
string: .asciz "Hours: %d. PayRate: %d"
prompt1: .asciz "Enter pay rate.\n"
prompt2: .asciz "Enter hours.\n"
scantype: .asciz "%d"
hours: .word 0
payrate: .word 0

.text
.global main
main:
        push {LR}

        ldr r0, addr_prompt1    /*First param of printf */
        bl printf               /*call printf */

        ldr r0, addr_scantype   /* First param of scanf*/
        ldr r1,addr_hours       /*Loading address in memory into register as second param*/
        bl scanf
        ldr r1,addr_hours
        ldr r1,[r1]

        ldr r0, addr_prompt2
        bl printf

        ldr r0, addr_scantype
        ldr r1, addr_payrate
        bl scanf
        ldr r1,addr_payrate
        ldr r2,[r1]

        mov r0,r1

        pop {PC}
        mov pc,lr


addr_prompt1: .word prompt1
addr_prompt2: .word prompt2
addr_scantype: .word scantype
addr_hours: .word hours
addr_payrate: .word payrate

.global scanf
.global printf

2 个答案:

答案 0 :(得分:0)

由于scanf将检索到的数据放入堆栈;尝试将堆栈值的顶部直接加载到寄存器中。这是一种替代解决方案。

我只是尝试使用一个scanf函数来获取多个条目的值;在我的情况下四(4)。我还在深入研究文档;但是,下面函数的代码示例"模拟"获得多个键盘输入。

我只使用了四个scanf调用;对我来说,这只是一个创可贴 - 但它确实有效。

代码是程序的结果。请注意,我一次输入一个号码,然后按。

       .data 
scan0:  .string "%d"
.text
addr_scan:      .word   scan0
...


scan:
push {r0-r3,lr}
sub sp,sp, #4

ldr r0, addr_scan
mov r1, sp
bl scanf
ldr r9, [sp]            // store Ai

ldr r0, addr_scan
mov r1, sp
bl scanf
ldr r10, [sp]           // store Bi

ldr r0, addr_scan
mov r1, sp
bl scanf
ldr r11, [sp]           // store Ci

ldr r0, addr_scan
mov r1, sp
bl scanf
ldr r12, [sp]           // store Di

add sp, sp, #4


write:
push {r0-r3,lr}
ldr r0,=fmt3
mov r1, r9
mov r2, r10
mov r3, r11
push {r12}
bl printf
pop {r12}
pop {r0-r3,pc}

...

root@scw-cb8d4b:~/asm# ./sys_equations    
Enter A[1],B[1],C[1],D[1] values
12
23
34
45
You entered 12 23 34 45

答案 1 :(得分:0)

我复制并修改了你的代码并且它有效。

随机数可能是您从指向r1到相应的addr _...地址vs sp的地址。随机性可能是由于地址空间布局随机化。

输出位于底部。您可能需要调整堆栈以获得更大的值。

.data
string:         .asciz "Pay Rate: %d Hours: %d\n"
prompt1:        .asciz "Enter pay rate - round up to nearest dollar.\n"
prompt2:        .asciz "Enter hours.\n"
scantype:       .asciz "%d"
hours:          .word 0
payrate:        .word 0
.text
addr_prompt1:   .word prompt1
addr_prompt2:   .word prompt2
addr_scantype:  .word scantype
addr_hours:     .word hours
addr_payrate:   .word payrate

.global main
main:
push {LR}
sub sp, sp, #8

ldr r0, addr_prompt1    /*First param of printf */
bl printf               /*call printf */

ldr r0, addr_scantype   /* First param of scanf*/
mov r1, sp
bl scanf

ldr r4, [sp]
ldr r0, addr_prompt2
bl printf

ldr r0, addr_scantype
mov r1, sp
bl scanf

ldr r5, [sp]
ldr r0,=string
mov r1, r4
mov r2, r5
bl printf

add sp, sp, #8
pop {PC}

...

root@scw-cb8d4b:~/asm# ./jf
Enter pay rate - round up to nearest dollar.
100
Enter hours.
40
Pay Rate: 100 Hours: 40