Assembly中的字符串副本

时间:2014-11-25 20:40:33

标签: c assembly intel-syntax

我在将程序集中的字符串复制到空数组时遇到了问题。

首先,我得到了一些代替我要复制的字符串。

其次,程序应该使用最多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");

}

我是大会新手所以请帮助我。

提前谢谢

1 个答案:

答案 0 :(得分:3)

我发现您的代码有四个问题:

  • 您使用寄存器al作为传输字符的缓冲区,同时使用eax作为源指针。 al只是eax最低八位的名称,因此您正在破坏源指针。您可能希望使用edx代替。 Clobing源指针会导致不确定的复制长度,并且可能会溢出堆栈上的目标缓冲区,这将导致堆栈崩溃错误。
  • 堆栈上的目标缓冲区太小。您正在尝试复制3个字符和NUL字节,目标缓冲区中需要4个字节。
  • 您将循环后eax 的值传递给write系统调用。当您在循环期间增加eax时,这会指向复制目标。如果您在复制循环之前将eax复制到ecx,则会解决该问题。
  • 最后,你复制了三个非NUL字符,但只打印了两个。