UMBC CMSC 391 -- Programming Microcontrollers  


Indirect Mode Addressing

This mode uses a register to hold the actual address that identifies either the source or the destination to be used in the data move. What we have here is a pointer. R0 and R1 (when they contain a valid internal memory address) can be used for internal memory. PC or DPTR must be used for exernal memory access. Indirect mode is indicated with the character @. When working with external memory, the MOV instruction has an "X" appended to it.
      mov   DPTR, #4000h      ; put the address 4000 into the data pointer
      movx  @DPTR, 0h         ; set address 4000h to 0.
  

When used with another register, you get indexing.

Example

2000:                   .org    0x2000
                   
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                   ;; Equates                                  ;;
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                        
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                   ;; Code                                      ;;
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                   
                   begin:
                           ;; indirect mode:
                           ;; 2 bytes/1 cycle + 1 byte/1 cycle
                           ;; =  3/2
2000: 78 D0                mov     R0, #0D0h
2002: E6                   mov     A, @R0     ; Get the PSW
                   
                           ;; register mode
                           ;; 2 bytes/ 1 cycle
2003: E5 D0                mov     A, PSW
                   
2005: 90 40 00             mov     DPTR, #4000h
2008: E5 00                mov     A, 0
200A: F0                   movx    @DPTR, A
                   
                           ;; indexing can be done in two ways
                           ;; Note that A is used as both a part of the
                           ;; source and a part of the destination and
                           ;; must be reinitialized for the next step.
200B: 90 40 00             mov     DPTR, #4000h
200E: 74 00                mov     A, #0            ;clr A would be better
2010: 93                   movc    A, @A+DPTR
                   
                           ;; or use just a simple pointer and increment
                           ;; for the next step.
2011: 90 40 00             mov     DPTR, #4000h
2014: E0                   movx    A, @DPTR
2015: A3                   inc     DPTR
2016: 22                   ret
                   
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                   ;; Data                                      ;;
                   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


©2004, Gary L. Burt