0

我在将字符串复制到 Assembly 中的空数组时遇到问题。

首先,我得到了一些我想复制的垃圾而不是字符串。

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

}

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

先感谢您

4

1 回答 1

3

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

  • 您将寄存器al用作传输字符的缓冲区,同时eax用作源指针。al只是最低八位的名称,eax因此您正在破坏源指针。您可能想edx改用。破坏源指针会导致不确定的复制长度,并且可能会溢出堆栈上的目标缓冲区,这将导致堆栈粉碎错误。
  • 堆栈上的目标缓冲区太小。您正在尝试复制 3 个字符和 NUL 字节,它在目标缓冲区中需要四个字节。
  • 您将循环eax write的值传递给系统调用。eax当您在循环期间增加时,这指向复制目标。如果您在复制循环之前复制eaxecx,则该问题已解决。
  • 最后,您复制了三个非 NUL 字符,但只打印了两个。
于 2014-11-25T20:57:40.020 回答