3.
5 Register Indirect Addressing
Modes in PIC18
Outline
Immediate addressing mode
Direct addressing mode
Register Indirect addressing mode
Immediate Addressing Mode
The operand is a literal constant
The instruction has a L (literal)
Can be used in loading information and
performing arithmetic and logic
operations ONLY in the WREG register
Examples:
movlw 0x25; load 0x25 into WREG
sublw D62; subtract WREG from 62
addlw 0x40; add WREG with 0x40
3
Register Direct Addressing Mode
The operand data is in a file register in
data memory.
The address of the file register is
provided as a part of the instruction.
Example:
movwf 0x40, A; copy WREG into file reg
location 0x040
Destination Option in Direct Addressing Mode
Provides an option to store the result
either in WREG or in file register.
Example:
movlw
;[WREG] = 0
movwf
0x20, A
;[0x20] = 0, [WREG] = 0
incf
0x20, W, A
;[0x20] = 0, [WREG] = 1
incf
0x20, W, A
;[0x20] = 0, [WREG] = 1
incf
0x20, F, A
;[0x20] = 1, [WREG] = 1
incf
0x20, F, A
;[0x20] = 2, [WREG] = 1
Register Indirect Addressing Mode
Suppose you want to copy value 0x55 to
location 0x040 to 0x044.
A fixed address must be specified in direct
addressing mode as an operand.
Thus, using direct addressing mode, one
instruction copies to one register:
movlw
movwf
movwf
movwf
movwf
movwf
0x55
0x40,
0x41,
0x42,
0x43,
0x44,
A
A
A
A
A
6
Register Indirect Addressing Mode
Three registers known as file select
registers (FSRx, where x = 0, 1, 2) store
addresses of the data memory location (i.e.,
pointers).
A FSR is a 12-bit register which is split into
two 8-bit registers, known as FSRxL and
FSRxH.
To load a RAM address into a FSR, use
LFSR:
LFSR 0, 0x030
LFSR 1, 0x040
LFSR 2, 0x06F
;load FSR0 with 0x30
;load FSR1 with 0x40
;load FSR2 with 0x6F
7
Register Indirect Addressing Mode
FSRx is associated with a INDFx register
(where x = 0, 1, 2).
When reading from (writing to) the INDFx
register, we are reading from (writing to)
the file register pointed to by the FSR
Example:
LFSR 0, 0x030
;FSR0 points to RAM address 0x30
movwf INDF0
;copy the content of WREG into
RAM address 0x30
8
Examples
e.g., Write a program to copy the value 0x55 to location
0x40
0x44
Directto
Addressing
Mode
Indirect Addressing Mode
movlw
movwf
movwf
movwf
movwf
movwf
0x55
0x40,
0x41,
0x42,
0x43,
0x44,
A
A
A
A
A
COUNT equ 0x00
movlw 0x05
movwf COUNT, A
movlw 0x55
LFSR 0, 0x040
Loop: movwf INDF0
incf FSR0L, F
decfsz COUNT, F, A
bra Loop
9
Register Indirect Addressing Mode
Indirect addressing mode allows
looping
However, we incremented only FSRxL
To deal with FSRxH, we need to use
branching instructions conditioned on
the Carry Bit.
Solution: Auto-increment option
10
Auto-increment option for FSR
POSTDECx
movwf POSTDEC0 does what movwf INDF0 did, but
in addition, FSR0 will be decremented by 1 after the
execution
POSTINCx
movwf POSTINC0 increments FSR0 by 1 after the
move operation.
PREINCx
movwf PREINC0 increments FSR0 by 1 before the
move operation.
PLUSWx
movwf PLUSW0 adds an offset to FSR0 that equals
to the content of WREG before the move operation.
However, the content of FSR0 will not be modified
11
after operation (different from previous three SFRs)
Previous example revisited
e.g., Write a program to copy the value 0x55 to
location 0x40
to equ
0x440x00
COUNT
movlw 0x05
movwf COUNT, A
movlw 0x55
LFSR 0, 0x040
Loop: movwf POSTINC0
decfsz COUNT, F
bra Loop
12
Demonstration
13
Introduce movff before next example...
14
Example
Copy a block of 5 bytes of data from
RAM locations starting from 0x030 to
RAM locations starting from 0x060
Loop:
COUNT equ 0x00
movlw 0x05
movwf COUNT, A
LSFR 0, 0x030
LSFR 1, 0X060
movff POSTINC0, POSTINC1
decfsz COUNT, F, A
bra Loop
15
Example
Add the in data memory locations 0x040-043
together and place the result in locations 0x006
and 0x007
COUNT equ 0x00
L_BYTE equ 0x06
H_BYTE equ 0x07
LFSR 0, 0X040
movlw 0x04
movwf COUNT, A
clrf H_BYTE, A
clrf L_BYTE, A
Loop:
movf POSTINC0, W, A;
addwf L_BYTE, F, A;
bnc Next
incf H_BYTE, F, A;
Next:
decfsz COUNT, F, A
bra Loop
16