我想通过将CPU标志压入堆栈来读取它们,然后将它们弹出到这样的寄存器中:

uint32_t getEflags() {
    uint32_t eflags;
    asm ("pushf");
    asm ("pop %eax");
    asm ("mov %%eax, %0" : "=r"(eflags));
    return eflags;
}

现在,我发现这是一个错误,因为pushf仅压入EFLAGS的低16位,然后将它们弹出到32位寄存器中(我需要pushfd )。

这意味着我基本上弹出的次数比开始时要多-返回此处时堆栈会发生什么?

===============>>#1 票数:4 已采纳

指令集参考说明:

将堆栈指针减4(如果当前操作数大小属性为32),并将EFLAGS寄存器的全部内容压入堆栈

它还说:

PUSHF(推送标志)和PUSHFD(推送标志为双)助记符引用相同的操作码。 PUSHF指令适用于操作数大小属性为16的情况,PUSHFD指令适用于操作数大小属性为32的情况。某些汇编程序可能在使用PUSHF时将操作数大小强制为16,而在使用PUSHFD时强制将操作数大小强制为32。 其他人可能会将这些助记符视为同义词(PUSHF / PUSHFD),并使用操作数大小属性的当前设置来确定要从堆栈中推入的值的大小,而与所使用的助记符无关。

所以那没问题。 不过,您的asm已损坏,应该是这样的:

__asm__ __volatile__(
    "pushf\n\t"
    "pop %0"
: "=rm" (eflags));

  ask by maxdev translate from so

未解决问题?本站智能推荐:

关注微信公众号