AT&T 汇编调用C库函数

注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!


前面尝试过使用write系统调用来显示CPU Vendor ID,这里将在AT&T 汇编中调用C 库函数中的printf 来打印信息.

汇编调用C函数,方法很简单:

1)调用就是使用call 指令。

2)参数传递方法为将规定数目的参数压栈。

void func(int a, int b);

若调用上面的函数,需要两个参数,而C压栈顺序为从右到左,故

pushl %ebx

pushl %ecx

则调用过程中func 中得到的b为ebx,a为ecx的值。

3)函数返回值保存在eax中。

4)调用结束后,调用放回复栈,addl 参数个数*4,  %esp

则printf的调用如下所示:

# print the CPUID Vendor ID by C library calls

.section .data
output:
	# .asciz 与ascii 不同在于,.asciz会在末尾添加空字符(0)
	.asciz	"The processor Vendor ID is '%s'\n"

.section .bss
	.lcomm	buffer, 12

.section .text

.global	_start

_start:
	nop
	movl	$0,		%eax
	cpuid

	movl	$buffer,%edi
	movl	%ebx,	(%edi)
	movl	%edx,	4(%edi)
	movl	%ecx,	8(%edi)

	pushl	$buffer
	pushl	$output
	call	printf

	addl	$8,		%esp
	pushl	$0
	call	exit

makefile:

all: cpuid_use_printf

cpuid_use_printf: cpuid_use_printf.o
	ld -dynamic-linker /lib/ld-linux.so.2 -o $@ -lc $<

cpuid_use_printf.o: cpuid_use_printf.s
	as -o $@ $<

clean:
	rm ./cpuid_use_printf ./cpuid_use_printf.o ./cpuid_use_printf.s~
运行:

liury@liury-laptop:~/program/asm/cpuid_use_printf$ make
as -o cpuid_use_printf.o cpuid_use_printf.s
ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid_use_printf -lc cpuid_use_printf.o
liury@liury-laptop:~/program/asm/cpuid_use_printf$ ls
cpuid_use_printf  cpuid_use_printf.o  cpuid_use_printf.s  makefile
liury@liury-laptop:~/program/asm/cpuid_use_printf$ ./cpuid_use_printf 
The processor Vendor ID is 'GenuineIntel'

链接:

1)使用动态链接可减小程序大小及节约内存,需要指定运行时加载动态库

ld -dynamic-linker /lib/ld-linux.so.2

2)用-l参数指定连接库

-lc


你可能感兴趣的:(BabyOS,AT&T汇编,ATT,att,C库,汇编)