gcc中的扩展asm:执行时出现分段错误;stosb“;

gcc中的扩展asm:执行时出现分段错误;stosb“;,c,gcc,assembly,inline-assembly,C,Gcc,Assembly,Inline Assembly,问题是,当程序步进到行:stosb时,它将显示一个错误:“程序接收信号SIGSEGV,分段错误。”我不知道为什么,有什么想法吗 在ubuntu x86_64下,使用“gcc-o test.c”编译和链接 #include <stdio.h> static inline char * strcpy(char * dest,const char *src) { int d0, d1, d2; __asm__ __volatile__("1:\tlodsb\n\t"

问题是,当程序步进到行:stosb时,它将显示一个错误:“程序接收信号SIGSEGV,分段错误。”我不知道为什么,有什么想法吗

在ubuntu x86_64下,使用“gcc-o test.c”编译和链接

#include <stdio.h>

static inline char * strcpy(char * dest,const char *src)
{
    int d0, d1, d2;
    __asm__ __volatile__("1:\tlodsb\n\t"
                         "stosb\n\t"
                         "testb %%al,%%al\n\t"
                         "jne 1b"
                         : "=&S" (d0), "=&D" (d1), "=&a" (d2)
                         : "0" (src),"1" (dest)
                         : "memory");
    return dest;
}

int main(void) {
    char* src_main = "Hello_src";
    char* dest_main = "Hello_des";
    strcpy(dest_main, src_main);
    puts(src_main);
    puts(dest_main);
    return 0;
}
#包括
静态内联字符*strcpy(字符*dest,常量字符*src)
{
int d0、d1、d2;
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“stosb\n\t”
testb%%al,%%al\n\t
“jne 1b”
:“=&S”(d0)、“=&D”(d1)、“=&a”(d2)
:“0”(src),“1”(目的地)
:“记忆”);
返回目的地;
}
内部主(空){
char*src\u main=“Hello\u src”;
char*dest\u main=“Hello\u des”;
strcpy(目的地总管、src总管);
puts(src_干管);
put(dest_main);
返回0;
}

问题是您试图覆盖内存的只读部分,其中存储字符串literal
“Hello\u des”
。不要那样做

解决方案是将目标设置为可写的数组:

char dest_main[32] = "Hello_des";

当然,有人想知道为什么要编写这段代码,初始化一个字符串,然后立即在其上加上另一个字符串是毫无意义的。

不要将字符串文本用于目标-字符串文本通常存储在只读部分,即它们实际上是
常量。更改:

char* dest_main = "Hello_des";
致:

或者只是:

char dest_main[16];

非常感谢。这只是一个练习。我不熟悉扩展装配。
char dest_main[16];