该汇编指令的含义是什么?
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
具有以下作用:
- OF = 0
- SF = 0 或 1(如果 AX 为正或负)
- ZF = 0 或 1(如果 AX 为非零或零)
所以,使用OR AX,AX
意味着如果AX为负则JGE不会分支。如果 AX 为零或正则它将分支。
下面几行是什么意思?
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
具有以下作用:
- OF = 0
- SF = 0 或 1(如果 AX 为正或负)
- ZF = 0 或 1(如果 AX 为非零或零)
所以,使用OR AX,AX
意味着如果AX为负则JGE不会分支。如果 AX 为零或正则它将分支。