了解汇编中的条件代码标志设置
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
OF
和 CF
的条件代码标志设置(每个标志为零或一)
考虑指令时: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 = ?
我说的对吗?请解释CF
和OF
是什么,以及如何确定是否将它们设置为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
标志!谢谢。以上是关于了解汇编中的条件代码标志设置的主要内容,如果未能解决你的问题,请参考以下文章