我目前正在为8051处理器编写代码,我正在尝试找出更好的方法来在immediate RAM中存储数据,而不使用太多的rom空间。数据大部分是随机的,但有时有些数据是空的。
例如,我有一个设备连接到我的芯片上,它需要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字节将数据存储到内存中?
发布于 2018-05-02 15:59:06
例如,我有一个设备连接到我的芯片,它需要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 ROMhttps://stackoverflow.com/questions/49869444
复制相似问题