Lỗi Segmentation fault (core dumped) khi kết hợp mã nasm vào c

Các bác ơi! Sao em làm giống hướng dẫn như trong link này
https://stackoverflow.com/questions/24991944/linking-c-with-nasm
file add.asm:

global add

section .data

section .text

add:
    mov   eax, [esp+4]   ; argument 1
    add   eax, [esp+8]   ; argument 2
    ret

file main.c:

#include <stdio.h>

int add(int a, int b);

int main(int argc, char *argv[])
{
  printf("%d\n", add(2, 6));
  return 0;
}

terminal:


Nhưng nó bị lỗi Segmentation fault (core dumped). Có bác nào giúp em khắc phục với, Em cảm ơn ạ!

Đã thử chạy gdb, mở assembly view (layout asm) xem nó chết ở dòng nào chưa?

5 Likes

Hình như bạn đang compile dưới chế độ 64bit. Mà cú pháp ở dưới lại là 32bit address.

Bạn thử đổi thành:

mov eax, [esp+8] ; argument 1 
add eax, [esp+16] ; argument 2

… xem sao.

5 Likes

Vẫn không được bác ơi nó vẫn báo lỗi!

gcc -S main.c rồi mở file main.s lên coi nó compile ra cái gì

thấy nó compile ra thế này:
image

nghĩa là nó load 2 và 6 vào thẳng register ecx và edx chứ ko load lên stack :V :V :V
sửa file add.asm lại thành

global add

section .data

section .text

add:
    mov eax, ecx
    add eax, edx
    ret

rồi compile là được :V

nếu ko gọi add(2, 6) mà gọi add(x, y) với x, y nhập vào thì cứ gcc -S main.c rồi mở main.s lên xem nó gọi hàm add như thế nào :V :V

7 Likes

Ok em làm được rồi! Có vậy mà em nghĩ hoài không ra, Cảm ơn bác nhiều ạ!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?