我想知道如何使用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
答案 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