Mac下C语言如何调用Nasm汇编函数

参考博客Luca's Blog

使用nasm编写函数的时候,函数开头需要有标号(就是这个函数的名称,开头必须是一个下划线),并且标号要用global声明为全局的,并且函数最后一行得使用ret返回:

global _idio
section .text
_idio:
	;todo somthing
	ret

然后C语言需要声明extern类型的函数:

1
2
3
4
5
6
extern void idio();

int main(){
  idio();
  return 0;
}

具体的函数返回值和参数取决于你的汇编代码。

编译的时候Nasm需要使用-fmacho64来编译为Mac系统的64位机器语言:

1
nasm -fmacho64 idio.asm -o idio.o

返回值的话汇编语言中需要将返回值放到rax中:

global _idio
section .text
_idio:
	mov rax, 20
	ret
1
2
3
4
5
6
extern int idio();

int main(){
  printf("%d", idio());
  return 0;
}

C语言输出20。

函数参数的话,取决于你使用的C语言编译器和平台。我这里是MacOS系统上的GCC编译器,前六个参数分别放在rdi,rsi,rdx,rcx,r8,r9寄存器中:

global _add
section .text
_add:
	mov rax, 0
	add rax, rdi
	add rax, rsi
	add rax, rdx
	ret
1
int add(int a, int b, int c);	//a参数放入rdi,b参数放入rsi,c参数放入rdx

具体什么类型的编译器和平台对应什么参数,见wiki X86 calling convertions

updatedupdated2023-06-082023-06-08