【问题标题】:Linking C with NASM将 C 与 NASM 链接
【发布时间】:2014-09-19 10:42:02
【问题描述】:

我有一个 NASM 文件和一个 C 文件。如何从 NASM 文件调用 C 文件中的函数?如何从 C 文件中调用 NASM 函数?

非常感谢 DD

【问题讨论】:

标签: c assembly nasm


【解决方案1】:

从 C 调用汇编函数:

C 文件:

#include <stdio.h>

int add(int a, int b);

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

汇编文件:

global add

section .data

section .text

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

编译:

$ nasm -f elf add.asm 
$ gcc -Wall main.c add.o 
$ ./a.out 
8
$ 

从程序集中调用 C 函数:

C 文件:

int add(int a, int b)
{
  return a + b;
}

汇编文件:

extern add
extern printf
extern exit

global _start

section .data
  format db "%d", 10, 0
section .text

_start:
    push  6
    push  2
    call  add     ; add(2, 6)

    push  eax
    push  format
    call  printf  ; printf(format, eax)

    push  0
    call exit     ; exit(0)

编译:

$ gcc -Wall -c add.c
$ nasm -f elf main.asm 
$ ld main.o add.o -lc -I /lib/ld-linux.so.2
$ ./a.out 
8
$ 

【讨论】:

  • 这当然是假设一个 32 位平台;它不适用于 64 位平台
  • @DrewMcGowen 是什么让这个程序成为 32 位或 64 位?
  • @AbhishekSagar 默认情况下,gcc 将编译为与您的操作系统运行的位数相同的位数
  • 它不会在 32 位上工作,因为你传递参数的方式不一样。您不会将东西压入堆栈。相反,您使用 ABI 并将寄存器用作参数。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2011-05-02
  • 2017-05-26
相关资源
最近更新 更多