程序接收信号SIGSEGV,分段故障。在我打电话给printf时的汇编

时间:2015-12-13 09:44:53

标签: assembly x86 segmentation-fault printf

我正在尝试编写程序集。 当我调用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"

1 个答案:

答案 0 :(得分:2)

我认为你错过了调用约定你需要处理cdecl调用约定的调用者。尝试在add $4, %esp之后添加call printf