assembly - lahf 什么时候可以在 x86-64 模式下使用?
问题描述
lahf指令的描述是:
该指令在兼容模式和传统模式下如上所述执行。仅当 CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1 时才在 64 位模式下有效
第一个问题:什么是兼容性和遗留模式。它们与实模式和保护模式有何不同
第二个问题: CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1是什么意思
谢谢!!!
解决方案
什么是兼容性和传统模式。它们与实模式和保护模式有何不同
一个 80x86 CPU 有多种模式。软件开发人员可能关心的是实模式、保护模式和长模式;但也有系统管理模式(主要是“仅固件使用”)、“非活动”(等待启动)等。
保护模式有多个子模式(16 位、32 位、virtual8086)。
长模式有多个子模式(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]
”表示“ECX 的位 0 中的 CPUID 指令返回的值,当 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
推荐阅读
- scala - 如何在 IntelliJ 中更改捆绑 sbt 的 coursier 缓存目录
- javascript - 在高图地图中为动态变量格式化工具提示,一些用逗号,另一些用百分比
- reactjs - 如何在 React 中组织/管理上下文状态和辅助函数(主要是 API 调用)
- python - 如何在 DJANGO 中按最大数量的相同记录排序
- nuxt.js - 注销后 Nuxt 身份验证未重定向
- reactjs - React jwt登录刷新问题
- google-apps-script - Getting a “Google hasn’t verified this app” warning when creating a trigger - ok to ignore it?
- python - ELMo嵌入中的“Highway.forward:输入必须存在”?
- python - Python 和 Kivy 如何将值从一个类传递到另一个类?
- python-3.x - 我在 repl.it 上打印东西时遇到问题