Saturday 26 January 2013

ADDRESSING MODES

Addressing Modes:


The CPU can access data in various ways, which are called addressing modes

  • Immediate
  • Register
  • Direct
  • Register indirect
  • Indexed

IMMEDIATE ADDRESSING MODE

The source operand is a constant
  • The immediate data must be preceded by the pound sign, “#”
  • Can load information into any registers, including 16-bit DPTR register
    • DPTR can also be accessed as two 8-bit registers, the high byte DPH and low byte DPL
Examples:
MOV A,#25H                      ;load 25H into A
MOV R4,#62                       ;load 62 into R4
MOV B,#40H                      ;load 40H into B
MOV DPTR,#4521H         ;DPTR=4512H
MOV DPL,#21H                                 ;This is the same
MOV DPH,#45H                ;as above
;illegal!! Value > 65535 (FFFFH)
MOV DPTR,#68975

We can use EQU directive to access immediate data

Count EQU 30
... ...
MOV R4,#COUNT            ;R4=1EH
MOV DPTR,#MYDATA    ;DPTR=200H
ORG 200H
MYDATA: DB “Student”

We can also use immediate addressing mode to send data to ports
MOV P1,#55H


REGISTER ADDRESSING MODE

  • Use registers to hold the data to be manipulated
MOV A,R0           ;copy contents of R0 into A
MOV R2,A           ;copy contents of A into R2
ADD A,R5             ;add contents of R5 to A
ADD A,R7             ;add contents of R7 to A
MOV R6,A           ;save accumulator in R6

  • The source and destination registers must match in size
    • MOV DPTR,A will give an error

MOV DPTR,#25F5H
MOV R7,DPL
MOV R6,DPH

  • The movement of data between Rn registers is not allowed
    • MOV R4,R7 is invalid


 Direct Addressing Mode


It is most often used the direct addressing mode to access RAM locations 30 – 7FH
  • The entire 128 bytes of RAM can be accessed
  • The register bank locations are accessed by the register names
MOV A,4              ;is same as
MOV A,R4           ;which means copy R4 into A

Contrast this with immediate addressing mode
  • There is no “#” sign in the operand
MOV R0,40H      ;save content of 40H in R0
MOV 56H,A        ;save content of A in 56H

SFR Registers and Their Addresses

The SFR (Special Function Register) can be accessed by their names or by their addresses
MOV 0E0H,#55H               ;is the same as
MOV A,#55h                      ;load 55H into A
MOV 0F0H,R0                    ;is the same as
MOV B,R0                           ;copy R0 into B

The SFR registers have addresses between 80H and FFH
  • Not all the address space of 80 to FF is used by SFR
  • The unused locations 80H to FFH are reserved and must not be used by the 8051 programmer

Stack and Direct Addressing Mode

Only direct addressing mode is allowed for pushing or popping the stack
  • PUSH A is invalid
  • Pushing the accumulator onto the stack must be coded as PUSH 0E0H
Show the code to push R5 and A onto the stack and then pop them
back them into R2 and B, where B = A and R2 = R5

Solution:
PUSH 05               ;push R5 onto stack
PUSH 0E0H          ;push register A onto stack
POP 0F0H            ;pop top of stack into B
;now register B = register A
POP 02                  ;pop top of stack into R2
;now R2=R6

Register Indirect Addressing Mode

  • A register is used as a pointer to the data
    • Only register R0 and R1 are used for this purpose
    • R2 – R7 cannot be used to hold the address of an operand located in RAM
  • When R0 and R1 hold the addresses of RAM locations, they must be preceded by the “@” sign
MOV A,@R0       ;move contents of RAM whose
;address is held by R0 into A
MOV @R1,B       ;move contents of B into RAM
;whose address is held by R1

Example:

Write a program to copy the value 55H into RAM memory locations 40H to 41H using
(a) direct addressing mode, (b) register indirect addressing mode without a loop, and (c) with a loop
Solution:
(a)
MOV A,#55H                      ;load A with value 55H
MOV 40H,A                        ;copy A to RAM location 40H
MOV 41H.A                        ;copy A to RAM location 41H
(b)
MOV A,#55H                      ;load A with value 55H
MOV R0,#40H                    ;load the pointer. R0=40H
MOV @R0,A                      ;copy A to RAM R0 points to
INC R0                                ;increment pointer. Now R0=41h
MOV @R0,A                      ;copy A to RAM R0 points to
(c)
MOV A,#55H                      ;A=55H
MOV R0,#40H                    ;load pointer.R0=40H,
MOV R2,#02                       ;load counter, R2=3
AGAIN: MOV @R0,A                    ;copy 55 to RAM R0 points to
INC R0                                ;increment R0 pointer
DJNZ R2,AGAIN                ;loop until counter = zero



  • The advantage is that it makes accessing data dynamic rather than static as in direct addressing mode
    •  Looping is not possible in direct addressing mode
Example:
Write a program to clear 16 RAM locations starting at RAM address 60H
Solution:
CLR A                 ;A=0
MOV R1,#60H    ;load pointer. R1=60H
MOV R7,#16       ;load counter, R7=16
AGAIN:
MOV @R1,A       ;clear RAM R1 points to
INC R1                 ;increment R1 pointer
DJNZ R7,AGAIN ;loop until counter=zero

Example:
Write a program to copy a block of 10 bytes of data from 35H to 60H
Solution:
MOV R0,#35H    ;source pointer
MOV R1,#60H    ;destination pointer
MOV R3,#10       ;counter
BACK:
MOV A,@R0       ;get a byte from source
MOV @R1,A       ;copy it to destination
INC R0                   ;increment source pointer
INC R1                   ;increment destination pointer
DJNZ R3,BACK   ;keep doing for ten bytes

  • R0 and R1 are the only registers that can be used for pointers in register indirect addressing mode


 Indexed Addressing Mode and On-chip ROM Access



Indexed addressing mode is widely used in accessing data elements of look-up table entries located in the program ROM

  • The instruction used for this purpose is 

MOVC A,@A+DPTR

  • Use instruction MOVC, “C” means code
  • The contents of A are added to the 16-bit register DPTR to form the 16-bit address of the needed data


Example Program:
In this program, assume that the word “ABC” is burned into ROM locations starting at 200H. And that the program is burned into ROM locations starting at 0. Analyze how the program works and state where “ABC” is stored after this program is run.
Solution:
ORG 0000H                         ;burn into ROM starting at 0
MOV DPTR,#200H            ;DPTR=200H look-up table addr
CLR A                                     ;clear A(A=0)
MOVC A,@A+DPTR         ;get the char from code space
MOV R0,A                           ;save it in R0
INC DPTR                             ;DPTR=201 point to next char
CLR A                                     ;clear A(A=0)
MOVC A,@A+DPTR         ;get the next char
MOV R1,A                           ;save it in R1
INC DPTR                             ;DPTR=202 point to next char
CLR A                                     ;clear A(A=0)
MOVC A,@A+DPTR         ;get the next char
MOV R2,A                           ;save it in R2
Here:
SJMP HERE                          ;stay here
;Data is burned into code space starting at 200H
ORG 200H
MYDATA:DB “ABC”
END                                                       ;end of program

Look-up Table

The look-up table allows access to elements of a frequently used table with minimum operations
Example:
Write a program to get the x value from P1 and send x2 to P2, continuously

Solution:
ORG 0
MOV DPTR,#300H           ;LOAD TABLE ADDRESS
MOV A,#0FFH                  ;A=FF
MOV P1,A                         ;CONFIGURE P1 INPUT PORT
BACK:
MOV A,P1                         ;GET X
MOV A,@A+DPTR           ;GET X SQAURE FROM TABLE
MOV P2,A                         ;ISSUE IT TO P2
SJMP BACK                      ;KEEP DOING IT
ORG 300H
XSQR_TABLE:
DB 0,1,4,9,16,25,36,49,64,81
END

BIT ADDRESSES

  • Many microprocessors allow program to access registers and I/O ports in byte size only
    • However, in many applications we need to check a single bit
  • One unique and powerful feature of the 8051 is single-bit operation
    • Single-bit instructions allow the programmer to set, clear, move, and complement individual bits of a port, memory, or register
    • It is registers, RAM, and I/O ports that need to be bit-addressable
      • ROM, holding program code for execution, is not bit-addressable

Example:
A switch is connected to pin P1.7. Write a program to check the status of the switch and make the following decision.
(a) If SW = 0, send “0” to P2
(b) If SW = 1, send “1“ to P2
Solution:
SW EQU P1.7
MYDATA EQU P2
HERE:    MOV C,SW
JC OVER
MOV MYDATA,#’0’
SJMP HERE
OVER: MOV MYDATA,#’1’
SJMP HERE
END

Example:
Assume that the on-chip ROM has a message. Write a program to copy it from code space into the upper memory space starting at address 80H. Also, as you place a byte in upper RAM, give a copy to P0.
Solution:
ORG 0
MOV DPTR,#MYDATA
MOV R1,#80H                    ;access the upper memory
B1:      CLR A
MOVC A,@A+DPTR         ;copy from code ROM
MOV @R1,A                       ;store in upper memory
MOV P0,A                           ;give a copy to P0
JZ EXIT                                  ;exit if last byte
INC DPTR                             ;increment DPTR
INC R1                                   ;increment R1
SJMP B1                               ;repeat until last byte
EXIT: SJMP $                       ;stay here when finished
;---------------
ORG 300H
MYDATA: DB “The Promise of World Peace”,0
END


No comments:

Post a Comment