Перемещение строк в регистр с помощью сборки цикла 8051

#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