2016-07-06 7 views
0

ARM 어셈블리에서 scanf를 사용하여 여러 값 (한 번에 하나씩)을 읽으려고합니다. 나는 scanf 부분을 작동 시키도록 관리하고 명백하게 값을 저장한다. 그러나 나는 그것들을 되찾고 싶을 때 나는 단지 마지막 숫자를 얻고 다른 것들은 다른 것을 얻는다.ARM 어셈블리 : 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" 

누군가가 말해 줄 수 그것만이 마지막 값이 올바르게 읽습니까?

답변

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} 
관련 문제