Assembly &引用;标签";汇编语言

Assembly &引用;标签";汇编语言,assembly,8051,Assembly,8051,我有两个例子,除了标签概念外,它们都很简单。 示例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

我有两个例子,除了标签概念外,它们都很简单。 示例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
我无法理解标签的概念。在示例1中,当程序第一次运行时,A得到值25,然后当R2从10递减到1时,输出是275而不是250。但若我假设标签被绕过,除非它被调用,那个么一切正常,我得到的结果是250。但是,如果我在示例2中假设相同的事情(在逐步执行中绕过标签),那么LABEL NEXT将被绕过。将再次执行“DJNZ R2”。由于NEXT被绕过,那么R2将如何获得值#70?所以我的问题是关于标签的执行。是否执行或绕过标签

当10倍于DJNZ加上25时,结果应该是275

不,250是正确答案在第10条add指令之后,寄存器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!

您可以使用一个仿真器来逐步完成指令,并观察寄存器在每一步中的变化。这对于了解特定指令的行为非常有用。

标签不会被忽略。如果你看一看循环的工作情况,你会发现第一个DJNZ递减寄存器的值,然后如果结果不是零,它就会执行标签。在第一个示例中,从上面开始:

1) A为零,则
2) R2得到10,然后
3) A得到25,然后
4) DJNZ递减R2的值,使其为9,由于结果非零,因此再次执行,并在A中加25,使其为50,依此类推

当R2的值达到1时,DJNZ将其递减,结果为零,因此它不会再次执行。因此,DJNZ被执行9次,从而使得结果25×9=225。但由于25在执行循环DJNZ之前存储在A中,因此结果是250。
希望它能对您有所帮助。

一个“标签”可以让您不必手动计算要跳转到的地址。它不是一条指令,不占用任何空间(汇编程序可能会对齐代码以使其有效的情况除外)。标签不是您要绕过或不绕过的东西-它只是以下指令所在地址的符号名。你可以在每一行前面添加一个标签而不会产生影响,除非你真的使用它来跳转到它或调用它。对。然后在示例1中,当第一次运行程序时,Add命令将A中的25相加,当DJNZ将A中的25相加10倍时,结果应该是275。但在这个例子中,答案是250。这是怎么回事?它迭代了10次。第一次执行
DJNZ
时,
R2
变为9,然后变为8,然后变为7,以此类推,直到0。因此,10个25到0的加法。请回答并修改换行符(您可以使用
标记)。