如果你深入组装(从嵌入式系统的角度,或者如果您尝试对引导程序进行编程,这将更容易理解)
您将意识到while循环只是一个jmp指令...即
(pseudo code: starting loop address)
add ax, bx
add ax, cx
cmp ax, dx
jz (pseudo code: another address location)
jmp (pseudo code: starting loop address)
让我们解释一下它是如何工作的,无论如何,处理器将继续按顺序执行指令。 因此,当它进入此循环的那一刻,它将在寄存器中添加寄存器bx并存储在ax中,在寄存器中添加寄存器cx并存储到ax,cmp,ax,dx中(这意味着从ax中减去dx),jz指令意味着跳转到(另一个地址 位置)如果设置了零标志(如果上述减法的结果为零,则标志寄存器中的一个位将被设置),然后jmp到起始循环地址(非常简单)并重做整个过程。
我打扰您所有这些程序集的原因是向您展示这将在C中转换为
int A,B,C,D;
// initialize to what ever;
while(true)
{
A = A + B;
A = A + C;
if((A-D)==0)
{break;}
}
// if((X-Y)==0){break;} is the
// cmp ax, dx
// jz (pseudo code: another address location)
因此,请想象一下汇编中的senario,如果您有很长的指令列表,而这些指令没有以jmp(while循环)结尾,可以重复某些部分或加载新程序或执行某些操作...最终,处理器将到达最后一条指令,然后加载以下指令以查找所有内容(然后将冻结或三重故障或其他原因)。
这就是为什么当您希望程序在触发事件之前不执行任何操作时,必须使用while(1)循环,这样处理器才能继续跳转至原来的位置,而不会到达该空指令地址。 当事件被触发时,它跳到事件处理程序的指令地址,执行它,清除中断,然后返回到while(1)循环,仅跳到其位置等待进一步的中断。 顺便说一句,如果您想了解更多有关while(1)的信息,那么……这是一个超级循环……对于在这一点上发狂地为之争辩并发表负面评论的人,这不是汇编教程,讲座或任何内容。 这只是简单的英文解释,它尽可能地简单,它忽略了很多底层细节,例如指针和堆栈以及诸如此类的东西,并且在某些情况下还简化了事情以求得通。 没有人在这里寻找文档准确性,我知道这段C代码不会像这样编译,但这仅适用于演示!