x86 - 获取方向标志的当前状态(DF)

时间:2017-03-05 16:43:30

标签: c windows debugging assembly x86

我正试图从EFLAGS寄存器中获取DF的值。 我尝试使用LAHF指令,但根据Intel X86文档,该指令仅加载SF, ZF, AF, PF, CF标志。但是,我正在尝试找一条能给我DF寄存器值的指令。

提前致谢。

3 个答案:

答案 0 :(得分:8)

使用以下代码:

pushf                ;Maybe you'll need pushfd
pop  eax
bt   eax, 10

如果设置了CF,则设置DF!

如果您不想破坏任何注册,您可以使用下一种方法(受@fuz启发):

pushf
test byte [esp+1],4
lea  esp, [esp+4]      ;The LEA instruction doesn't change any flags

此时如果设置了ZF,则表示DF已被清除!

答案 1 :(得分:5)

这也可以使用内部函数__readeflags来完成 - 所以不需要内联汇编(仅适用于x86) - 接下来只需要代码就可以在x86和x64平台上运行:

if (__readeflags() & (1 << 10))
{
    // D flags is set
}

但是在Windows上这个标志几乎总是清除

答案 2 :(得分:1)

如果您知道table = """CREATE TABLE IF NOT EXISTS {0} ( node_id bigint , screen_name text, last_tweets set<text>, follower_ids set<bigint>, friend_ids set<bigint>, centrality float, PRIMARY KEY (node_id)) """.format(table_name) 指向有效内存区域并且您不介意修改它(和es:edi),并且您想要+ 1 / -1结果而不是0/1:

eax

嗯,有这么多的if /和/ when约束,它可能没什么用处(唯一的好处:不需要/修改堆栈)。但我确实想尝试阅读一个字符串指令的结果是多么麻烦,因为我在阅读mov eax,edi scasb sub edi,eax ; edi = +1/-1 for DF=0/1 答案时得到了这个想法。

编辑:堆栈内存变体,通常对读取访问有效(特别是如果其他答案中的pushf变体有效)(NASM语法)。

pushf