【问题标题】:How a processor can calculate if A < B如果 A < B,处理器如何计算
【发布时间】:2010-10-10 14:10:36
【问题描述】:

这可能是我想到的一个愚蠢的问题,但我想我没有答案 -

如果 A B 或 A==B。

但是如果我们解决 A

我知道不同的处理器可能有不同的实现,但我想对此有一些高层次的想法。

我相信位运算符的一些技巧应该可以做到。

任何帮助将不胜感激。

【问题讨论】:

  • 我是这个网站的新手。你能告诉我如何接受答案吗?

标签: comparison operators bit-manipulation


【解决方案1】:

在 x86 汇编中,CMP 指令常用于比较两个整数。

例如,如果您在 EAX 和 EBX 中分别有整数,并执行 CMP EAX,EBX,则符号 (S) 标志和零 (Z) 标志的值将告诉您哪个数字最大:

EAX > EBX:  Z=0, S=0
EAX == EBX: Z=1, S=0
EAX < EBX:  Z=0, S=1

使用SUB指令也可以得到同样的结果,该指令还将数字之间的差值存储在目的寄存器中。

【讨论】:

  • 补充:cmp 指令并不孤单,如果 flags 具有某些指定值,则需要使用 j* label 命令将控制转移到目标。例如,ja (jump-if-above) 在cmp eax,ebx 之后如果eax 的无符号值大于ebx 的无符号值则跳转,jg (jump-if-greater) 如果有符号值则跳转eax 大于 ebx 的有符号值,je (jump-if-equal) 和 jz (jump-if-zero) 如果它们相等则跳转(这两个命令具有相同的操作码)。还有 'jae' (jump-if-above-or-equal), 'jna' (jump-if-not-above) 等等...
  • 对!我也应该说一些关于跳跃的事情。 +1 指出来!
【解决方案2】:

A 中减去B 并查看是否设置了N(负)标志或结果的MSb。

【讨论】:

  • 你有我的问题。如果 A 是负数,B 是正数呢?
  • 忽略环绕,负数减去正数仍然是负数。但是无论如何,寄存器通常都是无符号的;如果需要签名操作,那么编译器/libc 将不得不做额外的工作以确保正确的结果。
【解决方案3】:

所有 CPU 都有 ALU。我不会发布 Wikipedia 链接,因为您可以自己找到;)但我可以教您一些有关 CPU 内部的知识。

你基本上需要知道的是所有CPU都有比较指令,即BEQ“Branch-on-Equal”,它用于实现“if”指令,如果A == B则跳转(还有一条A指令

硬件比较数字很容易,几乎所有的大学生都曾经设计过一个比较(从4到8位,但同样的逻辑适用于32和64),你可以在任何地方找到原理图

【讨论】:

  • 我认为我在提出问题时犯了一个错误。我的意思是CMP,GTE,LT等指令的实现逻辑是什么。
  • 同理。操作数被触发到 ALU 并将返回值设置为状态位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多