这个伪导数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 指令集和 masm
或 masm
兼容的汇编器一样工作。请注意,它实际上不能是 x86 指令集,因为没有更多 R1
、R2
等不是寄存器。如果您想确切地知道它的作用,您需要告诉我们是哪个处理器。
通常(即在 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
指令不是程序的最后一条语句,它(假设 masm
和 x86
)是不正确的。
在另一个指令集中,END
可能会做其他事情(例如停止处理器)。在不知道是哪个指令集的情况下,我们无从得知。
JNE
指令测试Z
标志,如果清除则跳转(到LAB1)。 Z
标志由前面的 CMP
指令设置(或清除)(如果操作数相等则设置,否则清除)。因此,如果操作数不相等,它就会跳转。
在此上下文中:
...
CMP R1, R2;
JNE LAB1;
END;
...
关于 JNE
,先前的 CMP R1, R2
将在内部减去 R1 - R2
或 R2 - R1
(取决于体系结构)并相应地设置内部 CPU 标志(例如、零、符号、溢出、进位)。如果减法结果不为零,JNE LAB1
将跳转到 LAB1
。
您不得不说 END
是可执行的(可以直接作为指令,也可以翻译为使用任何语言的宏)。这是因为 JNE
先验可能会选择不进行跳跃,因此 CPU 可能会尝试执行 END
.
考虑以下使用 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 指令集和 masm
或 masm
兼容的汇编器一样工作。请注意,它实际上不能是 x86 指令集,因为没有更多 R1
、R2
等不是寄存器。如果您想确切地知道它的作用,您需要告诉我们是哪个处理器。
通常(即在 masm
等中)END 是汇编程序指令而不是指令:
END (END PROCEDURE)
TheEND
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 theEND
directive.
您的 END
指令不是程序的最后一条语句,它(假设 masm
和 x86
)是不正确的。
在另一个指令集中,END
可能会做其他事情(例如停止处理器)。在不知道是哪个指令集的情况下,我们无从得知。
JNE
指令测试Z
标志,如果清除则跳转(到LAB1)。 Z
标志由前面的 CMP
指令设置(或清除)(如果操作数相等则设置,否则清除)。因此,如果操作数不相等,它就会跳转。
在此上下文中:
...
CMP R1, R2;
JNE LAB1;
END;
...
关于 JNE
,先前的 CMP R1, R2
将在内部减去 R1 - R2
或 R2 - R1
(取决于体系结构)并相应地设置内部 CPU 标志(例如、零、符号、溢出、进位)。如果减法结果不为零,JNE LAB1
将跳转到 LAB1
。
您不得不说 END
是可执行的(可以直接作为指令,也可以翻译为使用任何语言的宏)。这是因为 JNE
先验可能会选择不进行跳跃,因此 CPU 可能会尝试执行 END
.