因為之前搞不清楚加上#或是@的用意 還有各種定址模式的差異 所以在此記錄一下我學習後的心得 大致可以分為八種 分別是 直接定址法(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這類指令中 名為相對是因為他是相對於基準的位址 例如 : S
留言
張貼留言