gcc中的扩展asm:执行时出现分段错误;stosb“;
问题是,当程序步进到行:stosb时,它将显示一个错误:“程序接收信号SIGSEGV,分段错误。”我不知道为什么,有什么想法吗 在ubuntu x86_64下,使用“gcc-o test.c”编译和链接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"
#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];