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

时间:2018-05-06 05:30:22

标签: assembly x86 emu8086

写下列内容是什么意思?

OR AX,AX

JGE LABEL

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

2 个答案:

答案 0 :(得分:2)

or instruction是按位操作,而不是比较,所以你是第一件事。

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

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

  

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

JGE是:

  

如果大于或等于(SF = OF),则跳短。

OR之后OF将为零,并且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上,这是反性能测量,因为现代单元将解码指令对{{ 1}} cmp something以特殊方式对待它们,类似于单个操作......但这些都是与性能相关的细节,如果你只是需要知道特定目标x86 CPU的底层微架构学习8086的基础知识,无需担心这些,首先要正确理解指令的作用,这样你就可以阅读任何asm源代码,并与指导指南一起确定性地预测将会产生什么结果。这样的代码,了解CPU上的所有变化(寄存器/存储器内容)水平。一些代码是否需要再执行一个时钟在开始时不那么重要。

答案 1 :(得分:2)

许多汇编指令会影响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不为零或为零)
  4. 因此,使用OR AX,AX意味着如果AX为负数,那么JGE将不会分支。如果AX为零或正数,则它将分支。