2014-10-27 108 views
0
/*menu_prompt*/ 
.balign 4 
menu_prompt: .asciz "Choose which problem.\nType 1 for Problem 1\nType 2 for Pr$ 
/*scanner*/ 
.balign 4 
scan_pattern_int: .asciz "%d" 
scan_read: .word 0 
.balign 4 
return: .word 0 


.global main 
main: 
    ldr r0, address_of_return 
    str lr, [r1] 

    ldr r0, address_of_menu_prompt 
    bl printf 

    ldr r0, address_of_scan_pattern_int 
    ldr r1, address_of_scan_read 
    bl scanf 
    ldr r1, [r1] 
    str lr, [r1] 

    ldr r0, address_of_menu_prompt 
    bl printf 

    ldr r0, address_of_scan_pattern_int 
    ldr r1, address_of_scan_read 
    bl scanf 
    ldr r1, [r1] 
    cmp r1, #1 
    beq in_prob_1 
    cmp r1, #2 
    beq in_prob_2 
    cmp r1, #3 
    beq in_prob_3 
in_prob_1: 
    mov r0, #100 
    bal end 
in_prob_2: 
    mov r0, #200 
    bal end 
in_prob_3: 
    mov r0, #300 
    bal end 
end: 
    ldr lr, address_of_return 
    ldr lr, [lr]      
    bx lr 

address_of_menu_prompt: .word menu_prompt 
address_of_scan_pattern_int: .word scan_pattern_int 
address_of_scan_read: .word scan_read 
address_of_return: .word return 

運行程序後,無論我選擇哪種輸入(1,2或3)echo $?總是表明r0擁有139,我不知道爲什麼。如果我選擇1 r0應該保持100,2 r0應該保持200,3和r0應該保持300.ARM彙編語言菜單不工作

回答

1

scanf不需要保留r1的內容,因爲您已經通過ARM過程調用標準傳遞。分支到scanf後,您應該重新加載r1