ARM程序集:scanf存储的值未正确保存。

时间:2016-07-06 16:15:32

标签: assembly arm scanf libc

我正在尝试使用ARM Assembly中的scanf读取多个值(一次一个)。我设法让scanf部分工作,它显然正确地保存了值。但是当我想要检索它们时,我只能获得最后一个数字,而其他数字则获得其他数字。

这就是它给我的东西:

Enter a number: 1  
Enter a number: 2  
You entered: 2129322344 and 2.  

应该说You entered 1 and 2.

我的代码如下所示:

  .global main
  .func main

main:
  PUSH {LR}
  LDR R0, =entryMessage
  BL printf
  SUB SP, SP, #8
  LDR R0, =scanformat
  MOV R1, SP
  BL scanf        @ Number is saved in SP - 8
  LDR R0, =entryMessage
  BL printf
  ADD SP, SP, #4
  LDR R0, =scanformat
  MOV R1, SP
  BL scanf        @ Number is saved in SP - 4
  ADD SP, SP, #4  @ Restore SP to original
  SUB SP, SP, #8  @ Prepare to read SP - 8 for first number
  LDR R1, [SP]    @ Read first number
  ADD SP, SP, #4  @ Prepare to read SP - 4 for second number
  LDR R2, [SP]    @ Read second number
  ADD SP, SP, #4  @ Restore SP to original
  LDR R0, =printMessage
  BL printf
  POP {PC}

_exit:
  BX LR

.data
  entryMessage: .asciz "Enter a number: "
  scanformat: .asciz "%d"
  printMessage: .asciz "You entered: %d and %d.\n"

有人可以告诉我为什么只有最后一个值被正确读取?

1 个答案:

答案 0 :(得分:2)

ADD SP, SP, #4第二次呼叫scanf之前,该呼叫将覆盖之前输入的值。在加载到R1R2之前,您可以按相反的顺序存储它们。所以堆栈指针永远不会高于你想要使用的存储值。

main:
    PUSH {LR}
    LDR R0, =entryMessage
    BL printf

    SUB SP, SP, #4  @ Reserve space for the first number entry
    LDR R0, =scanformat
    MOV R1, SP
    BL scanf        @ Number is saved at original SP - 4

    LDR R0, =entryMessage
    BL printf

    SUB SP, SP, #4  @ Reserve space for the second number entry
    LDR R0, =scanformat
    MOV R1, SP
    BL scanf        @ Number is saved at original SP - 8

    LDR R2, [SP]    @ Read second number
    ADD SP, SP, #4  @ Prepare to read first number
    LDR R1, [SP]    @ Read first number
    ADD SP, SP, #4  @ Restore SP to original
    LDR R0, =printMessage
    BL printf

    POP {PC}