我正在编译我的程序而且我遇到错误: *堆栈粉碎已检测到* :。/ 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;
}
答案 0 :(得分:0)
您需要正确构建代码,以便查看推送和流行音乐不平衡的位置。在"zadanie1:"
的第4行中,您执行了另一个"push ebp;"
但仍然到达"wyjscie:"
以从堆栈中弹出与跳过该推送时相同数量的项目。另外,如果你想跟踪堆栈维护,请从呼叫中正确返回,而不是弹出返回地址,gcc已经发现了这一切。