Linux发行版知识普及:三个版本的CPUID
来源: 赛迪网 作者: 编辑:admin 发布时间:2008-2-3 9:11:38

第一个版本

x86-ubuntu-64位环境,at&t格式(gas汇编),使用Linux系统调用:

 

 

#CPUid.s show extract the processor vendor ID
            .section .data
            output:
            .ascii "the processor vendor ID is 'XXXXXXXXXXXX'\n"
            .section .text
            .globl main
            main:
            movl $0, %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
            int $0x80

 

第二个版本

x86-ubuntu-64位环境,at&t格式(gas汇编),使用C库函数,注意使用了64位寄存器,想改成32位只要把所有带r的改成带e的就可以了

 

 

# cpuidinlib.s show extract the processor vendor ID using library
            .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
            movl %ebx, (%rdi)
            movl %edx, 4(%rdi)
            movl %ecx, 8(%rdi)
            movq $output, %rdi
            movq $buffer, %rsi
            xorq %rax, %rax
            call printf
            movq $0, %rdi
            xorq %rax, %rax
            call exit
            不过上面有一个问题
            printf("%s", str);

 

这样的形式不常见,既然是字符串, str应该是以0结束的,但是注意上面并没有以0结束,那么printf是怎么判断字符串结束了呢? 在C下一样成功,不知道为什么,知道的告诉我下。

 

第三个 x86-win32,使用intel语法(masm32开发包), 调用Windows API.这个估计都熟悉

 

 

;; cpuid
            .686
            .model flat, stdcall
            option casemap: none
            include windows.inc
            include user32.inc
            includelib user32.lib
            include kernel32.inc
            includelib kernel32.lib
            includelib msVCrt.lib
            sprintf PROTO C:DWORD, :DWORD, :VARARG
            .data
            msg db 'the processor vendor ID is %s', 0
            note db '注意', 0
            .data?
            result db 13 dup(?)
            buff db 128 dup(?)
            .code
            start:
            call go
            invoke ExitProcess,NULL
            go:
            mov eax, 0
            cpuid
            mov edi, offset result
            mov [edi], ebx
            mov 4[edi], edx
            mov 8[edi], ecx
            mov byte ptr 12[edi], 0
            push dword ptr offset result
            push dword ptr offset msg
            push dword ptr offset buff
            ;call sprintf
            mov eax, 77c0f931H
            call eax
            add esp, 12
            invoke MessageBox, NULL, addr buff, addr note, MB_OK
            ret
            end start
收藏】 【 】 【关闭
相关文章
·08年最值得期待的八大垂直搜索引擎 (2008-5-28 9:48:56)
·俄通过网络过滤限制中小学生接触有害网站 (2008-3-31 10:16:02)
·Linux操作系统下的三种Java环境配置方法 (2008-2-3 9:16:28)
·Linux发行版知识普及:三个版本的CPUID (2008-2-3 9:11:38)
·使用"Oracle"解析函数快速检查序列间隙 (2008-2-3 9:08:46)
·讲解"Oracle"下导出某用户所有表的方法 (2008-2-3 9:07:27)
·Cisco路由器访问权限的设置 (2008-2-1 10:57:31)
·Cisco设备通用show命令介绍 (2008-2-1 10:55:13)
最新新闻
·08年最值得期待的八大垂直
·俄通过网络过滤限制中小学
·Linux操作系统下的三种Jav
·Linux发行版知识普及:三
·使用"Oracle"解析函数快速
·讲解"Oracle"下导出某用户
·Cisco路由器访问权限的设
·Cisco设备通用show命令介
·讲解Oracle数据库在NT平台
·如何提高Linux操作系统命
热点新闻
·Prometric:考MCSE2003可获
·在微软数据库中没有查到成
·IBM专业认证经验总结
·走近Lotus培训认证
·数据结构(C语言描述)
·局域网组维护基础与实例教
·电脑上网基础与实例教程介
·Cisco职业认证再认证体系
·VB6中用Oracle数据控件访
·移去广告的简单方法
推荐新闻
·Prometric:考MCSE2003可获
·在微软数据库中没有查到成
·IBM专业认证经验总结
·走近Lotus培训认证
·数据结构(C语言描述)
·局域网组维护基础与实例教
·电脑上网基础与实例教程介
·Cisco职业认证再认证体系
·VB6中用Oracle数据控件访
·移去广告的简单方法