C 程序集中的字符串复制
我在将字符串复制到程序集中的空数组时遇到问题 首先,我得到一些垃圾,而不是字符串,我想复制 其次,该程序应该使用最多100个字符的字符串,但当我声明一个包含100个字符的数组时,我在使用gcc编译后得到“***检测到堆栈崩溃***”C 程序集中的字符串复制,c,assembly,intel-syntax,C,Assembly,Intel Syntax,我在将字符串复制到程序集中的空数组时遇到问题 首先,我得到一些垃圾,而不是字符串,我想复制 其次,该程序应该使用最多100个字符的字符串,但当我声明一个包含100个字符的数组时,我在使用gcc编译后得到“***检测到堆栈崩溃***” #include<stdio.h> void main() { char *s="aac"; char t[4]; asm volatile ( ".intel_syntax noprefix;"
#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");
}
#包括
void main(){
char*s=“aac”;
chart[4];
挥发性物质(
“.intel_语法noprefix;”
mov eax,%0
“推eax;”
mov eax,%1
“推eax;”
“呼叫打印;”
“jmp结束;”
“打印:”
“推ebp;”
mov-ebp,尤指
“推eax;”
“推ebx;”
“推ecx;”
“推送edx;”
“mov ebx,[ebp+12];”
“mov eax,[ebp+8];”
mov ecx,eax
“复制:”
“mov dl,[ebx];”
mov[eax],dl
“公司ebx;”
“公司eax;”
cmp-dl,0
“jnz复制;”
xor edx,edx
“mov eax,4;”
“mov ebx,1;”
“mov edx,3;”
“int 0x80;”
“pop edx;”
“流行ecx;”
“波普ebx;”
“pop eax;”
“流行的ebp;”
“ret 4;”
“结束:”
“.att_语法前缀;”
:
:“r”(s),“r”(t)
:“eax”
);
printf(“\n”);
}
我是装配新手,请帮帮我
提前感谢您我发现您的代码有四个问题:
- 您使用寄存器
作为传输字符的缓冲区,同时使用al
作为源指针eax
只是al
最低八位的名称,因此您正在删除源指针。您可能想改用eax
。重击源指针会导致不确定的复制长度,并可能使堆栈上的目标缓冲区溢出,从而导致堆栈粉碎错误edx
- 堆栈上的目标缓冲区太小。您正在尝试复制3个字符和NUL字节,目标缓冲区中需要4个字节
- 您正在将循环后的
值传递给eax
syscall。当您在循环过程中增加write
时,这将指向复制目标。如果在复制循环之前将eax
复制到eax
,则该问题已修复ecx
- 最后,复制三个非NUL字符,但只打印两个
- 您使用寄存器
作为传输字符的缓冲区,同时使用al
作为源指针eax
只是al
最低八位的名称,因此您正在删除源指针。您可能想改用eax
。重击源指针会导致不确定的复制长度,并可能使堆栈上的目标缓冲区溢出,从而导致堆栈粉碎错误edx
- 堆栈上的目标缓冲区太小。您正在尝试复制3个字符和NUL字节,目标缓冲区中需要4个字节
- 您正在将循环后的
值传递给eax
syscall。当您在循环过程中增加write
时,这将指向复制目标。如果在复制循环之前将eax
复制到eax
,则该问题已修复ecx
- 最后,复制三个非NUL字符,但只打印两个
- 您使用寄存器
作为传输字符的缓冲区,同时使用al
作为源指针eax
只是al
最低八位的名称,因此您正在删除源指针。您可能想改用eax
。重击源指针会导致不确定的复制长度,并可能使堆栈上的目标缓冲区溢出,从而导致堆栈粉碎错误edx
- 堆栈上的目标缓冲区太小。您正在尝试复制3个字符和NUL字节,目标缓冲区中需要4个字节
- 您正在将循环后的
值传递给eax
syscall。当您在循环过程中增加write
时,这将指向复制目标。如果在复制循环之前将eax
复制到eax
,则该问题已修复ecx
- 最后,复制三个非NUL字符,但只打印两个
- 您使用寄存器
作为传输字符的缓冲区,同时使用al
作为源指针eax
只是al
最低八位的名称,因此您正在删除源指针。您可能想改用eax
。重击源指针会导致不确定的复制长度,并可能使堆栈上的目标缓冲区溢出,从而导致堆栈粉碎错误edx
- 堆栈上的目标缓冲区太小。您正在尝试复制3个字符和NUL字节,目标缓冲区中需要4个字节
- 您正在将循环后的
值传递给eax
syscall。当您在循环过程中增加write
时,这将指向复制目标。如果在复制循环之前将eax
复制到eax
,则该问题已修复ecx
- 最后,复制三个非NUL字符,但只打印两个