【问题标题】:"Label" in Assembly language汇编语言中的“标签”
【发布时间】: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 次加法为零。

标签: assembly 8051


【解决方案1】:

当 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/ 之类的模拟器来逐步执行说明,并观察寄存器在每一步中的变化情况。这对于了解特定指令的行为方式非常有用。

【讨论】:

    【解决方案2】:

    标签未被绕过。如果你看一下循环的工作,你会看到第一个 DJNZ 递减寄存器的值,然后如果结果不为零,它会执行标签。在第一个例子中,从上面开始:

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

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

    【讨论】:

    • edit你的答案并修正换行符(你可以使用
      标签)。
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 2016-06-01
    • 2010-12-24
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多