写下列内容是什么意思?
OR AX,AX
JGE LABEL
据我所知,OR不是比较运算符。而且,像JGE / JE / JL这样的分支语句只能在我在CMP的任何比较过程之后使用它们时使用。
答案 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
具有以下效果:
因此,使用OR AX,AX
意味着如果AX为负数,那么JGE将不会分支。如果AX为零或正数,则它将分支。