登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

DOS编程技术

讨论在纯DOS下的编程技术

 
 
 

日志

 
 
关于我

1984年大学毕业,1985年底有机会开始接触PC机,1986年开始在PC机上做开发工作,曾接触过MS-DOS、CP/M、UNIX、VMS、LINUX、iRMX等众多的操作系统并在上面从事技术开发,擅长做底层与硬件相关的软件开发,目前主要在DOS和LINUX平台下工作,主要从事软件,在硬件开发上也有一定造诣,亦有在8051系列、6502系列(凌阳)、z80系列、ARM、X86等各类平台下开发软硬件的经历。更详细情况可以参考http://resume.whowin.net

Intel CPU的CPUID指令(三)  

2009-02-10 11:23:14|  分类: 杂七杂八 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    本文主要介绍CPUID指令返回扩展信息的部分

8、EAX=80000001h:最大扩展功能号

    mov eax, 80000001h
    cpuid

    该功能除了能够向(一)中介绍的那样返回CPU支持的最大扩展功能号外,并没有其它作用,EBX、ECX、EDX都不返回有意义的信息。

9、EAX=80000002h:返回CPU支持的扩展功能

    mov eax, 80000002h
    cpuid

    执行CPUID指令后,扩展功能标志在EDX和ECX中返回,EDX中的定义如下:

     Bit    Name      Description
    -------------------------------------------------------------------
    10:00             Reserved
      11    SYSCALL   SYSCALL/SYSRET
    19:12             Reserved
      20    XD        Bit Execution Disable Bit
    28:21             Reserved
      29    Intel? 64 Intel? 64 Instruction Set Architecture
    31:30             Reserved

    返回在ECX中的位定义:
     Bit    Name      Description
    -------------------------------------------------------------------
      0     LAHF      LAHF / SAHF
    31:01             Reserved

10、EAX=80000002h、80000003h、80000004h:返回处理器名称/商标字符串

    mov eax, 80000002h
    cpuid
    ......
    mov eax, 80000003h
    cpuid
    ......
    mov eax, 80000004h
    cpuid

    每次调用CPUID分别在EAX、EBX、ECX、EDX中返回16个ASCII字符,处理器名称/商标字串最多48个字符,前导字符为空格,结束字符为NULL,在寄存器中的排列顺序为little-endian(即低字符在前),下面程序可以在DOS下显示处理器名称/商标字串(使用MASM 6编译)。

                .model tiny
                .386
cseg            segment para public 'code'
                org     100h
                assume  cs:cseg, ds:cseg, es:cseg
cpuid           macro
                db      0fh
                db      0a2h
endm
begin:
                mov     eax, 80000000h
                cpuid
                cmp     eax, 80000004h
                jb      not_supported
                mov     di, offset CPU_name
                mov     eax, 80000002h
                cpuid
                call    save_string
                mov     eax, 80000003h
                cpuid
                call    save_string
                mov     eax, 80000004h
                cpuid
                call    save_string
                mov     dx, offset crlf
                mov     ah, 9
                int     21h
                cld
                mov     si, offset CPU_name
spaces:
                lodsb
                cmp     al, ' '
                jz      spaces
                cmp     al, 0
                jz      done
disp_char:
                mov     dl, al
                mov     ah, 2
                int     21h
                lodsb
                cmp     al, 0
                jnz     disp_char
done:
                mov     ax, 4c00h
                int     21h
not_supported:
                jmp     done
save_string:
                mov     dword ptr [di], eax
                mov     dword ptr [di + 4], ebx
                mov     dword ptr [di + 8], ecx
                mov     dword ptr [di + 12], edx
                add     di, 16
                ret
crlf            db      0dh, 0ah, '$'
CPU_name        db      50 dup(0)
cseg            ends
                end     begin

11、EAX=80000005h:备用

12、EAX=80000006h:扩展L2高速缓存功能

    mov eax, 80000006h
    cpuid

    执行完CPUID指令后,相应信息在ECX中返回,以下是ECX中返回信息的定义:

     Bits    Description
    -----------------------------------------------------------
    31:16    L2 Cache size described in 1024-byte units.
    15:12    L2 Cache Associativity Encodings
               00h Disabled
               01h Direct mapped
               02h 2-Way
               04h 4-Way
               06h 8-Way
               08h 16-Way
               0Fh Fully associative
    11:8     Reserved
     7:0     L2 Cache Line Size in bytes. 

13、EAX=80000007h:电源管理

    mov eax, 80000007h
    cpuid

    执行CPUID指令后,是否支持电源管理功能在EDX的bit8中返回,其余位无意义。

14、EAX=80000008h:虚拟地址和物理地址大小

    mov eax, 80000008h
    cpuid

    执行CPUID指令后,物理地址的大小在EAX的bit[7:0]返回,虚拟地址的大小在EAX的bit[15:8]返回,返回的内容为虚拟(物理)地址的位数。例如在我的机器上的运行结果如下:

Intel CPU的CPUID指令(三) - whowin - DOS编程技术

    表明我的机器支持36位的物理地址和48位的虚拟地址。 

 

 

 

 

  评论这张
 
阅读(5114)| 评论(3)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018