启动气体 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;但同样,我得到段错误 @AbuRisqi movl 会给你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 得到段错误?的主要内容,如果未能解决你的问题,请参考以下文章

递归 段错误 习题

GCC 生成的程序集 - C 函数调用时的段错误

动态数组获取“错误代码未指定启动失败”

apache安装php7过程中遇到到段错误

提升信号量导致段错误

这段代码有啥错误