FLAGS寄存器在asm中多久更新一次?

问题描述 投票:0回答:1

[在VS2013中调试x86汇编代码时,我需要检查FLAGS寄存器的内容。但是,当我在“注册”窗口中启用“标志”时,我得到:

OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 1 PE = 0 CY = 1

就我而言,我想检查PL标志值的状态。

所以多久更新一次?每个动作?每个ALU操作?

编辑:我的教科书x86的kip irvine汇编语言说

“ Sign标志是目标操作数高位的副本,指示它为负数如果设置,则为正,如果清除。 (假设零为正。)“

那么一条具有目标操作数的指令?我不确定会导致模糊。

assembly x86 masm cpu-registers eflags
1个回答
0
投票

对于每条指令,都记录了是否(以及如何)写入EFLAGS。英特尔指令集参考手册的每条指令的条目中都有“受影响的标志”部分。对于某些人来说,只是没有。

http://ref.x86asm.net/coder32.html有一个方便的指令表,其中包括一列,其中显示了它们读取和修改的标志,以及哪些修改的标志是定义明确的与未定义的。 (单击列标题以获取描述)。

大多数整数ALU指令,例如subadd,“根据结果”更新FLAGS;这是适用于设置SF =高位等常见描述的地方。 cmptest only之类的指令会产生FLAGS结果,而不修改任何整数输入。

leanot是未设置标志的值得注意的ALU异常。数据移动指令未设置标志,例如movpush / push。例如受影响的标志:无。

pop / inc设置标志,CF除外,它们保持不变。 (dec

[SSE和fp指令,例如Most CPUs can still handle this efficiently,通常不写标志。您可以使用addsd xmm, xmm/mem(SSE2)或comisd xmm, xmm/mem(x87 + Pentium Pro)将FP与现代x86上的EFLAGS进行比较。

英特尔第2卷手册中的一些示例:

以“有趣的”方式写入标志的指令通常也在其“操作”部分的伪代码中对此进行定义。例如fcomi st?

[bsf受影响的标志

根据结果设置OF,SF,ZF,AF,CF和PF标志。

((如果您查看的是Intel第2卷或第1卷的PDF,我认为他们确切地定义了“根据结果”的含义。)

bsf:受影响的标志:

对于指令的一种操作数形式,当有效位被携带到结果的上半部分时,将设置CF和OF标志,当结果恰好位于结果的下半部分时,将清除CF和OF标志。对于指令的二和三操作数形式,当必须将结果截断以适合目标操作数大小时设置CF和OF标志,而当结果恰好适合目标操作数大小时清除CF和OF标志。 SF,ZF,AF和PF标志未定义。

[add:受影响的标志:

CF标志包含从目标操作数移出的最后一位的值;对于SHL和SHR指令,计数大于或等于目标操作数的大小(以位为单位),则未定义。 OF标志仅在移位1位时受影响(请参见上面的“描述”)。否则,它是不确定的。根据结果​​设置SF,ZF和PF标志。 如果计数为0,则标志不受影响。对于非零计数,AF标志未定义。

为count = 0保留标记不变的是另一个疯狂的CISC坑,用于高性能实现。 (微体系结构为正确实现x86语义而必须支付的“ x86税”的一部分)。在Intel Sandybridge系列上,这意味着将可变计数移位(计数在add中)解码为3 oups。 SHLX(BMI2无标志移位)仅为1 uop。


回答“频率”问题的另一种方法:每个时钟周期最多4次。或5在禅宗或冰湖上。 (每条指令最多一次。)

现代Intel CPU是4宽超标量。他们可以在相同的时钟周期内将EFLAGS重命名4次,从而使他们每个时钟周期可以运行4条独立的imul指令,每条指令将其标志结果写入逻辑EFLAGS寄存器,但实际上是一个不同的物理寄存器。 (并且确实将EFLAGS输出搭载在保存整数结果的物理寄存器上,除了imul这样的指令没有整数结果。)

请参见sar / shl / shr

© www.soinside.com 2019 - 2024. All rights reserved.