2015-07-21 15 views
-1

在下面,我試圖讓它到達用戶輸入N並且提示輸入一個整數的地方。最後讓那部分工作。我花了幾個小時試圖讓下一部分工作。他們輸入一個整數後,它返回到菜單。出於調試目的,如果他們輸入F,它應該顯示他們輸入的數字。然而,進入N,然後3時,則F,它顯示21505.在菜單中的Nasm彙編程序中沒有得到正確的輸入形式scanf或printf

;nasm -f elf64 fib.asm -o fib.o 
;gcc -S -masm=intel fib.c -o fib.s 
;./fib 




    bits 64 
    global main 
    extern puts 
    extern printf 
    extern scanf 
    extern get_kb 



section.data 

errormsg: db 'Invalid Input. Enter N,F, or X',0x0D,0x0a,0 

numequalsmsg: db 'Number equals: ' 

LC2: db "%d",0 


menuprompt: 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 


choicemsg: db "Your Choice: ",0 

LC5: db "%d",0 


enterintmsg: db "Enter and integer 0-20: ",0 


enternummsg: db 'Enter a valid number between 0 and 20',0x0D,0x0a,0 


LC8: db " , ",0 
LC9: db 'Success!',0x0D,0x0a,0 
LC10: db 'In L10!',0x0D,0x0a,0  
LC11: db 'In L12!',0x0D,0x0a,0 
LC13: db 'In compare to zero section',0x0D,0 
value: db 0 
choice: db 1 


.code 
main: 
    ;function setup 
    ;push rbp 
    ;mov rbp, rsp 
    ;sub rsp, 16 
    call menu 

menu: 
    ;print menu 
    mov edi, menuprompt 
    call puts   ;display menu 
    mov edi,choicemsg 
    ;mov eax, 0 
    ;call printf   ;display "Your choice:" 
    call puts 
    call get_kb 
    mov bl, al 
    cmp bl, 'N' ;N 
    je read_int_new 
    cmp bl, 'F' ;F 
    je fib 
    cmp bl, 'X' ;X 
    je correct 
    ;leave 
    ;ret 

    jmp menu 
    ret 





correct: 
    mov edi, LC9 
    mov eax,0 
    call printf 
    jmp  menu 
    ;leave 
    ;ret 

entered_n: 
    call read_int_new 
    ;jmp correct 
    jmp menu 
    ;leave 
    ;jmp menu 

read_int: 
    mov edi, enterintmsg 
    mov eax,0 
    call printf   

    ;mov rdi, [LC5] 
    ;mov rsi, [value] 
    ;xor eax,eax 

    ;add esp,4  ;remove parameters 
    ;push rsi 
    ;push rdi 

    ;push rbp 
    ;mov rax,0 
    ;mov rdi, LC5 
    ;mov rsi, value 
    push value 
    push LC5 
    call scanf 
    add esp, 8 
    ;mov eax, value 
    push value 
    push LC5 
    call printf 
    add esp,8 
    ;pop rbp 
    ;jmp correct 
    ;mov cl, [value] 
    ;jmp menu 
    ;leave 
    ret 


    ;leave 

read_int_new: 
    ;push rbp 
    ;mov rbp, rsp 
    ;sub rsp, 16 


    mov edi, enterintmsg ;display "Enter an integer 0-20: " 
    mov eax, 0 
    call printf 

    ;lea rax, [value] 
    ;mov rsi, rax 
    ;mov edi, LC5 
    ;mov eax, 0 
    ;call scanf    ;get user input 
    ;mov ebx, [value] 

    push value 
    push LC5  
    call scanf 
    mov esi, [value] 

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


    ;test ebx, ebx   ;compare to 0 (eax-eax=0) 
    ;js L9 
    ;mov edi, LC9   ;test to see if it got here 
    ;mov eax, 0 
    ;call printf 

    ;mov ebx, DWORD [rbp-4] 
    ;cmp ebx, 20    ;jump if greater than 20 
    ;jg L9 
    ;mov edi, LC9   ;test to see if it got here 
    ;mov eax, 0 
    ;call printf  

    ;mov ebx, DWORD [rbp-4]  ;else, jump to L10 
    ;mov edi, LC9   ;test to see if it got here 
    ;mov eax, 0 
    ;call printf  
    ;jmp L10 
    ;leave 
    ;ret 
    jmp menu 




fib: 

    mov eax, esi  
    mov edi, LC5 
    mov eax,0 
    ;mov eax, LC5 
    ;push [eax] 
    ;push value 
    ;push LC5  
    call printf 
    jmp menu 

回答

0

代碼不編譯由於缺少get_kb。無論如何,除了mov ebx, [value]之外,read_int_new中的註釋代碼是正確的代碼。如果您將LC9更改爲實際打印編號(使用%d),則可以看到閱讀工作。

如果您還通過用mov esi, [value]替代mov eax, esi(這沒有任何意義)修復您的fib,那麼該號碼也將在那裏正確打印。 PS:學會使用調試器。