AT&T彙編之使用C庫函式

FreeeLinux發表於2018-12-20

本文以獲取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

是不是很方便呢?

相關文章