了解汇编中的条件代码标志设置

Posted

技术标签:

【中文标题】了解汇编中的条件代码标志设置【英文标题】:Understanding condition code flag setting in assembly 【发布时间】:2013-11-04 21:47:34 【问题描述】:

如果我有下表:

Case 1:    x: 42           y: -15           (y-x) = -57 
Case 2:    x: -17          y: -17           (y-x) = 0
Case 3:    x: 0x7ffffffd   y: -67           (y-x) = 2147483584
Case 4:    x: 67           y: -0x7fffffffd  (y-x) = 2147483584

ZF SF OFCF 的条件代码标志设置(每个标志为零或一)

考虑指令时:cmp1 %eax %ecx 如果%eax 包含x 并且%ecx 包含y

我了解cmp1 ...,... 的执行者为:cmp1 SRC2,SRC1

这意味着:“设置SRC1 - SRC2的条件代码”

我明白这些标志代表:

OF = overflow (?)
ZF = zero flag i.e. zero...
CF = carry out from msb
SF - sign flag i.e. negative

对于我在表格中的四个案例,我相信标志是:

1) ZF = 0 SF = 1 CF = 0 OF = ?
2) ZF = 1 SF = 0 CF = 0 OF = ?
3) ZF = 0 SF = 0 CF = 1 OF = ?
4) ZF = 0 SF = 0 CF = 1 OF = ?

我说的对吗?请解释CFOF 是什么,以及如何确定是否将它们设置为TRUE,并纠正我的任何有缺陷的理解。谢谢。

【问题讨论】:

CF and OF` 的使用取决于您将值解释为有符号还是无符号。另请参阅 - ***.com/questions/19340167/… 【参考方案1】:

当算术运算产生无法放入寄存器的进位时,会发生进位溢出。因此,如果您有 8 位寄存器,并且想要添加 10000000 和 10000000(无符号):

 10000000
 10000000
 --------
100000000

这个 1 是最高有效位的进位,因此设置 CF = 1。

您可能还想查看this other answer。

【讨论】:

天哪,谢谢。这就说得通了。 %eax 和 %ecx 是 8 位寄存器吗? 不,那些是 32 位。我刚刚发布了 8 位,以便于阅读。 32 位寄存器是 DWORD(双字)吗?一个字是 16 位的,对吗?您能解释一下什么时候设置 CF 吗? DWORD 在英特尔环境中通常是 32 位,是的。我已经解释了何时在答案中设置 CF :) 对不起,我是想问什么时候设置OF 标志!谢谢。

以上是关于了解汇编中的条件代码标志设置的主要内容,如果未能解决你的问题,请参考以下文章

汇编--控制转移指令 jmp

汇编语言中test的用法

从 C# 代码生成汇编代码?

x86 汇编器:浮点比较

如何运行单行汇编,然后看 [R1] 和条件标志

从汇编到C