#assembly #8051
#сборка #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
Комментарии:
1. Конечно, это возможно. Просто проверьте, загрузили ли вы ноль.
2. Hrm, вы не «перемещаете строку в регистр R1». Регистр R1 используется в качестве смещения в строку, которая копируется посимвольно в порт P1. — В любом случае, вы можете посмотреть R2 и DPTR в качестве параметров, и поэтому @Jester прав: это возможно.
Ответ №1:
Если вы не хотите отправлять завершающий нулевой байт в 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, #0 ; Offset in string
MOV DPTR, #DAT0 ; Start of string
More:
MOV A, R2
MOVC A, @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