gpt4 book ai didi

c - 汇编中的字符串复制

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:39 28 4
gpt4 key购买 nike

我在将字符串复制到 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");

}

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

提前谢谢你

最佳答案

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

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

关于c - 汇编中的字符串复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27136274/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com