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



我目前正在研究 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

我参考以下网站以获取说明: http://www.keil.com/support/man/docs/is51/is51_mov.htm

根据我的代码,我需要 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

现在那里的代码只会花费我 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发送数据(如果有效则不选中):

sendData:
MOV   DPTR, constData   ;pointer to data in ROM
MOV   R0, #7            ;number of data to send
sendMore: 
MOVC  A, @DPTR          ;move data to accumulator
MOV   SBUF, A           ;send data via UART
JNB   TI, $             ;wait for TI flag
CLR   TI                ;clear TI flag
INC   DPTR              ;increment pointer
DJNZ  R0, sendMore      ;decrement couter and jump if not zero
constData: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM

如果你真的想要RAM中的数据,你可以使用内存复制功能,看起来像这样:

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

最新更新