本文以获取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
是不是很方便呢?