首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用更少的字节来存储数据- 8051

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

Stack Overflow用户
提问于 2018-04-17 11:32:14
回答 1查看 137关注 0票数 0

我目前正在为8051处理器编写代码,我正在尝试找出更好的方法来在immediate RAM中存储数据,而不使用太多的rom空间。数据大部分是随机的,但有时有些数据是空的。

例如,我有一个设备连接到我的芯片上,它需要7字节的数据进行处理。假设我想要向该设备发送以下数据:

代码语言:javascript
复制
 12h 34h 56h 41h 33h 77h 00h

我这样做的快捷方法类似于:

代码语言:javascript
复制
 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。

问题是,我经常使用这种命令,因为它很快,但我在芯片上的可用空间有限。

我想到了以下几点,但它并没有真正起到什么作用。见鬼,我认为它需要额外的两个字节:

代码语言:javascript
复制
 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

然后我想到了这个,这可能会变得很疯狂,我认为它需要更多的字节:

代码语言:javascript
复制
 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中相同的值。如果可以,我会像这样实现代码:

代码语言:javascript
复制
 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,那么我的问题就会得到回答:

代码语言:javascript
复制
 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字节将数据存储到内存中?

EN

回答 1

Stack Overflow用户

发布于 2018-05-02 15:59:06

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

代码语言:javascript
复制
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中的数据,你可以使用内存复制功能,它看起来像这样:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49869444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档