lahf指令的描述是:
此指令在兼容模式和传统模式下如上所述执行。仅当CPUID.800000001H:ECX.LAHF-SAHF[位0]=1 时,它在64位模式下有效
第一个问题:什么是兼容性和遗留模式?它们与真实模式和受保护模式有何不同?
第二个问题:CPUID.800000001H:ECX.LAHF-SAHF[bit 0]=1是什么意思?
什么是兼容性和遗留模式。它们与真实模式和保护模式有何不同
80x86 CPU有多种模式。软件开发人员可能关心的是真实模式、保护模式和长模式;但也有系统管理模式(大多是"仅使用固件"(;不活动";(等待启动(等
受保护模式有多个子模式(16位、32位、虚拟8086(。
长模式有多个子模式(16位、32位、64位(。
"传统模式/s";指实模式和保护模式(以及所有保护模式的子模式(,而不是长模式或其任何子模式;其中代码是16位或32位(真实模式和保护模式之间的其他差异对大多数指令来说并不重要,只对段寄存器加载和操作系统内核之类的事情重要(。遗留模式的存在是为了提供与旧软件/操作系统的向后兼容性(例如MS-DOS不支持长模式,将使用真实模式,Windows95不使用长模式,并将使用保护模式,等等(。
兼容模式/s是指长模式的16位和32位子模式。兼容性模式/s(或长模式的16位和32位子模式(的存在是为了允许较新的操作系统执行为较旧的操作系统设计的程序(例如,允许64位版本的Windows运行为32位版本的窗口设计的应用程序(。在这种情况下,代码是16位或32位(类似于传统模式(;但它不同于传统模式,因为它仍然使用长模式机制进行分页、中断等;对于兼容模式,即使当前正在执行的代码不是64位的,内核也应该是64位的。
第二个问题:CPUID.800000001H:ECX.LAHF-SAHF[bit 0]=1 是什么意思
CPUID指令返回有关CPU的信息。因为有很多信息,所以信息被分成组/"组";叶子";其中CCD_ 1中的值确定CPUID指令将返回哪些信息(并且在某些情况下。信息在通用寄存器(EAX、EBX、ECX、EDX(中返回。
"CCD_ 2";是指";当CPUID被EAX=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