当前位置:软件学习 > 其它软件 >>

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
补充:软件开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,