这条汇编指令的含义是什么?

Ray*_*hed 1 x86 assembly emu8086

写下下面几行是什么意思?

OR AX,AX

JGE LABEL
Run Code Online (Sandbox Code Playgroud)

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

Ped*_*d7g 5

cmp ax, 0这是根据值设置 FLAGS的替代方法,
但也可以执行相同操作的首选方法是test ax,ax.


or指令是按位运算,而不是比较,所以你第一件事是对的。

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

or与许多其他指令一样,它也会修改标志寄存器:

OF和CF标志位被清零;根据结果​​设置 SF、ZF 和 PF 标志。AF 标志的状态未定义。

JGE

如果大于或等于 (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寄存器中的值,因此类似 Pentium 时代的一项旧优化是提前执行CMP几条指令,以便 CPU 有时间写入更改FLAGS并在不影响标志的指令之间执行(类似MOV),但在现代 x86 上,这是反性能措施,因为现代单元在解码指令对时将以cmp something jge label特殊方式对待它们,有点像单个操作......但这些都是与性能相关的细节,需要了解特定目标x86 CPU的底层微架构,如果您只是学习8086的基础知识,则无需担心这些,首先要正确理解指令的作用,这样您就可以阅读任何asm源代码,并一起阅读通过指令指南,您可以确定性地预测此类代码的结果,了解 CPU 高层(寄存器/内存内容)中发生的所有变化。某些代码是否需要多一个时钟来执行在一开始并不那么重要。