gpt4 book ai didi

assembly - 如何直接读写x86标志寄存器?

转载 作者:行者123 更新时间:2023-12-02 15:29:55 25 4
gpt4 key购买 nike

据我所知,似乎有 9 个不同的标志。是否可以直接读取/更改它们?我知道我可以知道,例如,在执行 cmp/jmp 指令后是否设置了零标志,但我问是否可以执行类似的操作

mov eax, flags

或者其他什么。

另外,为了书写,可以手动设置它们吗?

最佳答案

一些标志可以通过特定指令直接设置或清除:

  • CLC , STC ,和CMC :清除、设置和补充进位标志
  • CLISTI :清除并设置中断标志(应该以原子方式完成)
  • CLDSTD :清除并设置方向标志

要读写符号、零、辅助进位、奇偶校验和进位标志,可以使用 LAHF将低 8 位(这 5 个标志加上 3 个不确定位)加载到 AH 寄存器中,您可以使用 SAHF将 AH 中的这些值存储回标志寄存器中。

您还可以使用PUSHF指令将标志压入堆栈,在堆栈上读取和修改它们,然后使用 POPF 1 指令将它们存储回标志寄存器。

请注意,您无法使用 POPF 设置 VM 和 RF 标志 - 它们保留以前的值。同样,只有在特权级别0执行时才能更改I/O特权级别,并且只有在至少与I/O特权级别相同的特权级别执行时才能更改中断标志。

<小时/>

脚注1:

请注意,popf 在现代 CPU 上相当慢;请参阅Agner Fog's优化指南和说明表。它是微编码的,因为在内核模式下它能够更改 IF 和 AC 以及 IO 特权级别。无论当前 CPU 上的模式如何,我们都会遭受损失,因为解码器对模式不敏感。

如果可能,请使用lahf/sahf而不是pushf/popf来提高性能,或者保存一个您关心的标志,例如setc al,然后添加al, 255到设置CF = (AL!=0)。或者 setnc al/sub al, 1 或其他。基于 0 或 1 寄存器设置或清除 SF 或 OF 的序列也很简单,无论是否反转标志。

关于assembly - 如何直接读写x86标志寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1406783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com