lahf 啥时候可以在 x86-64 模式下使用?

Posted

技术标签:

【中文标题】lahf 啥时候可以在 x86-64 模式下使用?【英文标题】:When is lahf usable in x86-64 modes?lahf 什么时候可以在 x86-64 模式下使用? 【发布时间】:2021-01-06 23:44:27 【问题描述】:

lahf指令的描述是:

此指令在兼容模式和传统模式下按上述方式执行。仅当 CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1

时才在 64 位模式下有效

第一个问题:什么是兼容性和遗留模式。它们与实模式和保护模式有何不同

第二个问题:什么意思CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1

谢谢!!!

【问题讨论】:

en.wikipedia.org/wiki/X86-64#Operating_modes。第 2 部分:这是标准的 CPUID 表示法;阅读 Intel 的 PDF 手册,其中解释了它如何描述要使用的 CPUID 输入以及要查看的结果位。 (可能是第 2 卷手册。)另见 sandpile.org/x86/cpuid.htm 【参考方案1】:

什么是兼容性和传统模式。它们与实模式和保护模式有何不同

一个 80x86 CPU 有多种模式。软件开发人员可能关心的是实模式、保护模式和长模式;但也有系统管理模式(多为“仅固件使用”)、“非活动”(等待启动)等。

保护模式有多个子模式(16位、32位、virtual8086)。

Long 模式有多个子模式(16 位、32 位、64 位)。

“Legacy mode/s”指的是实模式和保护模式(以及所有保护模式的子模式),而不是长模式或其任何子模式;其中代码是 16 位或 32 位(实模式和保护模式之间的其他差异对大多数指令无关紧要,仅对段寄存器加载和操作系统内核之类的事情重要)。遗留模式的存在是为了向后兼容旧的软件/操作系统(例如 MS-DOS 不支持长模式,将使用实模式,Windows95 将不使用长模式,将使用保护模式等)。

Compatibility mode/s 是指长模式的 16 位和 32 位子模式。兼容模式(或长模式的 16 位和 32 位子模式)的存在是为了允许较新的操作系统执行为旧操作系统设计的程序(例如,允许运行 64 位版本的 Windows为 32 位版本的 Windows 设计的应用程序)。在这种情况下,代码是 16 位或 32 位(如传统模式);但它与传统模式不同,因为它仍在使用长模式机制进行分页、中断等。主要是;对于兼容模式,即使当前执行的代码不是,内核也应该是 64 位的。

第二个问题:CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1是什么意思

CPUID 指令返回有关 CPU 的信息。因为有很多信息,所以信息被分成组/“叶子”,EAX 中的值决定了 CPUID 指令将返回哪些信息(在某些情况下,ECX 还会修改返回哪些信息)。信息在通用寄存器(EAX、EBX、ECX、EDX)中返回。

"CPUID.80000001H:ECX.LAHF-SAHF[bit 0]" 表示“当 CPUID 以 EAX=0x80000001 调用时,ECX 的位 0 中的 CPUID 指令返回的值”(LAHF-SAHF 部分正是 AMD 决定给出的名称位)。

换句话说,您的代码可能看起来像(英特尔语法汇编):

    mov eax,0x80000001
    cpuid
    test ecx,1           ;Is bit 0 (the "LAHF-SAHF" bit) set?
    je .noLAHF           ; no, LAHF is not supported

【讨论】:

以上是关于lahf 啥时候可以在 x86-64 模式下使用?的主要内容,如果未能解决你的问题,请参考以下文章

X86-64 汇编学习1

X86-64 汇编学习1

在 64 位操作系统的 64 位 CPU 上运行 X86-64 Python 有啥好处吗?

如果 x86-64 中没有兼容模式开关,我是不是保证不会遇到非 64 位指令?

linux发行版中的i386/i686/x86-64/有啥区别?

汇编语言-X86处理器架构-64位x86处理器