64位模式下 nasm 和c语言的互相调用

首先,需要说明的是,64位模式下,nasm和c语言函数之间的参数传递是通过64位寄存器来进行的,而32位模式下,参数的传递则是通过栈来实现的,这一点区别很重要!!

在,64位模式下,针对64位整型参数(long类型),按照参数从左到右的顺序,依次通过寄存器RDI, RSI,RDX, RCX,R8, 和 R9 来传递,如果参数个数超过了这么多,那么多余的参数通过栈来传递

1, nasm 调用c语言函数

extern printf

section .text
global main
main:

	push 	rbp
	mov 	rbp, rsp

	
	mov 	rdi, format
	mov 	rsi, 5
	mov 	rdx, 7

	

	call 	printf

	mov 	eax, 0

	leave
	ret
 
section .data

format  	db "%d == %d",0xa,0
编译方法   : nasm -f elf64 文件名

                        gcc 文件名.o

2, c语言调用nasm函数


test.c 文件源码:

#include 

extern long add(long a, long b);

int main()
{
	printf("%d\n", add(5,7));
	return 0;
}

add.asm  文件源码:


section .text
global add
add:

	push 	rbp
	mov 	rbp, rsp

	push 	rbx
	
	mov		rax, rdi
	mov 	rbx, rsi
	add 	rax, rbx


	pop 	rbx

	leave
	ret
 

编译方式:  nasm -f elf64 add.asm

                      gcc  test.c add.o


PS:: 上面的例子中c语言中的变量类型都用的long,是为了简化叙述,然而实际运用中,对于不同类型的变量,传递时使用的寄存器也不一定是上述的那几个,上面的那几个寄存器只用来传递类似64位整型之类的数据。其他的数据类型 如浮点数 等等,需要不同的寄存器。具体的请参考http://www.x86-64.org/documentation/abi.pdf  内容很多,耐心看吧^_^

你可能感兴趣的:(64位模式下 nasm 和c语言的互相调用)