AT&T汇编之使用C库函数

本文以获取CPUID的程序为例,来演示如何使用AT&T汇编调用C库函数。

首先看一下纯汇编代码示例:

.section .data                         
message:•                              
    .asciz "CPUID:xxxxxxxxxxxx\n"      
    len = . - message                  
.section .text                         
.global _start                         
_start:                                
    movl $0, %eax                      
    cpuid                              
                                       
    lea message(%rip), %esi•           
    movl %ebx, 6(%esi)                 
    movl %edx, 10(%esi)                
    movl %ecx, 14(%esi)                
                                       
    mov $1, %rax                       
    mov $1, %rdi                       
    lea message(%rip), %rsi            
    mov $len, %rdx                     
    syscall                            
                                       
    mov $60, %rax                      
    xor %rdx, %rdx                     
    syscall                                                            

代码输出:

wilcohuang@wilcohuang-PC1:/mnt/e/code/test-asm/2$ ./cpuid
CPUID:GenuineIntel

像这面这样,我们输入输出总是使用syscall,对于开发效率来说并不是很友好,然后我们可以来看一下使用C库的效果:

.section .data                          
message:                                
    .asciz "CPUID:%s\n"                 
.section .bss                           
    .lcomm buffer 12                    
.section .text                          
.global _start                          
_start:                                 
    xor %eax, %eax                      
    cpuid                               
                                        
    lea buffer(%rip), %edi              
    mov %ebx, (%edi)                    
    mov %edx, 4(%edi)                   
    mov %ecx, 8(%edi)                   
                                        
    lea message(%rip), %rdi             
    lea buffer(%rip), %rsi              
    call printf                         
                                        
    mov $0, %rdi                        
    call exit                           

汇编和连接命令:

 as  -gstabs+ -o cpuid.o cpuid.asm && ld -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cpuid cpuid.o

-lc表示链接C库。-dynamic-linker指定链接器。如果仅指定-lc,未指定连接器,程序执行时无法连接到C库,会报错。

输出如下:

CPUID:GenuineIntel

是不是很方便呢?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值