这个伪导数END函数可以执行吗?

Is this pseudo-derivative END function executable?

考虑以下使用 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是可执行指令吗?如果是,为什么?后见之明告诉我,我似乎无法找到一个非常有效的解释。


此外,JNE LAB1 命令在这种情况下如何工作?如果什么不等于LAB1?

按照指示,我假设它像 x86 指令集和 masmmasm 兼容的汇编器一样工作。请注意,它实际上不能是 x86 指令集,因为没有更多 R1R2 等不是寄存器。如果您想确切地知道它的作用,您需要告诉我们是哪个处理器。

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

END (END PROCEDURE) The END directive is put after the last statement of a program to tell the assembler that this is the end of the program module. The assembler will ignore any statements after an END directive, so you should make sure to use only one END directive at the very end of your program module. A carriage return is required after the END directive.

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

在另一个指令集中,END 可能会做其他事情(例如停止处理器)。在不知道是哪个指令集的情况下,我们无从得知。

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

在此上下文中:

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

关于 JNE,先前的 CMP R1, R2 将在内部减去 R1 - R2R2 - R1(取决于体系结构)并相应地设置内部 CPU 标志(例如、零、符号、溢出、进位)。如果减法结果不为零,JNE LAB1 将跳转到 LAB1

您不得不说 END 是可执行的(可以直接作为指令,也可以翻译为使用任何语言的宏)。这是因为 JNE 先验可能会选择不进行跳跃,因此 CPU 可能会尝试执行 END.