通过循环8051程序集将字符串移动到寄存器中

问题描述

下面的代码成功将给定的字符串移动到寄存器(在本例中为寄存器1)中;使用r2作为计数器。但是,r2必须使用字符串的长度进行硬编码,以使循环正确完成。是否可以在不对计数器进行硬编码的情况下实现类似的解决方案?

ORG     100H
            MOV     R2,#13D
                MOV R1,#0
                MOV     DPTR,#DAT0
    AGAIN:      MOV     A,R1
            MOVC    A,@ A+DPTR
            MOV P1,A
            INC     R1
            DJNZ    R2,AGAIN
            SJMP    $
DAT0:       DB  "(C) XYZ Inc.",0
    END

解决方法

如果您不想将终止的零字节发送到 P1,则使用 JZ 指令跳出循环,如果累加器 A 包含零:

  ORG     100h
  MOV     R2,#0       ; Offset in string
  MOV     DPTR,#DAT0  ; Start of string
More:
  MOV     A,R2
  MOVC    A,@A+DPTR   ; Get character of the string
  JZ      Done         ; JUMPS IF A==0
  MOV     P1,A        ; Send A to P1 (excluding 0)
  INC     R2
  SJMP    More
Done:
  SJMP    $
DAT0:     DB  "(C) XYZ Inc.",0
  END

如果您确实想将终止的零字节发送到 P1,那么只有在发送的最后一个字节不为零时才循环返回。如果累加器 JNZ 不包含零,则使用跳转的 A 指令:

  ORG     100h
  MOV     R2,@A+DPTR   ; Get character of the string
  MOV     P1,A        ; Send A to P1 (including 0)
  INC     R2
  JNZ     More         ; DOESN'T JUMP IF A==0
  SJMP    $
DAT0:     DB  "(C) XYZ Inc.",0
  END