8051 执行时间有点混乱

8051 Execution Time Little Confusion

如果使用 DJNZ 助记符,则只会执行随附的标签,或者会执行从该特定标签到 DJNZ 助记符的所有标签,我能否从您那里得到帮助?

DELAY:  MOV R5,#100
BACK:   MOV R2,#200
AGAIN:  MOV R3,#250
HERE:   NOP
NOP
NOP
DJNZ R3,HERE
DJNZ R2,AGAIN
DJNZ R5,BACK

那么当DJNZ R2 被执行时,它会只执行AGAIN Label 语句(MOV R3,#250) 还是每次执行AGAIN 标签时它也会执行HERE 标签?就像在其他编程语言中一样,我们总是有 return 或 break 语句,而在这个程序中没有类似的东西,所以我认为 HERE 应该总是在 AGAIN 的每个循环中执行,但对此并不完全确定。

DJNZ 递减指定寄存器,如果寄存器不为零则跳转到指定地址。在您的示例中,地址由标签指定。

跳转到一个地址意味着程序计数器(PC)被设置为resp。地址。然后从该地址继续执行。先执行第一个地址的代码,递增PC,执行新地址的代码,递增……直到到达下一个分支(跳转指令)。然后PC设置为跳转地址等等。

知道了这些,你就明白DJNZ不执行标签或标签旁边的命令了。它将程序计数器设置为一个新值。处理器或控制器从该地址继续执行。所以如果你跳转到 AGAIN,很明显你也执行了 HERE 和它下面的 NOP。