發表文章

目前顯示的是有「8051組合語言」標籤的文章

8051小筆記---什麼是PSW

PSW的英文全名叫做(Program Status Word) 中文翻成"程式狀態字組" 他是一個2Bytes(8bits)大小的資料 在記憶體位置D0到D7 從英文全名我們可以推斷它紀錄著程式狀態 接下來我們詳細的講述PSW PSW內的各項旗標(Flags) 總共有七種不同的功能 (Register bank select功能的旗標有兩個) 分別如以下: Carry flag AC F0 Register bank select Overflow flag Reserved bit Parity bit 各項旗標的功能介紹 Carry flag 他的符號為 : CY 記憶體位址在 : D7H   顧名思義就是記錄著程式的進位(Carry) 當今天我們的程式8bits裝著#FDH的資料 如果我們對這個資料加上#05H 這時資料會變為#02H Carry flag被設為1   以此類推,減法也有這個機制 如果我們對#02H這個資料減#05H 資料會變為#FDH Carry flag被設為1 AC 他的符號為 : AC 記憶體位址在 : D6H 他的英文全名為Auxiliary Carry flag 顧名思義,其功能也跟進位有關 而具體來說,他在BCD( Binary-coded Decimal)的進位非常有幫助 因為他檢測的進位並不是最高位元(左邊第一個) 而是兩個Byte的中間(三和四bit) 就如以下這樣 :  #9BH + #0CH 100 1,1 011 + 000 0,1 100 = 101 0,0 111 經過上面的加法操作 唯一的進位發生在三和四bit間 所以AC被設為1、CY保持0 F0 他的符號為 :F0 記憶體位址在 : D5H 他的英文全名為Flag 0 沒什麼特別的功能 可以供程式設計師自行運用 Register bank select 他的符號為 :RS1、RS0 記憶體位址在 : D4H、D3H     這兩個bits的作用是選擇Register bank 並且可以知道總共有四種數值的組合 分別對應到四個不同的Register bank (關於Register bank我之後會再寫一篇文章)   不同Register bank的最大好處是可以減少記憶體stack堆疊的次數 像是 : ...

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這類指令中 名為相對是因為...