Assembly 这个伪导数结束函数是可执行的吗?

Assembly 这个伪导数结束函数是可执行的吗?,assembly,architecture,Assembly,Architecture,考虑以下使用x86汇编程序的汇编代码 END是可执行指令吗?若有,原因为何?事后诸葛亮告诉我这是事实,但我似乎无法找到一个合理的解释 另外,JNE LAB1命令在这种上下文中是如何工作的?如果什么不等于所指示的LAB1?,我假设它的工作原理类似于x86指令集和masm或masm兼容的汇编程序。注意,如果没有更多的R1,R2等,它实际上不可能是x86指令集。如果你想知道它到底是做什么的,你需要告诉我们是哪个处理器 通常(即在masmetc中)END是汇编指令,而不是指令: END(结束过程)

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



END
是可执行指令吗?若有,原因为何?事后诸葛亮告诉我这是事实,但我似乎无法找到一个合理的解释



另外,
JNE LAB1
命令在这种上下文中是如何工作的?如果什么不等于所指示的
LAB1

,我假设它的工作原理类似于x86指令集和
masm
masm
兼容的汇编程序。注意,如果没有更多的
R1
R2
等,它实际上不可能是x86指令集。如果你想知道它到底是做什么的,你需要告诉我们是哪个处理器

通常(即在
masm
etc中)END是汇编指令,而不是指令:

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

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

在另一个指令集中,
END
可能执行其他操作(例如停止处理器)。如果不知道是哪个指令集,我们就无法知道

JNE
指令测试
Z
标志,如果清除,则跳转(到LAB1)。
Z
标志由上一条
CMP
指令设置(或清除)(在操作数相等时设置,否则清除)。因此,如果操作数不相等,它将跳转。

在此上下文中:

  ...
  CMP  R1, R2;
  JNE  LAB1;
  END;
  ...
关于
JNE
,先前的
CMP R1、R2
将在内部减去
R1-R2
R2-R1
(取决于架构),并相应地设置内部CPU标志(例如,零、符号、溢出、进位)<如果减法的结果不是零,code>JNE LAB1将跳转到
LAB1


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

请确认这是否是80x86汇编程序。请添加架构标记并指定汇编程序。一般情况下,条件跳转参考标志,因此在这种情况下,
JNE
适用于先前的
cmpr1、R2
LAB1
是跳转的目标
END
可能是
RET
@abligh的别名-除上述信息外,未提供其他信息,请在中继续80x86mind@lurker-这意味着这道试题有点不正确或没有正确地呈现?@Juxhin我想重点是这是一道试题。此语法与任何现有程序集都不匹配,因此整个程序将永远不会执行。询问END是否是现有指令是毫无意义的,这里没有什么是真实的。END可能只是告诉程序在这里终止。
cmpr1,R2
在x86中不是有效的指令,因为
R1
R2
都不是x86寄存器,除非它们是
texteq
(例如
R1 texteq ax
)。此外,在OP示例的上下文中,
END
未放在程序的最后一条语句之后,因此这不能正确使用
END
。JNE LAB1的注释是“如果不等于LAB1,则跳转”,这是否正确?我发现它有点令人困惑。@Juxhin是的-它跳到LAB1Thanks alot@abligh-现在确实更有意义了:-)@潜伏者是的,我只是假设它像x86一样工作,这是OP所要求的。在不知道哪个程序集的情况下,很难准确地说出汇编器将做什么-我相信我们可以发明一个
JNE
几乎相等的程序集。谢谢你的回答@Louger-确实澄清了这个问题:-)@Louger可能是个打字错误<如果减法的结果不是零,code>JNE LAB1将跳转到LAB1。@user3144770 oops,是的,谢谢!我修改了我的解释文本。
  ...
  CMP  R1, R2;
  JNE  LAB1;
  END;
  ...