这个伪衍生的END函数是可执行的吗?

时间:2015-05-20 12:24:17

标签: assembly architecture

使用x86汇编程序考虑以下汇编代码。

      MOV  R1, 40;
      MOV  R2, 1A;
LAB 1 CALL SUB1;
      SHL  R2;
      DEC  R3;
      CMP  R1, R2;
      JNE  LAB1;
      END;

SUB1  PUSH R1;
      MOV  R3, 4F;
LAB2  DEC  R3;
      CMP  R1, R3;
      JLE  LAB2;

      POP  R1;
      RET;

END是可执行指令吗?如果是,为什么? Hindsight告诉我,然而我似乎无法找到相当有效的解释。

此外,JNE LAB1命令在此上下文中如何工作?如果 不等于LAB1

2 个答案:

答案 0 :(得分:1)

按照说明,我假设它的工作方式类似于x86指令集和masmmasm兼容的汇编程序。注意它实际上不能是x86指令集,因为没有更多R1R2等不是寄存器。如果你想确切知道它的作用,你需要告诉我们哪个处理器。

通常(即在masm等中)END是汇编程序指令而不是指令:

  

END (END PROCEDURE)   END指令放在程序的最后一个语句之后,告诉汇编程序这是程序模块的结尾。汇编程序将忽略END指令后的任何语句,因此您应确保在程序模块的最后只使用一个END指令。 END指令后需要回车。

您的END指令不是该程序的最后一个语句,(假设masmx86)不正确。

在另一个指令集中,END可能会执行其他操作(例如暂停处理器)。在不知道哪个指令集的情况下,我们无法知道。

JNE指令测试Z标志并跳转(到LAB1),如果它是明确的。 Z标志由先前的CMP指令设置(或清除)(如果操作数相等则设置,否则清除)。因此,如果操作数不相等,它就会跳转。

答案 1 :(得分:1)

在此背景下:

  ...
  CMP  R1, R2;
  JNE  LAB1;
  END;
  ...

关于JNE,先前的CMP R1, R2会在内部减去R1 - R2R2 - R1(取决于架构)并相应地设置内部CPU标记(例如,零,符号,溢出,携带)。如果减法结果不为零,JNE LAB1会跳转到LAB1

您必须说END是可执行的(直接作为指令,或者翻译为使用任何语言的宏)。这是因为JNE先前可能选择不跳转,因此CPU可能会尝试执行END