***堆栈粉碎检测到***:。/ herm终止分段错误(核心转储)

时间:2014-11-26 07:46:47

标签: c assembly segmentation-fault

我正在编译我的程序而且我遇到错误: *堆栈粉碎已检测到* :。/ herm已终止分段错误(核心转储) 我不知道我做错了什么。我的部分是写入zadanie1,没有%0,%1和%2。

#include <stdio.h>

  int main()

  {
     char *x= "abcabab xxabc";
     char *y= "ab";
     char bufor[4];
    asm volatile(
    ".intel_syntax noprefix;"
    "mov ebx,%1;"
    "push ebx;"
    "mov ebx,%2;"
    "push ebx;"
    "mov ebx,%0;"
    "call zadanie1;"
    "jmp wyjscie;"
    "zadanie1:"
    "mov ah,[ebx];"
    "cmp ah,0;"
    "jz wyjscie;"

    "push ebp;"
    "mov ebp,esp;"
    "mov edx,[ebp+8];"
    "mov al,[edx];"

    "compare:"
    "cmp ah,al;"
    "jnz diff;"

    "inc ebx;"
    "mov ah,[ebx];"
    "cmp ah,0;"
    "jz wyjscie;"

    "inc edx;"
    "mov al,[edx];"
    "cmp al,0;"
    "jnz diff;"
    "inc ecx;"
    "mov edx,[ebp+8];"
    "jmp compare;"

    "diff:"
    "inc ebx;"
    "mov ah,[ebx];"
    "cmp ah,0;"
    "jz wyjscie;"
    "inc edx;"
    "mov al,[edx];"
    "jmp compare;"



    "wyjscie:"

    "pop ebx;"
    "mov [ebx],ecx;"
    "pop ebx;"
    "pop ebp;"
    ".att_syntax prefix;"
    :
    :"r"(x),"r"(y), "r"(bufor)
    :"ebx"
);

return 0;

}

1 个答案:

答案 0 :(得分:0)

您需要正确构建代码,以便查看推送和流行音乐不平衡的位置。在"zadanie1:"的第4行中,您执行了另一个"push ebp;"但仍然到达"wyjscie:"以从堆栈中弹出与跳过该推送时相同数量的项目。另外,如果你想跟踪堆栈维护,请从呼叫中正确返回,而不是弹出返回地址,gcc已经发现了这一切。