拉赫夫指令的描述如下:
此指令按上述兼容性模式和遗留模式执行。它只有在CPUID.800001H:ECX.LAHF-SAHFbit 0=1的64位模式下才有效。
第一个问题:兼容性和遗留模式是什么?它们与实模式和保护模式有何不同?
第二个问题:CPUID.80000001H:ECX.LAHF-SAHFbit 0= 1是什么意思?
发布于 2020-09-20 20:23:33
什么是兼容性和遗留模式。它们与实模式和保护模式有何不同?
80x86 CPU有多种模式。软件开发人员可能关心的是真实模式、保护模式和长模式,但也有系统管理模式(主要是“仅使用固件”)、“非活动”(等待启动)等。
保护模式有多个子模式(16位,32位,virtual8086).
长模式有多个子模式(16位,32位,64位).
“继承模式/s”指的是真实模式和保护模式(以及所有受保护模式的子模式),而不是长模式或其任何子模式;其中的代码要么是16位,要么是32位(实际模式和保护模式之间的其他区别对大多数指令都不重要,只关系到段寄存器加载和操作系统内核)。遗留模式/s的存在是为了向后兼容旧的软件/操作系统(例如,MS不支持长模式,将使用真实模式,Windows95不使用长模式和保护模式等)。
兼容模式/s是指长模式的16位和32位子模式.兼容性模式/s(或长模式的16位和32位子模式)的存在是为了允许较新的操作系统执行为旧操作系统设计的程序(例如允许64位版本的Windows运行为32位版本的Windows设计的应用程序)。在这种情况下,代码要么是16位的,要么是32位的(比如遗留模式);但是它与遗留模式不同,因为它仍然在使用长模式机制来分页、中断等等。对于兼容性模式,内核应该是64位,尽管当前执行的代码不是。
第二个问题: Second .80000001H:ECX.LAHF-SAHFbit 0=1是什么意思?
CPUID指令返回有关CPU的信息。因为有大量的信息,所以信息被分成组/“叶”,其中EAX中的值决定CPUID指令将返回哪些信息(在某些情况下,ECX还会修改返回的信息)。信息在通用寄存器(EAX、EBX、ECX、EDX)中返回。
"CPUID.80000001H:ECX.LAHF-SAHF[bit 0]“的意思是”当用EAX=0x80000001调用CPUID时,ECX的位0中的CPUID指令返回的值“( LAHF-SAHF部件就是LAHF-SAHF决定给该位指定的名称)。
换句话说,您的代码看起来可能类似于(Intel语法程序集):
mov eax,0x80000001
cpuid
test ecx,1 ;Is bit 0 (the "LAHF-SAHF" bit) set?
je .noLAHF ; no, LAHF is not supportedhttps://stackoverflow.com/questions/63982796
复制相似问题