Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 程序集中的字符串复制_C_Assembly_Intel Syntax - Fatal编程技术网

C 程序集中的字符串复制

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;"

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

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

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

}
#包括
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
    值传递给
    write
    syscall。当您在循环过程中增加
    eax
    时,这将指向复制目标。如果在复制循环之前将
    eax
    复制到
    ecx
    ,则该问题已修复
  • 最后,复制三个非NUL字符,但只打印两个

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

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

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

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

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

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

很抱歉,我一点也不明白。你能给我看一下我应该修改的代码吗?另一个答案已经解决了第一点,所以你根本不需要对这一点做任何事情。第二点是以声明为目标