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