本文所使用的是Ubuntu Linux 18.04 LTS版本操作系统,汇编器是GNU AS(简称as),连接器是GNU LD(简称ld)。将让32位汇编程序能在64位Ubuntu 18.04系统上实现汇编和连接。
具体问题:
以下是一段用于检测CPU品牌的汇编小程序(cpuid2.s):
.section .data
output:
.asciz "The processor Vendor ID is '%s'\n"
.section .bss
.lcomm buffer, 12
.section .text
.globl _start
_start:
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
由于上面cpuid2.s汇编程序是一个32位代码,并不能直接在Ubuntu 18.04上编译成64位程序,那么只能编译成32位程序了。
as -32 -gstabs -o cpuid2.o cpuid2.s
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 -lc cpuid2.o
提示:ld: i386 架构于输入文件 cpuid2.o 与 i386:x86-64 输出不兼容。
解决方法:
很简单,只要安装libc6-dev-i386软件包就可以了:
sudo apt-get install libc6-dev-i386
安装完成,重新汇编并连接完成后运行一下这个程序:
./cpuid2
命令行输出为:
The processor Vendor ID is 'AuthenticAMD'
注意:如果计算机使用的是AMD处理器,则输出CPU品牌是“AuthenticAMD”,如果是Intel的CPU,输出则是“GenuineIntel”,根据输入的信息可以判断这一台AMD处理器计算机。
相关主题