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的调用如下所示:
[plain] view plaincopyprint?
# 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:
[plain] view plaincopyprint?
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
补充:软件开发 , 其他 ,