Memory 使用更少的字节存储数据-8051

Memory 使用更少的字节存储数据-8051,memory,optimization,storage,8051,rom,Memory,Optimization,Storage,8051,Rom,我目前正在为8051处理器编写代码,并试图找出更好的方法,在不使用太多字节rom空间的情况下,将数据存储在即时RAM中。数据大部分是随机的,但有时有些数据是空的 例如,我有一个设备连接到我的芯片上,需要处理7字节的数据。假设我想向该设备发送以下数据: 12h 34h 56h 41h 33h 77h 00h 对我来说,最快的方法是如下所示: DATABLOCK equ 30h MOV DATABLOCK,#12h MOV DATABLOCK+1,#34h MOV DATABLOCK+2

我目前正在为8051处理器编写代码,并试图找出更好的方法,在不使用太多字节rom空间的情况下,将数据存储在即时RAM中。数据大部分是随机的,但有时有些数据是空的


例如,我有一个设备连接到我的芯片上,需要处理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
有关说明,请访问以下网站:

根据我的代码,我需要21个字节来存储在rom中。一个字节用于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
现在的问题是我也没有那么多的ram,所以我不能在ram中为整个程序保留相同的值。如果可以,我将实现如下代码:

 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
ARRAY_START equ 30h
ARRAY_LEN   equ 7h

MOV   R0, ARRAY_START  ;set pointer to start array
MOV   DPTR, SrcTable   ;pointer to data in ROM
copyMore:
MOVC  A, @DPTR         ;move data to acumulator
MOV   @R0, A           ;move data to RAM destination
INC   DPTR             ;increment source pointer
INC   R0               ;increment destination pointer
CJNE  R0, ARRAY_START+ARRAY_LEN, copyMore


SrcTable: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM
现在那里的代码只需要花费我大概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命令,参数不能是硬编码值

那么,考虑到我所介绍的内容,如何使用更少的rom字节将数据存储到内存中呢

“例如,我的芯片上连接了一个设备,它需要7字节的数据来处理”为什么需要RAM中的数据?您可以直接从ROM复制数据。例如,如果您希望通过UART发送数据(如果工作,则不检查):

如果您确实希望RAM中的数据,可以使用内存复制功能,该功能如下所示:

 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
ARRAY_START equ 30h
ARRAY_LEN   equ 7h

MOV   R0, ARRAY_START  ;set pointer to start array
MOV   DPTR, SrcTable   ;pointer to data in ROM
copyMore:
MOVC  A, @DPTR         ;move data to acumulator
MOV   @R0, A           ;move data to RAM destination
INC   DPTR             ;increment source pointer
INC   R0               ;increment destination pointer
CJNE  R0, ARRAY_START+ARRAY_LEN, copyMore


SrcTable: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM