启动气体 x86 n 得到段错误?
Posted
技术标签:
【中文标题】启动气体 x86 n 得到段错误?【英文标题】:Start gas x86 n get segfault? 【发布时间】:2020-09-14 12:52:27 【问题描述】:求助,我不明白为什么会出现段错误。
void *cp1(void *a, const void *b, size_t c)
c=0;
asm volatile(
"movl $0x1,0x10(%%ebp)\n\t"
:::);
printf("n %zu\n",c);
我尝试了 objdump 并得到了这个,
mov $0x0,0x10(%%ebp)\n\t ; this c=0
mov $0x1,0x10(%%ebp)\n\t ; this code from my asm volatile, n cause segfault
为什么我的 asm 代码出现 seg 错误?
【问题讨论】:
函数定义 void *cp1(void *a, const void *b, size_t c) c=0;没有意义,因为参数 c 的参数未使用。 没用过? Eemmm,如果我在右值中使用它,就会使用 var c。如果是左值 var c,则不使用。 我正在尝试 n=n+1;但同样,我得到段错误 @AbuRisqimovl
会给你n = n + 1
吗?顺便说一句:你的意思是c = c + 1
?顺便说一句:你是在 32 位系统上吗?
@AbuRisqi 是什么让你认为偏移量是0x10
?
【参考方案1】:
几小时后,我比较文件输出 gcc,在 asm 文件 .s 上,参数的偏移量不是使用 ebp 而是 esp,我发现了这个 参数 1 12(%esp) 参数 2 16(%esp) 参数 3 20(%esp)
但是在我的代码上 参数 3 为 0x10(%ebp)
这可能会发生,因为 gcc 不解析我的 asm,而只是复制,因为我没有在我的代码上使用操作数输入/输出。 Gcc 将我的代码视为 asm 基本而不是扩展。 只需将粘贴复制到文件 .s。
【讨论】:
但我仍然无法更改值 var c以上是关于启动气体 x86 n 得到段错误?的主要内容,如果未能解决你的问题,请参考以下文章