我在读布莱恩特和奥哈拉隆的《计算机系统程序员的观点》。
在关于比较的一节中,它指出
SETB Dest
命令将destination设置为1如果是previous
cmpq A, B
无符号值之间的命令结果小于0。
它还声明,换句话说,它将目标值设置为CF(进位标志)位的值。
但我有一个疑问,一个反例和一个问题。
考虑以下C函数:
char cmp_u(unsigned char a, unsigned char b) {
return (a < b);
}
它是由
gcc
程序集代码如下所示:
cmpb %sil, %dil
setb %al
ret
所以它被评估
a - b
首先是
cmpb
命令并根据结果设置标志。然后(根据帐簿)将返回值设置为1 if
CF
设置为,否则为0。
现在想想
a = 1
和
b = 2
(a和lt;b)。以位为单位
a = 0000 0001
和
b = 0000 0010
和
-b = 1111 1110
. 因此
a - b = 0000 0001 + 1111 1110 = 1111 1111
. 如您所见,此操作没有产生执行位,因此必须将CF设置为零。这是一个矛盾。
考虑一个相反的情况:
a = 2
和
b = 1
.
a - b = 0000 0010 + 1111 1111 = 1 0000 0001
. 存在执行位,因此必须将CF设置为1。再次,矛盾。
上面的例子表明
setb
当CF=0时,应将1设置为destination,否则为0。
还有一个问题:
当最重要的一点
b
设置为1?就像什么时候
b = 128 = 1000 0000 (bit representation)
?