# Lab02 Addressing Mode ## (1) What is Addressing Mode? Link:[IS for PIC18F4520](http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/) ## (2) PIC18F4520 Adressing Mode #### <font size=4>No Operation - NOP #### Inherent Addressing (Implied Addressing) - SLEEP、RESET、DAW #### Literal Addressing (Immediate Addressing) - MOVLW、ADDLW、SUBLW、ANDLW、GOTO、CALL... #### Direct Addressing (Absolute Addressing) #### <font color=red>Indirect Addressing</font> #### Bit Addressing #### Relative addressing --- ### No Operation - NOP  Sample code: ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: nop nop nop nop nop end ``` - PC += 2 - "wasting" 1 clock cycle - delay loop ### Inherent Addressing - SLEEP、RESET、DAW - SLEEP  - RESET  - DAW  - BCD addition adjustment  ### Literal Addressing - 8-bits literal MOVLW、ADDLW、SUBLW、ANDLW - 20-bits literal *GOTO... Sample code: ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: MOVLW 0x05 end ```  ### Direct Addressing - Data Memory MAP  <font color=red>12-bits memory address, higher 4 bits for bank select. ==> 將整塊4096Bytes的記憶體區分成16個小區(bank0~bank15)</font> - Some data movement instructions on file register - *Access Bank - Access RAM ( or GPRs) (0x000 ~ 0x07F and 0xF80 ~ 0xFFF) - Bank Select (higher address) (0x000 ~ 0xFFF) <font color=red>(*) 因為 data movement 的 file register 欄位只有 8 個 bits,所以 Access Bank 方式只能存取 256 個 bytes 的記憶體空間(0x000 ~ 0x07F 和 0xF80 ~ 0xFFF)。 因此若要存取整個 4096-bytes 大小的記憶體空間,要使用 Bank Select 的方式存取。</font> - MOVWF  - MOVLB (Use MOVLB to select bank)  - MOVFF  <font color = red>MOVFF 是一個很特別的指令,他的指令格式是給你兩個 12-bits 的 file register 欄位去填,所以在整個 4096-bytes 大小的記憶體裡,想去哪就去哪,不需要在乎bank這件事,也就是這個指令可以隨意在 4096-bytes 大小的記憶體空間裡存取。</font> Sample code: Access Bank ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: MOVLW 0x99 ; WREG = 0x99 MOVWF 0x10 ; [0x010] = 0x99 end ```  Sample code: Bank Select ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: MOVLW 0x99 ; WREG = 0x99 MOVLB 0x4 ; BSR = 4 MOVWF 0x10, 1 ; use BSR select bank ; [0x410] = 0x99 end ```  Sample code: MOVFF ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: MOVLW 0x99 ; WREG = 0x99 MOVLB 0x4 ; BSR = 4 MOVWF 0x10, 1 ; use BSR select bank ; [0x410] = 0x99 MOVFF 0x410, 0x420 ; [0x420] = 0x99 end ```  ### Indirect Addressing #### Three SFRs call FSRx (x for 0~2) - FSR0、FSR1、FSR2 - 16bits (FSRxH : FSRxL) to cover all data memory address - they are pointer - LFSR ( let FSRx point to memory address k ) -  #### Some SFRs related to pointer FSRx (x for 0~2) - INDFx:指針不變,對指向的記憶體位置進行操作 - PLUSWx:指針 + WREG = 新的記憶體位置後,對指向的記憶體位置進行操作 - POSTINCx:對指向的記憶體位置進行操作後,指針 + 1 - POSTDECx:對指向的記憶體位置進行操作後,指針 - 1 - PREINCx:指針 + 1 後,對指向的記憶體位置進行操作 Sample code: ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x00 ;PC = 0x00 setup1: LFSR 0, 0x000 ; FSR0 point to 0x000 LFSR 1, 0x010 ; FSR1 point to 0x010 LFSR 2, 0x020 ; FSR2 point to 0x020 MOVLW 0x10 ; WREG = 0x10 start: INCF POSTINC0 ; [0x000] += 1; FSR0 point to 0x001 INCF PREINC1 ; FSR1 point to 0x011 ;[0x011] += 1 INCF POSTDEC2 ; [0x020] += 1 ; FSR2 point to 0x01F INCF INDF2 ; [0x01F] += 1 ; ; FSR2 point to 0x01F(unchanged) INCF PLUSW2 ; [0x01F+0x10] += 1 ; FSR2 point to 0x01F(unchanged) end ``` ### Bit Addressing - BSF、BCF、BTFSC、BTFSS - Set or clear specific bit file register Sample code: ```as= #INCLUDE <p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x10 ;PC = 0x10 start: BSF 0x000, 1 end ```  ### Relative Addressing - BC、BN、BNC、BNN、BNZ(branch if not zero) ... - for all the "Branch" instruction to addressing - relative address to PC value (branch的下一行) - offset is word address(for PIC18F4520 1 word = 2Bytes) - if branch: PC = PC + 2 + n * 2 (2's complement) if not branch: PC = PC + 2  - Example:  </font>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up