问题描述
下面的代码成功将给定的字符串移动到寄存器(在本例中为寄存器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