I need to write a program in assembly that needs to get some user arguments using scanf. The problem is that in the third call, I get segmentation fault.
Briefly about the program purpose.
It should get input from the user in this format:
epsilon = 1.0e-8
order = 2
coeff 2 = 2.0 0.0
coeff 1 = 5.0 0.0
coeff 0 = 3.0 0.0
initial = 5.0 0.0
coeff 0 = 3.0 0.0
and store this data in data structures.
String formats:
section .data
epsilon_format:
db "epsilon = %g",0
order_format:
db " order = %d",0
coeff_format:
db " coeff %d = %le %le",0
initial_format:
db " initial = %le %le"
root_format:
db "root = %.17g %.17g", 10, 0
divide_by_zero:
db "divide by zero",10,0
Code:
main:
call **get_input**
call newton_raphson
call show_output
mov rdi, [poly_real]
call free
mov rdi, [poly_img]
call free
mov rdi, [deriv_img]
call free
mov rdi, [deriv_real]
call free
mov rax, 60
syscall
Calling scanf function:
get_input:
mov rdi, epsilon_format
mov rax, 1
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call scanf ;first call --- works fine
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movsd qword [epsilon], xmm0 ;epsilon
mov rdi, order_format
mov rsi, order
mov rax,0
call scanf ;order
mov r10, [order]
inc r10
mov rax, 8
mul r10
mov rdi, rax
call malloc
mov [poly_real], rax
mov r10, [order]
inc r10
mov rax, 8
mul r10
mov rdi, rax
call malloc
mov [poly_img], rax
mov r10, [order]
inc r10
mov [counter], r10
.loop:
mov rdi, coeff_format
mov rsi, degree
mov rax, 2
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call scanf ;second call - works fine
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r8, [degree]
movsd [poly_real+r8*8], xmm0
movsd [poly_img+r8*8], xmm1
mov r10, [counter]
dec r10
mov [counter], r10
cmp r10, 0
ja .loop ;polynom
mov rdi, initial_format
mov rax, 2
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call scanf ;third call - segmentation fault
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movsd qword[z_n_real], xmm0
movsd qword[z_n_img], xmm1 ;initial
mov rdi, [order]
mov rsi, [poly_real]
mov rdx, [poly_img]
call derivate
mov [deriv_img], rbx
mov [deriv_real], rax
ret
The error:
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a6a4cf in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffdbc8, errp=errp@entry=0x0) at vfscanf.c:2444