无符号比较。汇编代码中的SETB命令

时间:2018-11-08 14:57:19

标签: assembly x86 x86-64

我正在阅读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 = 1b = 2(a a = 0000 0001和b = 0000 0010-b = 1111 1110位中。因此,a - b = 0000 0001 + 1111 1110 = 1111 1111。如您所见,此操作未产生进位位,因此CF必须设置为零。这是一个矛盾。

考虑相反的情况:a = 2b = 1a - b = 0000 0010 + 1111 1111 = 1 0000 0001。有进位位,因此CF必须设置为1。同样,矛盾。

以上示例显示,setb应该在CF = 0时将1设置为目标,否则将0设置为

还有一个问题: 将b的最高有效位设置为1会发生什么?就像b = 128 = 1000 0000 (bit representation)时一样?

0 个答案:

没有答案