汇编代码中的分段错误/ SIGSEV

时间:2018-04-04 14:31:19

标签: c assembly

我正在开发一个从c代码调用汇编函数的项目。当我运行代码时,我遇到了分段错误,我不确定原因。

file.c:

#include <stdio.h> 
#include <time.h>
#include <unistd.h>


extern void asmFunction();

void callAsmFunction(){
  while(1){
    asmFunction();
}

return;
}


int main(int argc, char* argv[]){
  callAsmFunction();
}

asmFunction.s:

.global asmFunction
asmFunction:
    push %rbp
    movl $0x1,-0x8(%rbp)
    cmpl $0x0,-0x8(%rbp)
    jne .L2
    nop
    nop
    nop
.L2:
    cmpl $0x0,-0x8(%rbp)
    jne .L3
    nop
    nop
    nop
.L3:
    cmpl $0x0,-0x8(%rbp)

我按以下方式编译了我的代码:gcc -o file file.c asmFunction.s。

我调试了我的代码,发现在最后一行“cmpl $ 0x0,-0x8(%rbp)”之后我会收到SIGSEV信号。我不明白为什么。这是我编写代码的方式吗?

1 个答案:

答案 0 :(得分:4)

我不太确定你的汇编代码实际上是正在做什么,但它错过了ret语句(并且需要恢复堆栈)。没有&#34;隐含的回报&#34;在C代码中已知的汇编中。此外,看起来堆栈框架的设置还没有完成。

因此,您需要在汇编函数的顶部和底部添加一些代码行(您还可以与已编译但未汇编或反汇编的C函数进行比较,这些函数具有与手写相似的结构):

push %rbp
mov %rsp, %rbp

...

mov %rbp, %rsp
pop %rbp
ret