assembly - PUSHQ POPFQ 是在 x86_64 上设置标志的最直接方式吗?

标签 assembly

是:

PUSHQ %reg
POPFQ

在 x86_64 上设置标志的最直接方法?

最佳答案

这一切都取决于旗帜。

一些标志允许您直接设置位。例如,STC设置进位标志,CLC清除进位标志。如果你想操纵,比如说,陷阱标志,你必须做这样的事情(假设 NASM 和 16 位汇编):

pushf
pop   ax
or    ax, 0x100
push  ax
popf

当然,您也可以间接设置或清除标志。例如:

xor   ax, ax

此代码最直接地通过 XOR 将 ax 设置为零。间接地,它具有同时设置 ZF(零标志)和 PF(奇偶校验标志)的副作用。大多数标志位通常可以使用类似类型的间接操作标志的方法。

顺便说一下,您在问题中使用的机制可能会产生意想不到的后果。压入标志,修改您感兴趣的特定标志,然后弹出标志是更好的做法。任意将特定值弹出到标志中可能会造成严重破坏,除非您绝对确定更改它们不会产生任何后果(即,没有代码进一步依赖于上面的标志)。

关于assembly - PUSHQ POPFQ 是在 x86_64 上设置标志的最直接方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912688/

相关文章:

c++ - GCC 发出用于 boost::shared_ptr 取消引用的额外代码

assembly - 在 Grub2 中引导自定义内核

c - #define 在 GCC 中的内联汇编

linux - 程序集 x86-64 从堆栈中获取函数参数

c++ - C/C++ 在幕后按值返回结构

assembly - 将字数组复制到双字数组 NASM 程序集

c - gnu 链接器链接的文件的入口点地址是什么?

c - 在平面二进制文件中包含 char 数组的内容

linux - 如何在 Linux 的 nasm x86 程序集中复制数组,移植 16 位 DOS 代码?

string - dw 和 dd 与字符串的 db 指令有何不同?