当我们比较两个数字并且一个数字小于另一个数字时,设置了标志CF:
mov eax,1
cmp eax,2
jb truWay以二进制形式:
1=00000001
2=00000010=11111101+1(add. code)=11111110и
00000001+11111110=11111111(no carry)为什么指令cmp eax,2设置CF标志?没有携带,否则我就错了。
发布于 2017-08-11 09:14:06
确实借用了。如果有借出,CF由cmp指令设置。
您的指令cmp执行以下减法:
1 = 0001
- 2 = 0010
--------------
1111对于第一个最右边的列,没有什么特别的:1 - 0 = 1。
对于最右边的第二列,有一种借用(即:1是从下一列中的一列“借用”的)。借款是必要的,因为0 < 1。该列的结果是10 - 1 = 1。
但是,请注意,对于第一个操作数,左边没有一个可以借用1的列,因此出现了一个借出:对于最重要的位(实际上设置了CF ),出现了一次借入。
您的减法操作实际上将类似于设置CF (即:第一个操作数的MSB的“借用”或“获取”1 )并执行以下减法:
10001
- 0010
-------
1111注意,第一个操作数在其真正的MSB的左侧有一个1。这个1以前不存在,它代表了借来的东西。
发布于 2017-08-11 10:44:29
First:
a-b的结果与a+(-b)的结果相同。
但是,操作 a-b设置的标志是 not (至少不总是如此),与操作a+(-b)设置的标志相同!
这可以通过比较不同的CPU类型(例如,现代x86 CPU和历史上的6502 CPU)来看出:
操作a+b后的标志值在x86和6502上是相同的,而“进位标志”在操作a-b之后在两个CPU上具有完全相反的含义。
这意味着在两个CPU上的操作a+(-b)之后,“a-b标志”具有相同的值,而在两个CPU上,a-b后的值总是不同的。
第二版:
在x86上,“进位标志”被定义为“借出去”以作减法。你可以通过
示例:
1 = 00000001 (8 bit) = 0 00000001 (9 bit)
2 = 00000010 (8 bit) = 0 00000010 (9 bit)
3 = 00000011 (8 bit) = 0 00000011 (9 bit)
=> -2 = 1 11111110 (9 bit!)
Do the addition:
3 + (-2) = 1000000001 (9 bit plus carry)
1 + (-2) = 111111111 (9 bit)
Ignore carry:
3 + (-2) = 000000001 (9 bit)
1 + (-2) = 111111111 (9 bit)
Use the highest bit as carry:
3 + (-2) = 000000001 = 0 00000001 = (no carry) 00000001
1 + (-2) = 111111111 = 1 11111111 = (carry) 11111111https://stackoverflow.com/questions/45631132
复制相似问题