AT&T汇编总结_6_C语言程序使用汇编函数(跨文件)

目的

掌握C语言程序跨文件调用汇编函数的规则

前置知识

参数访问

若希望汇编语言函数和C一起工作,就必须显式地遵守C样式的函数样式,也就是汇编函数的标准格式
C程序调用汇编函数时,会将参数放在堆栈中,参数分布如下
可以通过ebp作为基址访问参数
若函数有返回值,系统默认将eax的值返回

上下文保存

函数中可用的寄存器如右
有一些寄存器在主程序中被用到,所以使用前需要先保存

汇编函数模板

实际应用

源程序

try12.c

extern void Print_Addresult(int a, int b);
extern void Print_Mulresult(int a, int b);

int main(){
	int num1=10, num2=90;
	Print_Addresult(num1, num2);
	Print_Mulresult(num1, num2);

	return 0;
}

try13.s

.data
str0:
	.asciz "The result is %d.\n"

.text
.type Print_Addresult, @function
.global Print_Addresult

Print_Addresult:
	pushl %ebp
	movl %esp, %ebp

	movl 8(%ebp), %edx
	movl 12(%ebp), %ecx
	addl %edx, %ecx

	pushl %ecx
	pushl $str0
	call printf
	addl $8, %esp

	movl %ebp, %esp
	popl %ebp
	ret

try14.s

.data
str0:
	.asciz "The result is %d.\n"

.text
.type Print_Mulresult, @function
.global Print_Mulresult

Print_Mulresult:
	pushl %ebp
	movl %esp, %ebp

	movl 8(%ebp), %edx
	movl 12(%ebp), %ecx
	imull %edx, %ecx

	pushl %ecx
	pushl $str0
	call printf
	addl $8, %esp

	movl %ebp, %esp
	popl %ebp
	ret

编译执行

一键编译执行

编译、链接和执行


版权声明:本文为dc12499574原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。