除了LABEL概念之外,我有几个非常简单的例子。 示例1本身增加了10次,而示例2增加了寄存器A的700次。
Example-1: MOV A,#0
MOV R2,#10
AGAIN: ADD A,#25
DJNZ R2,AGAIN
MOV R5,A
Example-2:
MOV A,#55H
MOV R3,#10
NEXT: MOV R2,#70
AGAIN: CPL A
DJNZ R2,AGAIN
DJNZ R3,NEXT
我无法理解LABEL的概念。在示例1中,当第一次运行程序时,A得到值25,然后当R2从10递减到1时,输出是275而不是250.但是如果我假设LABEL被绕过,除非它被调用,那么事情就可以了然后我得到结果250.但是如果我在例-2中假设相同的事情(在逐步执行中绕过LABEL),那么将绕过LABEL NEXT。并且“DJNZ R2,AGAIN”将被执行。当NEXT被绕过时,R2将如何获得#70的价值?所以我的问题是关于执行LABEL。 LABELS是执行还是被绕过?
答案 0 :(得分:0)
当10次DJNZ在A中加25时,它应该是275
不,250是正确的答案。 在第10个添加指令后,注册R2
仍然包含1
- 然后它会递减到0而然后 DJNZ指令不会再跳转到标签,但跳到下面的说明。
您可以将DJNZ
视为两条指令,类似于
DEC R2
JNZ AGAIN ; NOTE: 8051 does not have a Zero flag - would need to
; use ACC for that, so treat this as pseudo code!
您可以使用http://www.edsim51.com/之类的模拟器逐步执行说明,并观察寄存器如何针对每个步骤进行更改。这对于了解特定指令的行为非常有用。
答案 1 :(得分:0)
标签没有被旁路......如果你看一下循环的工作,那么你会看到第一个DJNZ递减寄存器的值然后如果结果为非零它执行lablel。在第一个例子中,从上面开始: 1)A得到零,然后 2)R2得到10,然后 3)A得到25,然后 4)DJNZ递减R2的值使其为9并且由于结果为非零,执行AGAIN并且在A中增加25使其为50等等......当R2的值达到1时,DJNZ递减它并且结果为零所以它不会再执行。因此,DJNZ被执行9次,因此得到结果25 * 9 = 225。但是在执行循环DJNZ之前25被存储在A中,结果是250 .. 希望它可以帮助你..