【问题标题】:Why can't we decrement Data Pointer in ALP?为什么我们不能在 ALP 中减少数据指针?
【发布时间】:2018-04-19 11:32:45
【问题描述】:

因为我们可以在 ALP 中增加数据指针:

INC DPTR;  //valid

但我们不能使用:

DEC DPTR;  //invalid

相反,我们必须使用:

DEC DPL;  //decrementing the lower nibble of Data Pointer

问题:

  1. 为什么我们不能减少数据指针?
  2. 如果不允许递减数据指针,那么我们如何递减它的低半字节?

【问题讨论】:

  • 1.谁知道。这就是他们制作指令集的方式。 2. 与处理任何其他 16 位数量的方式相同。您只是没有得到有效的单一指令。
  • dec dpl 真的只是低 半字节(4 位),而不是整个低字节吗?

标签: assembly 8051


【解决方案1】:

@syeedameen 的答案中的解决方案可以改进一点。

这是一个解决方案,只有四条指令,9 字节代码,不修改 ACC 寄存器或 PSW 中的标志。它使用 DPH 和 DPL 寄存器递减 DPTR:

  INC  DPL                  ; inc / djnz as a jump-if != 0 without modifying yet
  DJNZ DPL, SkipDecDPH
  DEC  DPH                  ; decrement high half if low half will wrap
SkipDecDPH:
  DEC DPL

【讨论】:

    【解决方案2】:

    8051微控制器是这样构建的,没有提供递减16位数据指针(DTPR)的指令。

    减少数据指针的唯一方法是分别减少低字节和高字节。 IE DEC DPL 和 DEC DPH 虽然在递减过程中还涉及到一些其他指令。

    【讨论】:

      【解决方案3】:

      1。 MCS-51 ISA 中没有这样的指令用于递减数据指针或(DPTR 寄存器)

      2。递减数据指针就是分别递减低字节和高字节。 DEC DPLDEC DPH

      递减数据指针的程序

      首先递减 dpl DEC DPL 并检查进位标志(因为如果 DPL 已经包含 0x00,例如 DPTR = 0x4500)如果 C=1 递减 dph DEC DPH 并将 '0xFF 移动到 DPL 寄存器中

      看看这个子程序

      MAIN_PROGRAM:
          .......
          .......
          CALL DEC_DPTR 
          ......
      
      
      
      
      
          ;DECREMENT DATA POINTER SUBROUITNE 
              DEC_DPTR:
                  MOV A, DPL 
                  SUBB A, #01 
                  JNC SKIP_DEC_DPTR
                  MOV A, #0XFF 
                  DEC DPH 
              SKIP_DEC_DPTR:
                  MOV DPL, A 
                  RET 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-11
        • 2018-01-22
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 2014-07-25
        相关资源
        最近更新 更多