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

是不是很方便呢?

你可能感兴趣的:(AT&T,asm,汇编,linux,汇编C,汇编语言)