在gcc中扩展asm:执行时出现分段错误" stosb"

时间:2014-10-03 08:56:44

标签: c gcc assembly inline-assembly

问题是,当程序走到行:stosb时,它将显示错误:"编程收到信号SIGSEGV,分段错误。"我不知道为什么,任何想法?

在ubuntu x86_64下,使用" gcc -o test 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;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

问题在于您是否正在尝试覆盖存储字符串文字"Hello_des"的只读内存部分。别这么做。

解决方案是使目标成为一个可写的数组:

char dest_main[32] = "Hello_des";

当然,有人想知道为什么你编写了这段代码,初始化一个字符串然后立即strcpy()另一个字符串就无意义了。

答案 1 :(得分:1)

不要使用字符串文字作为目标 - 字符串文字通常存储在只读部分中,即它们实际上是const。变化:

char* dest_main = "Hello_des";

为:

char dest_main[] = "Hello_des";

或只是:

char dest_main[16];