簡體   English   中英

匯編代碼中的Segmentation Fault / SIGSEV

[英]Segmentation Fault/ SIGSEV in assembly code

我正在一個從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信號。 我不明白為什么。 這是我編譯代碼的方式嗎?

我不太確定您的匯編代碼實際上在做什么 ,但是它錯過了ret語句(並且需要還原堆棧)。 如C代碼所知,匯編中沒有“隱式返回”。 此外,看起來堆棧框架的設置尚未完成。

因此,您需要在匯編函數的頂部和底部添加一些代碼行(您也可以將其與已編譯但未匯編或反匯編的C函數進行比較,它們具有與手寫體類似的結構):

push %rbp
mov %rsp, %rbp

...

mov %rbp, %rsp
pop %rbp
ret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM