【发布时间】:2014-09-12 10:01:28
【问题描述】:
我有几个非常简单的例子,除了 LABEL 概念。 示例 1 本身将 25 相加 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 的概念。在 example-1 中,当第一次程序运行时,A 的值是 25,然后当 R2 从 10 递减到 1 时,输出是 275 而不是 250。但是如果我假设 LABEL 被绕过,除非它被调用,那么一切都很好我得到结果 250。但是如果我在 Example-2 中假设相同的事情(在逐步执行中绕过 LABEL),那么 LABEL NEXT 将被绕过。并且“DJNZ R2,AGAIN”将被执行。由于 NEXT 被绕过,那么 R2 将如何获得值 #70?所以我的问题是关于 LABEL 的执行。 LABELS 是被执行还是被绕过?
【问题讨论】:
-
“标签”是一种让您不必手动计算要跳转到的地址的东西。它不是指令并且不占用空间(除非汇编器可能对齐代码以使其有效)。
-
标签不是你绕过或不绕过的东西 - 它只是以下指令所在地址的符号名称。您可以在每行前面添加一个标签而不会产生影响 - 除非您实际使用它来跳转到它或调用它。
-
对。然后在示例 1 中,当第一次程序运行时,Add 命令将 25 添加到 A,当 DJNZ 10 次在 A 中添加 25 时,它应该是 275。但在示例中答案是 250。那是怎么回事?
-
它迭代 10 次。
DJNZ第一次执行时,R2变为 9,然后是 8,然后是 7,以此类推,直到 0。所以 25 的 10 次加法为零。