我正试图提出一种更有效的方法,以从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
但是那浪费了很多代码字节,只是为了从不同的存储库中取出一个字节。是否有一种无需太多存储空间即可执行此类处理的方法?