#cpuid.s simple program to extract the processor Vendor ID
#HOw TO complie and run
#as -o cpuid.o cpuid.s
#ld -o cpuid cpuid.o
.section .data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
movl $4, %eax
cpuid
movl $output, %edi
movl %ebx, 28(%edi)
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
movl $4, %eax
movl $1, %ebx
movl $output, %ecx
movl $42, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
這段代碼的作用很簡單通過彙編指令輸出CPU Verdor ID
他是那是怎麼實現的呢?
首先在數據段(.data)中聲明瞭一個字符串:
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
字符串元素被預定義並且放在內存中,用output標示。
接下來,程序聲明瞭指令代碼和一般的起始標籤。
程序要做的第一件事是使EAX寄存器加載零值,零標示輸出CPU廠商ID,然後運行CPUID指令。
接下來:
movl $output, %edi
movl %ebx, 28(%edi)
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
第一條指令創建了一個指針,output標籤的內存位置會加載到EDI中。
接下來,按照EDI指針。包含CPU ID的相關字符串的寄存器的內容被數據內存的正確位置。
後半部分是調用系統的。
movl $4, %eax #調用的系統函數
movl $1, %ebx #輸出目的地,也就是標準輸出(當前的會話終端)
movl $output, %ecx #
movl $42, %edx #字符串長度
int $0x80 #Linux內核調用
movl $1, %eax #使用退出函數
movl $0, %ebx #程序退出後,返回給shell的值