В функции 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
'LC2', вероятно, должно быть завершено нулем. –
Это решило. Благодарю. – user3866044
'mov DWORD [rbp-4], edi' /' mov DWORD [rbp-4], 0' <- зачем что-то хранить, а затем сразу же перезаписать его 0? – Michael