在不浪费代码空间的情况下读取内存中的特定字节-8051

时间:2018-11-15 04:57:00

标签: memory storage microcontroller ram 8051

我正试图提出一种更有效的方法,以从AT89S52微控制器的扩展存储器中读取一系列字节。

我已经组织了内存存储,例如内存位置取决于“ bank”和“ Unit”。我将用定义来说明:

Storage1 equ 0C000h ;bank 1 for unit 1 = C0:00h to C0:FFh
                    ;bank 1 for unit 2 = C1:00h to C1:FFh
                    ;bank 1 for unit 3 = C2:00h to C2:FFh
                    ...
                    ;bank 1 for unit 16 = CF:00h to CF:FFh

Storage2 equ 09000h ;bank 2 for unit 1 = 90:00h to 90:FFh
                    ;bank 2 for unit 2 = 91:00h to 91:FFh
                    ;bank 2 for unit 3 = 92:00h to 92:FFh
                    ...
                    ;bank 2 for unit 16 = 9F:00h to 9F:FFh

在这里,每个存储区的每个单元都有256个字节。目前,我可以使用以下代码访问每个单元:

StorageN equ 0C000h
UnitNo equ 2h

mov DPTR,#StorageN
mov A,#UnitNo
orl DPH,A
movx A,@DPTR

使用Keil的在线文档评估此代码后,此代码需要8个字节的存储空间。

为了便于阅读,我还定义了每个存储库中每个单元的特殊字节在何处具有特殊含义:

Storage1Status equ 0C0FEh ;255th byte of all units in bank1=status
Storage2Status equ 0C0FBh ;252nd byte of all units in bank2=status

如果要从存储体1获取存储单元2的状态并将结果放入存储单元5的存储体2中,我将使用以下代码:

mov DPTR,#Storage1Status
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR
mov R7,A ;save status

mov DPTR,#Storage2Status
mov A,#5h ;unit 5
orl DPH,A
mov A,R7
movx @DPTR,A

每次将一个值从一个位置更新到另一个位置时,大约需要18个字节的代码空间。

在我的应用程序中,很多时候单位号保持不变,但是银行经常变化。所以我会用这样的代码来访问银行:

mov DPTR,#Storage2
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

mov DPTR,#Storage1
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

mov DPTR,#StorageN
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

...

mov DPTR,#StorageX
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

但是那浪费了很多代码字节,只是为了从不同的存储库中取出一个字节。是否有一种无需太多存储空间即可执行此类处理的方法?

0 个答案:

没有答案