2015-07-07 2 views
0

В функции read_int после того, как пользователь вводит число и попадает в него, программа просто останавливается. Я пробовал несколько вещей (некоторые прокомментировали), но не может заставить присоску работать.scanf в сборочных киосках программы после ввода

bits 64 
    global main 
    extern puts 
    extern printf 
    extern scanf 



    section .data 
LC0: db 'Invalid Input. Enter N,F, or X',0x0D,0x0a,0 
LC1: db 'Number equals: ' 
LC2: db "%d" 
LC3: db 0x0D,0x0a,'Enter N to enter an integer from 0 to 20',0x0D,0x0a,'Enter F to display the first N+1 numbers (beginning with zero) on the console',0x0D,0x0a,'Enter X to quit the program',0x0D,0x0a,0 
LC4: db "Your Choice: ",0 
LC5: db "%s",0 
LC6: db "Enter and integer 0-20: ",0 
LC7: db 'Enter a valid number between 0 and 20',0x0D,0x0a,0 
LC9: db 'Success!',0x0D,0x0a,0 

     section .text 
main: 
LFB0: 
    push rbp 
    mov rbp, rsp 
    sub rsp, 32 
    mov DWORD [rbp-20], edi 
    mov QWORD [rbp-32], rsi 
    mov DWORD [rbp-4], 0 
    mov BYTE [rbp-5], 79 
    jmp L2 
L5: 
    mov eax, 0 
    call menu 
    cmp eax, 'N'  
    je read_int  
    cmp eax, 'F'  
    je display 
    cmp eax, 'X'  
    je L3 
    ;mov edi, LC0 
    ;call puts 
    ;jmp L2   ;need an else (not N,F,X) 

L3: 
    cmp BYTE [rbp-5], 78 
    jne L4 
    mov eax, DWORD [rbp-4] 
    mov edi, eax 
    call read_int 
    mov DWORD [rbp-4], eax 
    mov edi, LC1 
    mov eax, 0 
    call printf 
    mov eax, DWORD [rbp-4] 
    mov esi, eax 
    mov edi, LC2 
    mov eax, 0 
    call printf 
    jmp L2 

L4: 
    cmp BYTE [rbp-5], 70 
    jne L2 
    mov eax, DWORD [rbp-4] 
    mov edi, eax 
    call display 



L2: 
    cmp BYTE [rbp-5], 88 
    jne L5 
    leave 
    ret 



menu: 
LFB1: 

    push rbp 
    mov rbp, rsp 
    sub rsp, 16 

    mov edi, LC3 
    call puts   ;display menu 
    mov edi,LC4 
    mov eax, 0 
    call printf   ;display "Your choice: "  
    lea rax, [rbp-1] 
    mov rsi, rax 
    mov edi,LC5 
    mov eax, 0 
    call scanf 
    movzx eax, BYTE [rbp-1] 
    leave 
    ret 



read_int: 
LFB2: 

    push rbp 
    mov rbp, rsp 
    sub rsp, 16 

    mov DWORD [rbp-4], edi 
    mov DWORD [rbp-4], 0 
    mov edi, LC6   ;display "Enter an integer 0-20: " 
    mov eax, 0 
    call printf 

    lea rax, [rbp-4] 
    mov rsi, rax 
    mov edi, LC2 
    mov eax, 0 
    call scanf    ;get user input 
    mov ebx, DWORD [rbp-4] 

    mov edi, LC9   ;test to see if it got here 
    mov eax, 0 
    call printf 


    ;test eax, eax   ;compare to 0 (eax-eax=0) 
    ;js L9 
    ;mov eax, DWORD [rbp-4] 
    ;cmp eax, 20    ;jump if greater than 20 
    ;jg L9 
    ;mov eax, DWORD [rbp-4]  ;else, jump to L10 
    ;jmp L10 
    leave 
    ret 
L9: 
    mov edi, LC7   ;if not valid, print enter valid integer 
    mov eax, 0 
    call printf 
    mov eax, DWORD [rbp-4] 
    mov edi, eax 
    call read_int 


L10: 
    ;push DWORD [rbp-4] 
    leave 
    ret 
    ;jmp main 


LC8: db " , " 




display: 
LFB3: 

    push rbp 
    mov rbp, rsp 
    sub rsp, 32 
    mov DWORD [rbp-20], edi 
    mov DWORD [rbp-4], 0 
    jmp L12 
L13: 
    mov eax, DWORD [rbp-4] 
    mov esi, eax 
    mov edi, LC2 
    mov eax, 0 
    call printf 
    mov edi, LC8 
    mov eax, 0 
    call printf 
    add DWORD [rbp-4], 1 
L12: 
    mov eax, DWORD [rbp-4] 
    cmp eax, DWORD [rbp-20] 
    jle L13 
    leave 
    ret 





    ; function return 
    mov  eax, 0 
    add  rsp, 32 
    pop  rbp 
    ret 

После получить пользовательский ввод линии, он должен перейти обратно в меню, так что пользователь может ввести F печатать цифры от 0-номера. Мне все еще нужно работать с частью контрольной области функции, но пока я просто пытался заставить ее вернуться на главную.

Получаю следующий выход. Программа просто зависает после входа.

Enter N to enter an integer from 0 to 20 
Enter F to display the first N+1 numbers (beginning with zero) on the console 
Enter X to quit the program 

Your Choice: N 
Enter and integer 0-20: 5 
^C 
+1

'LC2', вероятно, должно быть завершено нулем. –

+0

Это решило. Благодарю. – user3866044

+0

'mov DWORD [rbp-4], edi' /' mov DWORD [rbp-4], 0' <- зачем что-то хранить, а затем сразу же перезаписать его 0? – Michael

ответ

0

Как предложил Фрэнк Котлер, нулевой завершающий LC2 решил проблему.

Смежные вопросы