Reputation: 105
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
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