直接存儲器訪問把存儲器地址編碼在要讀寫存儲器的指令中。使用直接存儲器存取我們可以訪問存儲器類型中DATA和BIT中的變量。對于251來說,還有EDATA存儲器類型可以使用直接尋址訪問。
間接存儲器訪問使用要讀寫存儲器的指令中的一個寄存器中的內容。使用間接尋址操作數(shù),可以訪問x51中所有類型的存儲空間。
下面的例子示出了怎樣訪問一個x51系統(tǒng)的不同存儲器類型。
DATA
DATA中的存儲器地址可以使用兩種尋址方式:直接和間接存儲器訪問。x51的特殊功能寄存器(SFR)具有在DATA空間中0x80之上的地址。SFR只可采用直接存儲器尋址。在x51微處理器中不支持對SRF的間接尋址。
適用于所有8051版本的例子
| ?DT?myvar | SEGMENT | DATA | ; 定義一個DATA類型的段 |
| RSEG | ?DT?myvar | ||
| VALUE: | DS | 1 | ; 在DATA空間保留一個字節(jié)(BYTE) |
| IO_PORT2 | DATA | 0A0H | ; 特殊功能寄存器 |
| VALUE2 | DATA | 20H | ; 絕對存儲器地址 |
| 羅畝的筆記 | |||
| ?PR?myprog | SEGMENT | CODE | ; 為程序代碼定義一個段 |
| RSEG | ?PR?myprog | ||
| MOV | A, IO_PORT2 | ; 對DATA直接尋址 | |
| ADD | A, VALUE | ||
| MOV | VALUE2, A | ||
| MOV | R1, #VALUE | ; 將VALUE的地址裝入R1 | |
| ADD | A, @R1 | ; 對VALUE間接尋址 |
羅畝按:這些例程的格式,很值得我們學習,其程序的可讀性、條理性非常好!?DT?”代表DATA類型的段,“?PR?”代表程序代碼段。
BIT
BIT類型的存儲器地址使用8051的位尋址指令尋址。位于可位尋址存儲器地址的特殊功能寄存器(SFR)也可以使用位指令尋址。位可尋址的SFR地址是:80H,88H,90H,98H,0A0H,0A8H,0B0H,0B8H,0C0H,0C8H,0D0H,0D8H,0E0H,0E8H,0F0H和0F8H。
適用于所有8051版本的例子
| ?BI?mybits | SEGMENT | BIT | ; 定義一個BIT類型的段 |
| RSEG | ?BI?mybits | ||
| FLAG: | DBIT | 1 | ; 在BIT空間保留一位 |
| P1 | DATA | 90H | ; 8051 SFR端口1 |
| GREEN_LED | BIT | P1.2 | ; 在I/O端口1.2上的綠色LED |
| ?PR?myprog | SEGMENT | CODE | ; 為程序代碼定義一個段 |
| RSEG | ?PR?myprog | ||
| SETB | GREEN_LED | ; P1.2 = 1 | |
| JB | FLAG, is_on | ; 對DATA直接尋址 | |
| SETB | FLAG | ||
| CLR | ACC.5 | ; 復位寄存器A中的位5 | |
| …… | |||
| is_on: | CLR | FLAG | |
| CLR | GREEN_LED | ; P1.2 = 0 |
EBIT(僅適用于英特爾/愛特梅爾WM251)
251提供了EBIT存儲類型,作為擴展的位可尋址空間,尋址時使用擴展的位指令。251中所有的特殊功能寄存器(SFR)都可以使用擴展的位指令尋址。
英特爾/愛特梅爾WM251的例子





