作者ruemann (此人挂网中……)
看板ASM
标题[闲聊] KeilC与8051 - 记忆体与资料
时间Sat Feb 10 00:04:27 2007
众所周知的,8051具有两百多个指令,其中有很大一部份是作为资料转移之用:
mov A, Rn
mov A, direct
mov A, @Ri
mov A, #data
mov Rn, A
mov Rn, direct
mov Rn, #data
mov direct, A
mov direct, Rn
mov direct, @Ri
mov direct, #data
mov @Ri, A
mov @Ri, direct
mov @Ri, #data
mov DPTR, #data16
movc A, @A+DPTR
movc A, @A+PC
movx A, @Ri
movx @Ri, A
movx A, @DPTR
movx @DPTR, A
push direct
pop direct
xch A, Rn
xch A, direct
xch A, @Ri
xchd A, @Ri
这些指令当中,绝大部份是用来做为记忆体转移之用的(mov, movx, xch, xchd),
而其他指令可以作为读取程式码段使用(movc)以及存取程式码之用(push, pop)
8051在一开始设计之初,其指令集概念为「正交」,亦即希望所有的事情都有其对
映的单一指令,所以我们会看到有四个指令用来将资料存入A,由於8位元最多可以
定址256bytes,所以8051将低128bytes作为一般记忆体,由於SFR占据了0x80~0xFF
的位址,所以0x80~0xFF的记忆体则必需使用间接记忆体存取。
而16位元的资料则利用DPTR这两个八位元的暂存器来存取。
由於DPTR是16位元,所以8051最大可以支援64K的外部记忆体(0x0000~0xFFFF)及ROM。
251则利用一个8位元作为分页,所以最大可以支援256*64K=16M的外部ROM。
因此若我们想要去存取记忆体,可以利用mov的指令,而若想读取程式的资料,则必
需透过movc这个指令。同样的,要读取外部记忆体就使用movx。
翻开keilC的help档 (C51.pdf,位於安装目录下)
第三章的部份说明了关於资料型态的问题:
code Program memory (64 KBytes); accessed by opcode MOVC @A+DPTR.
data Directly addressable internal data memory; fastest access to
variables (128 bytes).
idata Indirectly addressable internal data memory; accessed across the full
internal address space (256 bytes).
bdata Bit-addressable internal data memory; supports mixed bit and byte
access (16 bytes).
xdata External data memory (64 KBytes); accessed by opcode MOVX @DPTR.
far Extended RAM and ROM memory spaces (up to 16MB); accessed by user
defined routines or specific chip extensions (Philips 80C51MX,
Dallas 390).
pdata Paged (256 bytes) external data memory; accessed by opcode MOVX @Rn.
因此若我们想要利用指标去读取ROM的值,就必需将指标宣告成code的型态:
unsigned char code *pt_rom;
unsigned char tmp;
pt_rom = 0x0000;
pt_rom += 0x7788;
tmp = *pt_rom;
如此tmp的内容就是位址0x7788的资料了。
--
我只是个想赚 P 币的迷途小羔羊
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.59.230.137
1F:→ sintsu:真是高手+赚p币高手 02/10 01:17
※ 编辑: ruemann 来自: 61.59.230.137 (02/10 01:28)
2F:推 loveflames:只有R1跟R0才可以 02/10 01:43
3F:→ loveflames:我是指mov里的间接定址 02/10 12:07
4F:推 ruemann:没错,Ri是指R0~R1,Rn是指R0~R7…现在很多RISC的MCU都 02/10 12:59
5F:→ ruemann:没那麽复杂的指令集了…… 02/10 13:00
6F:推 entaroadun:非常感谢 <(_ _)> 02/11 23:29