我在将程序集中的字符串复制到空数组时遇到了问题。
首先,我得到了一些代替我要复制的字符串。
其次,程序应该使用最多100个字符的字符串,但是当我声明一个包含100个字符的数组时,我得到了“ ***堆栈粉碎检测到*** “使用gcc编译后。
#include<stdio.h>
void main() {
char *s="aac";
char t[4];
asm volatile (
".intel_syntax noprefix;"
"mov eax, %0;"
"push eax;"
"mov eax, %1;"
"push eax;"
"call printing;"
"jmp end;"
"printing:"
"push ebp;"
"mov ebp,esp;"
"push eax;"
"push ebx;"
"push ecx;"
"push edx;"
"mov ebx,[ebp+12];"
"mov eax,[ebp+8];"
"mov ecx,eax;"
"copying:"
"mov dl,[ebx];"
"mov [eax],dl;"
"inc ebx;"
"inc eax;"
"cmp dl,0;"
"jnz copying;"
"xor edx,edx;"
"mov eax,4;"
"mov ebx,1;"
"mov edx,3;"
"int 0x80;"
"pop edx;"
"pop ecx;"
"pop ebx;"
"pop eax;"
"pop ebp;"
"ret 4;"
"end:"
".att_syntax prefix;"
:
:"r" (s), "r" (t)
:"eax"
);
printf("\n");
}
我是大会新手所以请帮助我。
提前谢谢
答案 0 :(得分:3)
我发现您的代码有四个问题:
al
作为传输字符的缓冲区,同时使用eax
作为源指针。 al
只是eax
最低八位的名称,因此您正在破坏源指针。您可能希望使用edx
代替。 Clobing源指针会导致不确定的复制长度,并且可能会溢出堆栈上的目标缓冲区,这将导致堆栈崩溃错误。eax
的值传递给write
系统调用。当您在循环期间增加eax
时,这会指向复制目标。如果您在复制循环之前将eax
复制到ecx
,则会解决该问题。