Цель здесь состоит в том, чтобы сложить два 32-битных числа, хранящихся в записи с прямым порядком байтов. Числа хранятся в следующих ячейках памяти:
- первый номер: 0x3000-0x3003
- количество секунд: 0x4000-0x4003
- результат должен войти в: 0x5000-0x5003
Ниже приведена моя реализация, которая не очень эффективна с точки зрения принципа DRY:
ARG1 EQU 3000H
ARG2 EQU 4000H
RESULT EQU 5000H
ORG 0000H
MOV DPTR, #ARG1 + 0
MOV A, #12H
MOVX @DPTR, A
MOV DPTR, #ARG1 + 1
MOV A, #34H
MOVX @DPTR, A
MOV DPTR, #ARG1 + 2
MOV A, #00H
MOVX @DPTR, A
MOV DPTR, #ARG1 + 3
MOV A, #00H
MOVX @DPTR, A
MOV DPTR, #ARG2 + 0
MOV A, #00H
MOVX @DPTR, A
MOV DPTR, #ARG2 + 1
MOV A, #00H
MOVX @DPTR, A
MOV DPTR, #ARG2 + 2
MOV A, #56H
MOVX @DPTR, A
MOV DPTR, #ARG2 + 3
MOV A, #78H
MOVX @DPTR, A
MOV DPTR, #ARG1 + 0
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #ARG2 + 0
MOVX A, @DPTR
ADDC A, R0
MOV DPTR, #RESULT + 0
MOVX @DPTR, A
MOV DPTR, #ARG1 + 1
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #ARG2 + 1
MOVX A, @DPTR
ADDC A, R0
MOV DPTR, #RESULT + 1
MOVX @DPTR, A
MOV DPTR, #ARG1 + 2
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #ARG2 + 2
MOVX A, @DPTR
ADDC A, R0
MOV DPTR, #RESULT + 2
MOVX @DPTR, A
MOV DPTR, #ARG1 + 3
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #ARG2 + 3
MOVX A, @DPTR
ADDC A, R0
MOV DPTR, #RESULT + 3
MOVX @DPTR, A
JNC EXIT
INC A
MOVX @DPTR, A
EXIT:
NOP
SJMP $
END
Вопрос: мне интересно, есть ли способ реализовать это с помощью цикла и уменьшить количество повторяющихся инструкций?
Например, в этом примере используются банки регистров при использовании 8-битных адресов памяти в режиме прямой адресации:
ORG 0H
MOV 30H, #12H
MOV 31H, #34H
MOV 32H, #00H
MOV 33H, #00H
MOV 40H, #00H
MOV 41H, #00H
MOV 42H, #56H
MOV 43H, #78H
MOV R0, #30H ;pointer of bank 0
MOV R1, #50H ;result storage bank 0
MOV R2, #4 ;counter
SETB RS0
MOV R1, #40H ;pointer bank 1
CLR RS0
CLR C
LOOP:
MOV A, @R0
SETB RS0
ADDC A, @R1
INC R1
CLR RS0
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
JNC EXIT
INC @R1
EXIT:
NOP
SJMP $
END
(Я использую µVision IDE)
DPTR
: вDPH
иDPL
есть обе половинки. - person the busybee   schedule 29.12.20200x3000
, в 8-битных регистрах (R0, R1…) - person HTF   schedule 29.12.2020DPTR
— 16-битный регистр. - person the busybee   schedule 29.12.2020