В настоящее время я работаю над кодом для процессора 8051 и пытаюсь найти лучшие способы хранения данных в непосредственной оперативной памяти, не используя так много байтов дискового пространства. Данные в основном случайные, но иногда некоторые данные нулевые.
Например, у меня есть устройство, подключенное к моему чипу, которое ожидает 7 байт данных для обработки. Допустим, я хочу отправить на это устройство следующие данные:
12h 34h 56h 41h 33h 77h 00h
Быстрый способ сделать это для меня выглядит примерно так:
DATABLOCK equ 30h
MOV DATABLOCK,#12h
MOV DATABLOCK+1,#34h
MOV DATABLOCK+2,#56h
MOV DATABLOCK+3,#41h
MOV DATABLOCK+4,#33h
MOV DATABLOCK+5,#77h
MOV DATABLOCK+6,#00h
Я обращаюсь к следующему веб-сайту за инструкциями: http://www.keil.com/support/man/docs/is51/is51_mov.htm
и, судя по моему коду, мне понадобился 21 байт, чтобы сохранить это в ПЗУ. Один байт для MOV, один байт для адресата (DATABLOCK+x) и один байт для значения (xxh). умножьте сумму на 7 = 21.
Проблема в том, что я часто использую эту команду, потому что она быстрая, но у меня мало свободного места на чипе.
Я думал о следующем, но это не очень помогает. Черт возьми, я думаю, что это требует ДОПОЛНИТЕЛЬНЫХ двух байтов:
DATABLOCK equ 30h
MOV R0,#DATABLOCK
MOV @R0,#12h
INC R0
MOV @R0,#34h
INC R0
MOV @R0,#56h
INC R0
MOV @R0,#41h
INC R0
MOV @R0,#33h
INC R0
MOV @R0,#77h
INC R0
MOV @R0,#00h
И тогда я подумал об этом, что может сойти с ума, что, я думаю, занимает еще БОЛЬШЕ байтов:
DATABLOCK equ 30h
mov R1,SP
MOV SP,#DATABLOCK-1
MOV A,#12h
PUSH ACC
MOV A,#34h
PUSH ACC
MOV A,#56h
PUSH ACC
MOV A,#41h
PUSH ACC
MOV A,#33h
PUSH ACC
MOV A,#77h
PUSH ACC
MOV A,#00h ;could use CLR A but what if value isn't 0h?
PUSH ACC
MOV SP,R1
Теперь проблема в том, что у меня не так много оперативной памяти, поэтому я не могу позволить себе сохранять одинаковые значения в оперативной памяти для всей программы. Если бы я мог, я бы реализовал такой код:
FIND12H equ 70h
FIND34H equ 60h
FIND56H equ 50h
FIND41H equ 55h
FIND33H equ 66h
FIND77H equ 22h
FIND00H equ 2Ah
DATABLOCK equ 30h
mov R1,SP
MOV SP,#DATABLOCK-1
PUSH FIND12H
PUSH FIND34H
PUSH FIND56H
PUSH FIND41H
PUSH FIND33H
PUSH FIND77H
PUSH FIND00H
MOV SP,R1
Теперь этот код будет стоить мне всего 12 байт. Это экономия около 9 байт (например, более 1/3), но проблема в том, что я использую абсолютные значения, а не ячейки памяти. Например, если бы с 8051 работало следующее, то на мой вопрос был бы дан ответ:
mov A,SP
MOV SP,#DATABLOCK-1
PUSH #12h
PUSH #34h
PUSH #56h
PUSH #41h
PUSH #33h
PUSH #77h
PUSH #0h
MOV SP,A
Но для команды push параметр не может быть жестко запрограммированным значением.
Итак, учитывая все, что я представил, как я могу использовать меньше байтов ПЗУ для хранения данных во внутренней памяти?