Shay Chercavsky
Shay Chercavsky

Reputation: 105

Program received signal SIGSEGV, Segmentation fault. in assembly when I call printf

I am trying to code in assembly. when I call printf - it prints the necessary string but it returns seg fault after it.

please help me.

.type    pstrijcpy, @function
.globl pstrijcpy
pstrijcpy:
pushl   %ebp
movl    %esp            ,%ebp
pushl   %ebx
xorl    %ebx            ,%ebx
xorl    %edx            ,%edx   #set %edx to 0
xorl    %ecx            ,%ecx
xorl    %eax            ,%eax       
movl    8(%ebp)         ,%eax   #pointer of the dst
movl    12(%ebp)        ,%edx   #pointer of src 
movb    16(%ebp)        ,%ch    #move char i to %ch
movb    20(%ebp)        ,%cl    #%cl = j
movb    %ch             ,%bl 
cmpb    %cl             ,(%eax) #if dst.size < j
jl      .printError
leal    (%eax, %ebx)    ,%eax   #move %eax to the beginning of the string after i
cmpb    %cl             ,(%edx) #if src.size < j
jl      .printError
leal    (%edx, %ebx)    ,%edx   #move %edx to the beginning of the string after i
xorl    %ebx            ,%ebx
.whileISmallerThanJ:
movb    (%edx)          ,%bl 
movb    %bl             ,(%eax) #dst[i] = src[i]
addb    $1              ,%ch    #i++
leal    1(%edx)         ,%edx
leal    1(%eax)         ,%eax
cmpb    %cl             ,%ch 
jle     .whileISmallerThanJ
.finishFunctionCopy:
movl    8(%ebp)         ,%eax   #pointer to the first char of the string, for the return value
popl    %ebx
popl    %ebp
ret     
.printError:
pushl   $error                  #push the string for printf
call    printf
jmp .finishFunctionCopy

    .section    .rodata         #read only data
readDecimal:    .string "%d"    #for scanf
error:          .string "invalid input!\n"

Upvotes: 1

Views: 1187

Answers (1)

wilx
wilx

Reputation: 18228

I think you are missing the caller clean up that you need to do with cdecl calling convention. Try adding add $4, %esp after call printf.

Upvotes: 2

Related Questions