-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