Wednesday, June 30, 2010

Session 2: 8051 Assemble Language

• Register
• MOV
• Power Up
• Stack
• PSW
• Register banks

Register Banks

1. General purpose, 8 bit
             o A: (Accumulator), B
             o R0,R1, R2, R3, R4, R5, R6, R7
2. 16-bit, specifically used as pointers
           o DPTR: (data pointer) : as 8-bit DPH, DPL (data pointer hi/low)
           o PC: (Program Counter)

MOV Intruction

1. Syntac:
           Mov dest, src
                      o Think assignment statement: dest:=src;
2. Dest src are called Operands
            o Dest can be A, B, R0...R7, DPH, DPL
            o Src can be A, B, R0...R7, or an immediate
3. Immediate = constant value, e.g as #12

Assembler idiosyncrasy with immediates

1. Default base: decimal
             o #12 (assumed to be decimal)
             o Can be hex: #12H (hex 12, = dec 18)
2. However the char after # must be '0'.. '9'
             o #FFH is invalid (since 'F' is not in '0'..'9'
             o Solution: #0FFH (add a useless '0')

Immidiates vs direct (addressing mode)

1. Mov A, #17H
              o A= 0x17; #17H is literal
2. Mov a, 17
              o A= * ((char *)17) 17 is an address
3. Big difference
              o R0,...R7 => Register mode
              o #17 => Immediate mode;
              o 17 => direct mode (address -- where?)

Add instruction

1. ADD A, source
              o Note: A is hardwired cannot use anything else
              o Meaning: A:= A + source;
2. Source itself can be any R-Value operad
             o Immediate, direct, register
How to write R2:= 0x25 + 0x35
             1. Key: need to involve the accumulator A
             2. MOV A, 25H ;; A: = 0x25;
                 ADD A, 34H ;; A: = A + 0x34;
                 MOV R2, A ;; R2:= A;
             3. Would be incorrect (in 8051) to try
                 MOV R2, 25H ;; this part is ok
                 ADD R2, 34H ;; must use A, not R2
            4. Since the sum is constant, could do
                MOV R2, 59H ;; eval. by assembler

Assembly Language

1. Directives
             o Commands to the assembler
                e.g., starting address, allocate memory,...
2. (assembly) instructions
              o Correspond to machine instructions
3. Labels
              o Symbolic names that mark addresses
4. Comments

Example Program (2-1)

ORG 0H :start address
MOV R5, #25H
MOV R7, #34H
MOV A, #0
ADD A, R5
ADD A, R7
ADD A, #12H
HERE: SJMP HERE
END ; some may be. END

Mnemonic

• A symbol that helps you remember
• example: phone number
             o 2 = A, B, C 3 = D, E, F 4 = G, H, I
             o doesn't need to be exact; can approximate
• Opcodes and directives are mnemonics
             o MOV ~~ "move"
             o JMP ~~ "jump" etc

Try this out

• Save assembly program as plain text file Name file.a51
• asem file.a51 ;;type this as a command
  => if correct, says no erross
• Output files -- simple case, sigle file
          o .hex file: hex-formatted binary file
          o .lst file: "listing" (before/after views)

.lst file by assmebler

Addr       Machine code      Assembly Source
0000          7D 25                 Mov R5, #25H
0002          7D 34                 Mov R7, #34H
0004          7F 00                  Mov A, #0
0006          2D                      ADD A, R5
0007          2F                      ADD A, R7
0008          24 12                 ADD A, #12H
000A         80 FE                 HERE: SJMP HERE

More assembler features

• Literal: in other bases
            o Binary: add B after: 0000 1010B
• DB: define byte (or string, whatever data)
            o store the data in program memory
            o label is optional, not required!
• EQU: constant declaration (macro)
            o inlined when used. requires a macro name

Example of DB vs EQU

• DATA1: DB "Hello world"
  DATA2: DB 25
  => both accupy space in (code) memory
• COUNT EQU 25 ;;occupies no space!
  MOV R3, #COUNT
  => macro expansion into MOV R3, #25

Adders -- from logic gates

• Half adder
  - Sum = same as an Xor
  - Carry = same as And
• Full adder
  -Take Carry from prev bit
  -Consists of two half adders
• Then connect them in a chain
• Forunately, VHDL can do bitvector add

PSW: program status word

• 8 bit register containing flags
          o indicating status of the processor
CY (C bit)     PSW.7        Carry flag
AC                PSW.6        Auxiliary carry. for BCD arithmetic
F0, -              PSW.5        (user)
RS1               PSW.4        Register bank select
RS0               PSW.3        Register bank select
OV                PSW.2        Overflow
P                   PSW.0        Parity: even or odd # of i's in A

CY flag (C-bit)
• Carry out of the highest-order adder
            o Does not mean overflow!!
   Example: 0x01 + 0xFF = 0x00 with C= 1
   (corresponds to 1 + (-1) = 0.)
           o Carry or borrow, both have C=1
• Carry bit can be set, cleared, moved
          o CLR C ;; clear the C bit, means := 0
             SETB C ;; set the C bit, means := 1

OV-flag (overflow)


• Overflow: too big/too small to represent
• ADD:
       o Both operands same sign, sum different
          e.g., both +, sum-; or both -, sum +
       o Cannot overflow when operands mix + -
          Because the sum is beween the two
• SUB:
        o Opposite condition of ADD

Outcome of a signed A + B

• A and B have different signs
        o Can't overflow. Because either
           A≤ Sum ≤ B or B ≤ sum ≤ A
        o V (overflow bit) is always '0' in this case.
• A and B have same signs
        o Sum has same sign as A, B => No overflow
        o Sum has a different sign => Overflow! (V='1')

Example of Overflow in signed addition

• Both A, B positive, Sum negative






• The status bits are
                 o V = 1 (overflow), C = 0 (no carry out),
                 o N = 1 (negative), Z = 0 (not zero)

Example of overflow in signed addition (cont'd)

• Both A, B negative, Sum positive







• The status bits are
          o -V = 1 (overflow), C=1 (carry)
          o N = 0 (not negative), z = 0 (not zero)
• Sum does not include the carry bit!!

Examples of NOT Overflow in signed addition

• A, B have different signs







• Overflow is not the same as arithmetic carry
             o Truncating at the top is a feature, not a bug!
             o C = 1 (ignored), V= 0, N = 0, Z = 0

Examples of unsigned addition

• MSB of A, B both = 0, MSB of Sum = 1







• the status bits are
          o V = 0 (overflow), C = 0 (no carry out0,
          o N = 0 (not negative), Z = 0 (not zero)


 Examples of Overflow in unsigned additon (Cont'd)

• MSB of both A, B= 1, MSB of Sum = 0






• The status bits are
            o V = 1 (overflow), C = 1 (carry)
            o N = 0 (not negative), Z = 0 (not zero)
• Sum does not include the carry bit

Signed Subtract


• A - B = A + (-B)
           o Take 2's complement of B (flip all bits, add 1)
           o VHDL also provides the -operator
• N, Z, C, V bits
           o C = "borrow", 1 when sign bit:
           o if A, B same sign => V='0'
           o if A, B diff signs and Res diff sign from A => V='1'

Examples of signed subtraction

• Positive A, Positive B, Negative Result

 







• The status bits are

            o V = 0 (overflow), C = 1 (borrow).
            o N = 1 (negative), Z = 0 (not zero).

Examples of overflow in signed subtraction

• Positive A, Negative B, Negative Result



 






• The status bits are
           o V = 1 (overflow), C = 1 (borrow).
           o N = 1 (negative), Z = 0 (not zero).

 Unsigned Subtract
 
• A - B = A + (-B)
         o Take 2's complement of B, add as before
         o VHDL also provides the -operator
• N, Z, C, V bits
         o N always '0' (unsigned).
         o C = "borrow". Same as signed version
            '1' when the MSB = table here
            A      0   0   0   1
            B      0   1   1   1
            Res   1   1   0   1
         o V unsigned = C unsigned

Examples of overflow in unsigned subtraction
 
• Both A, B Positive, Res negative


 



• C = 1 (ignored), V = 1, N = 0, Z = 0
         A        0   0   0   1
         B        0   1   1   1
         Res     1   1   0   1

Register banks and Scratchpad memory

• Four register banks [ 00-lFH]
          o 8 registers per bank (8 bytes/bank)
          o bank 1 is stack
• Bit-addressable (16 bytes) [20-2FH]
• Scratchpad (Byte-addressable) [30-7FH]
• Total 128 bytes [00-7FH]

Register bank selection


• Register can be from 1 of 4 banks
            o Depending on PSW.4, PSW.3
• Example
           o MOV R0, #12H
             Where is R0?



 




• Answer: depends on which bank!

            o Could be address 00H, 08H, 10H, or 18H

Instruction for setting banks

• "Set a bit" (means assign the bit to 1)
            o SETB PSW.4
• "Set a bit" (means assign the bit to 0)
            o CLR PSW.3
• So, together, PSW.4 = 0, PSW.3 = 1
   => selects bank a

Two ways of accessing the same registers

• Register mode:
           o Use R0, R1 ...name
           o Current bank
           o Need bank switching
• Direct mode:
           o Use the RAM address of the register!
           o 00 for R0 of bank 1, 12 for R2 of bank 3

Examples

• Register addressing:
           SET B PSW.4
           CLR PSW.3
           MOV R3, #99H
• Direct addressing:
           MOV 13, #99H









Stack
• Fundamental data structure in programming
           o Return address of a call
           o space for local (auto) variables
• Implicitly addressed
           o PUSH (add element to stack)
           o POP (remove element from stack)
• Need: stack pointer (SP) -- register in 8051

8051 architecture-supported stack

• 8-bit Stack Pointer SP
           o Initialized to 07H on power up
              => points to just before R0 of bank1
• Grows from lower to higher address
           o PUSH: pre-increment: stack [++SP]=d;
           o POP: post-decrement: d=stack [SP--];
• Opposite from stacks on other CPUs!!

Synax of PUSH/Pop instructions

• PUSH 6
           o This doesn't mean PUSH #6
           o It means PUsh content of R6 to stack!
• POP 2
           o Means pop the top element of stack to R2
           o Reason: think "RAM Address"

Range of value for SP

• [07 - 1FH] (register bank 1, 2, 3)
           o On power-up SP = 07H
           o Should not go lower;
              Could go up to 1FH (R7 of bank3)
• [30 - 7FH] (scratchpad memory)
• NOT [20 - 2FH] -- bit addressable area

Other use of stack : call /Return

• Call instruction
           o pushes return address onto stack then go to target
• Return instruction
           o pops return address then go to target
• Interrupt: hardware pushes return address
• Return-from-interrupt instruction

No comments: