lahf 何时可用于 x86-64 模式?

When is lahf usable in x86-64 modes?

lahf指令的描述为:

This instruction executes as described above in compatibility mode and legacy mode. It is valid in 64-bit mode only if CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1

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

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

what is compatibility and legacy mode. How are they different from real-mode and protected mode

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

保护模式有多个sub-modes(16位,32位,virtual8086)。

长模式有多个sub-modes(16位、32位、64位)。

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

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

Second question: what does it mean CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1

CPUID指令return关于CPU的信息。因为有很多信息,信息被分成组/“叶”,其中 EAX 中的值决定了 CPUID 指令将 return 哪些信息(在某些情况下,ECX 也会修改哪个信息是 returned)。信息在通用寄存器(EAX、EBX、ECX、EDX)中 returned。

"CPUID.80000001H:ECX.LAHF-SAHF[bit 0]"的意思是"当CPUID用EAX=调用时,ECX的第0位由CPUID指令编辑的值return 0x80000001”(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