使用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
?
答案 0 :(得分:1)
按照说明,我假设它的工作方式类似于x86指令集和masm
或masm
兼容的汇编程序。注意它实际上不能是x86指令集,因为没有更多R1
,R2
等不是寄存器。如果你想确切知道它的作用,你需要告诉我们哪个处理器。
通常(即在masm
等中)END是汇编程序指令而不是指令:
END (END PROCEDURE)
END
指令放在程序的最后一个语句之后,告诉汇编程序这是程序模块的结尾。汇编程序将忽略END指令后的任何语句,因此您应确保在程序模块的最后只使用一个END指令。END
指令后需要回车。
您的END
指令不是该程序的最后一个语句,(假设masm
和x86
)不正确。
在另一个指令集中,END
可能会执行其他操作(例如暂停处理器)。在不知道哪个指令集的情况下,我们无法知道。
JNE
指令测试Z
标志并跳转(到LAB1),如果它是明确的。 Z
标志由先前的CMP
指令设置(或清除)(如果操作数相等则设置,否则清除)。因此,如果操作数不相等,它就会跳转。
答案 1 :(得分:1)
在此背景下:
...
CMP R1, R2;
JNE LAB1;
END;
...
关于JNE
,先前的CMP R1, R2
会在内部减去R1 - R2
或R2 - R1
(取决于架构)并相应地设置内部CPU标记(例如,零,符号,溢出,携带)。如果减法结果不为零,JNE LAB1
会跳转到LAB1
。
您必须说END
是可执行的(直接作为指令,或者翻译为使用任何语言的宏)。这是因为JNE
先前可能选择不跳转,因此CPU可能会尝试执行END
。