在閱讀《Professional Assembly Language》(Richard Blum 著)第四章的示例程序時仲翎,其中有演示在匯編中使用C語言庫函數(shù)--printf,但我在測試這段代碼時遇到了一些問題铛漓。
首先說明我的系統(tǒng)環(huán)境溯香,運(yùn)行的是 Linux Mint 18.3 Cinnamon 64 bit。
兼容問題
代碼測試中所遇到的問題究其原因浓恶,是在64位系統(tǒng)中進(jìn)行了32位匯編玫坛,事實(shí)上就是不兼容的問題,為了避免這個問題包晰,讓匯32位編代碼的匯編(as)和連接(ld)按書中指導(dǎo)正常進(jìn)行湿镀,需要安裝一些包含32位函數(shù)庫的軟件包炕吸,在終端運(yùn)行:
sudo apt install lib32z1 lib32ncurses5 g++-multilib libc6-dev-i386
指定生成32-bit程序
首先打開匯編源碼文件cpuid2.s,在首行添加代碼 ".code32"
# cpuid2.s view the CPUID vendor id string using C library calls
.code32
.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
在終端運(yùn)行匯編器:
as --32 -o cpuid2.o cpuid2.s
生成32位目標(biāo)文件cpuid2.o
然后執(zhí)行連接操作:
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 -lc cpuid2.o
生成linux下可執(zhí)行程序cpuid2勉痴,可以查看文件類型
file cpuid2
結(jié)果為:
cpuid2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
至此赫模,代碼測試成功,程序可以正常運(yùn)行蒸矛。
編寫64-bit匯編代碼
# cpuid64.s using 64-bit assembly language
# view the CPUID vendor id string using C library calls
.section .data
output:
.asciz "the processor vendor id is '%s'\n"
.section .bss
.lcomm buffer,12
.section .text
.globl _start
_start:
movq $0, %rax
cpuid
movq $buffer, %rdi
movq %rbx, (%rdi)
movq %rdx, 4(%rdi)
movq %rcx, 8(%rdi)
movq $buffer, %rsi
movq $output, %rdi
movq $0, %rax
call printf
addq $8, %rsp
pushq $0
call exit