8051小筆記---基本的八種定址模式
因為之前搞不清楚加上#或是@的用意
還有各種定址模式的差異
所以在此記錄一下我學習後的心得
大致可以分為八種
分別是
直接定址法(Direct addressing)
間接定址法(Indirect addressing)
暫存器定址法(Register addressing)
立即值定址法(Immediate constant)
索引定址法(Indexed addressing)
絕對定址法(Absolute addressing)
長定址法(Long addressing)
相對定址法(Relative addressing)
下面讓我詳細說明
直接定址法(Direct addressing)
顧名思義就是直接給記憶體的位址
例如 : MOV A , 06H
就是把在記憶體位置06H的資料
移動到A
間接定址法(Indirect addressing)
他和直接定址法的概念差不多
最大的差別是以暫存器內的數值做為目標地址
所以可以說直接定址法是固定的
而間接定址法可以用運算改變目標地址
例如 : MOV A , @R0
這裡就是以R0內的數值最為目標位址
假如R0內儲存的數值是55H
那就是把在記憶體位置55H的資料
移動到A
暫存器定址法(Register addressing)
這應該是最好理解的
直接將要使用的暫存器寫出來
和Python或是C++一樣
A = B + C
這樣簡單
例如 : MOV A , R0
就是把R0內的資料
移動到A
立即值定址法(Immediate constant)
當我們想要初始化即可使用這種方式
類似於Python或是 C++的
A = 12
例如 : MOV A , #55H
在A存入數值55H
索引定址法(Indexed addressing)
了解這個之前須要先知道8051的記憶體架構
索引定址法用在程式記憶體(ROM)中
與間接定址法最大的不同在於
他需要base register當作基準(PC 或是 DPTR等等)
並以A暫存器作為地址上下的調整運算元
例如 : MOVC A , @A+PC
這樣的例子就是要讀取程式記憶體
以A當作接收和調整地址位置
PC則是基準的位置
相對定址法(Relative addressing)
使用在JUMP這類指令中
名為相對是因為他是相對於基準的位址
例如 : SJMP 5
他是把現在的PC(Program Counter)位址當作基準
加上後面的運算元5
得出下一個PC位址
PC = PC+5
絕對定址法(Absolute addressing)
他與立即值定址法概念是一樣的
但是在實作上
絕對值定址法比較像是相對定址法
也就是作用在程式記憶體的立即值定址法
例如 : ACALL 7FFH、AJMP 789H
長定址法(Long addressing)
這個則是加長版的絕對定址法
例如 :LJMP 89ABH、LCALL 0CDEFH
這樣各位都有懂了吧!!!!!!!
留言
張貼留言