该汇编指令的含义是什么?

What is The Meaning of This Assembly instruction?

下面几行是什么意思?

OR AX,AX

JGE LABEL

据我所知,OR 不是比较运算符。而且,只有当我在 CMP 的任何比较过程之后使用它们时,才能使用 "JGE/JE/JL" 等分支语句。

根据值设置FLAGS是cmp ax, 0的替代方法,
但也做同样事情的首选方式是 test ax,ax.


or instruction是按位运算,不是比较,所以你第一点就对了

但是关于分支你是完全错误的,conditional jump Jcc 不关心在它之前执行了什么指令,它只会检查标志寄存器 EFLAG 的某些条件。 (基本上 CPU 中没有指令关心之前的指令,它是状态机,每条指令都明确定义了它将如何修改 CPU 当前 的状态,以及 CPU 的状态CPU 寄存器的内容(但是都是段寄存器,(E)FLAG也是寄存器,控制寄存器很少,在现代x86上CPU 还有 FPU 和 MMX/SSE 单元寄存器)。

并且 or 也会修改标志寄存器,就像许多其他指令一样:

The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to the result. The state of the AF flag is undefined.

JGE 是:

Jump short if greater or equal (SF=OF).

OF在OR后为零,SF等于ax的最高位(对于值0x0000 .. 0x7FFF为0,对于值0x8000 .. 0xFFFF 它将是 1)。因此,当 ax 是范围 0 .. 0x7FFF (32767).

中的值时,将执行分支跳转

这是测试寄存器是否为零的常见但不理想的习惯用法,更好的方法是test ax,ax,这也是按位运算(and),但结果被丢弃,只有标志被修改后,现代 x86 CPU 理解这个习语并且它具有与 cmp ax,0 相同或更好的性能。 OR 可能会在内部将运算结果存储回 ax,这可能导致性能不如 test

您可以随时使用条件跳转,它会检查 FLAGS 寄存器中的值,因此奔腾时代的一项旧优化是提前执行 CMP 几条指令以提供 CPU 是时候将更改写入 FLAGS 并在一些不影响标志的指令(如 MOV 和类似指令)之间执行,但在现代 x86 上,这是反性能措施,因为现代单位会解码指令对 cmp something jge label 以特殊方式对待它们,有点像单一操作......但这些都是与性能相关的细节,需要了解特定目标 x86 的底层微架构CPU,如果你只是学习8086的基础知识,还不用担心这些,先把重点放在正确理解指令的作用上,这样你就可以阅读任何asm源码,结合指令指南你可以确定性地预测此类代码的结果,了解 CPU 中发生的所有变化(registers/memory conte新台币)水平。一些代码是否需要多花一个时钟来执行在一开始并不重要。

许多汇编指令会影响 CPU 标志,而这些标志决定是否会发生分支。 OR 影响符号、溢出和零标志(SF、OF、ZF)。

如果SF = OF 或ZF = 1,JGE 将跳转。

OR AX,AX具有以下作用:

  1. OF = 0
  2. SF = 0 或 1(如果 AX 为正或负)
  3. ZF = 0 或 1(如果 AX 为非零或零)

所以,使用OR AX,AX意味着如果AX为负则JGE不会分支。如果 AX 为零或正则它将分支。