我正在阅读Bryant&O'Hallaron撰写的“计算机系统程序员的观点”。
在有关比较的部分中,它指出如果无符号值之间的先前SETB Dest
命令结果小于0,则cmpq A, B
命令将目标设置为1。
它还指出,换句话说,它将目标值设置为CF(传送标志)位的值。
但是我有一个疑问,一个反例和一个问题。
考虑以下C函数:
char cmp_u(unsigned char a, unsigned char b) {
return (a < b);
}
它由gcc
汇编代码生成,如下所示:
cmpb %sil, %dil
setb %al
ret
因此,它将首先使用a - b
命令评估cmpb
并根据结果设置标志。然后(根据书籍)如果设置了CF
,则将返回值设置为1,否则设置为0。
现在考虑a = 1
和b = 2
(a 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设置为目标,否则将0设置为
还有一个问题:
将b
的最高有效位设置为1会发生什么?就像b = 128 = 1000 0000 (bit representation)
时一样?