gpt4 book ai didi

c - 汇编代码中的段错误/SIGSEGV

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:48 24 4
gpt4 key购买 nike

我正在开发一个从 C 代码调用汇编函数的项目。运行我编写的代码时出现段错误,我不确定原因。

文件.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 信号。我不明白为什么。这是我编译代码的方式吗?

最佳答案

我不太确定您的汇编代码实际上在做什么,但它缺少一个ret 语句(并且需要恢复堆栈)。从 C 代码可知,汇编中没有“隐式返回”。此外,看起来堆栈框架的设置尚未完成。

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

push %rbp
mov %rsp, %rbp

...

mov %rbp, %rsp
pop %rbp
ret

关于c - 汇编代码中的段错误/SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com