我正在尝试编写程序集。 当我调用printf时 - 它会打印必要的字符串,但它会在它之后返回seg fault。
请帮帮我。
.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"
答案 0 :(得分:2)
我认为你错过了调用约定你需要处理cdecl
调用约定的调用者。尝试在add $4, %esp
之后添加call printf
。