代码之家  ›  专栏  ›  技术社区  ›  Alex Velickiy

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

  •  0
  • Alex Velickiy  · 技术社区  · 6 年前

    我在读布莱恩特和奥哈拉隆的《计算机系统程序员的观点》。

    在关于比较的一节中,它指出 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) ?

    0 回复  |  直到 6 年前