6 AdvancedAssembly

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 26

Advanced Assembly

Chapter 6

Sepehr Naimi

www.NicerLand.com
www.MicroDigitalEd.com
Topics
 Assembler directives
 Addressing modes
 Macro
 EEPROM memory
 Checksum

2
Some Assembler directives
Example
+ LDI R20,5+3 ;LDI R20,8
- LDI R30,9-3 ;LDI R30,6
* LDI R25,5*7 ;LDI R25,35
/ LDI R19,8/2 ;LDI R19,4

Example
& LDI R20,0x50&0x10 ;LDI R20,0x10
| LDI R25,0x50|0x1 ;LDI R25,0x51
^ LDI R23,0x50^0x10 ;LDI R23,0x40

Example
<< LDI R16, 0x10<<1 ;LDI R16,0x20
>> LDI R16, 0x8 >>2 ;LDI R16,0x2

3
HIGH and LOW

LDI R20, LOW(0x1234) LDI R20, $34


$1234
LDI R21, HIGH(0x1234) LDI R21, $12
HIGH LOW

LDI R20, LOW(-200) LDI R20, $38


LDI R21, HIGH(-200) LDI R21, $FF

-200 = $FF38

HIGH LOW
4
Single Register Addressing Mode
 Single Register Addressing Mode
 INC Rd
 INC R19
 DEC Rd
 DEC R23 ;R23 = R23 – 1

5
Immediate Addressing Mode
(Single register with immediate)

 LDI Rd,K
 LDI R19,25

 SUBI Rd,K
 SUBI R23,5 ;R23 = R23 – 5

 ANDI Rd,K
 ANDI R21,0x15

6
Two-register addressing mode

 ADD Rd,Rr
 ADD R26,R23
 SUB Rd,Rr
 LDI R20,R10

7
Direct addressing mode
 LDS Rd,address  STS address,Rs
 LDS R19,0x313  STS 0x95,R19

8
I/O direct addressing mode
 OUT address, Rr  IN Rd,address
 OUT 0x70,R16  IN R19,0x90

9
Register indirect addressing mode
 LD Rd,X
 LD R24,X
 LD R19,Y
 LD R20,Z

 ST X,Rd
 ST X,R18
 ST Y,R20

10
Example
 Write a program to copy the value $55 into
memory locations $140 to $144
LDI R19,0x5 ;R19 = 5 (R19 for counter)
LDI R16,0x55 ;load R16 with value 0x55 (value to be copied)
LDI YL,0x40
YL,0x40 ;load the low LDI
byteYL,LOW(0x140)
of Y with value 0x40
LDI YH,0x1
YH,0x1 ;load the highLDI
byteYH,HIGH(0x140)
of Y with value 0x1
L1: ST Y,R16 ;copy R16 to memory location 0x140
INC YL ;increment the low byte of Y
DEC R19 ;decrement the counter
BRNE L1 ;loop until counter = zero

11
Auto-increment and Auto decrement
 Register indirect addressing with Post-increment
 LD Rd, X+
 LD R20,X+
 ST X+, Rs
 ST X+, R8

 Register indirect addressing with Pre-decrement


 LD Rd, -X
 LD R19,-X
 ST –X,R31

12
Example
 Write a program to copy the value $55 into
memory locations $140 to $144
LDI R19,0x5 ;R19 = 5 (R19 for counter)
LDI R16,0x55 ;load R16 with value 0x55 (value to be copied)
LDI YL,LOW($140) ;load the low byte of Y with value 0x40
LDI YH,HIGH($140) ;load the high byte of Y with value 0x1
L1: ST Y+,R16 ;copy R16 to memory location Y
DEC R19 ;decrement the counter
BRNE L1 ;loop until counter = zero

13
Register indirect with displacement
 STD Z+q,Rr ;store Rr into location Z+q
 STD Z+5,R20 ;store R20 in location Z+5
 LDD Rd, Z+q ;load from Z+q into Rd
 LDD R20, Z+8 ;load from Z+8 into R20

14
Storing fixed data in flash memory
DATA1: .DB 28 ;DECIMAL(1C in hex)
DATA2: .DB 0b00110101 ;BINARY (35 in hex)
DATA3: .DB 0x39 ;HEX
DATA4: .DB 'Y' ;single ASCII char
DATA6: .DB "Hello ALI" ;ASCII string

15
Storing fixed data in flash memory
 LPM Rd, Z
 LPM R15, Z
 Example:
 LDI R30,0x80
 LDI R31,0
 LPM R18,Z ;read from the low byte of loc 0x80
 LPM Rd, Z+
 LPM R20,Z

16
Example
 Analyze the following program; then rewrite it using LPM R20,Z+

.ORG $0000 ;burn into ROM starting at 0


LDI R20,0xFF
OUT DDRB,R20 ;make PB an output
LDI ZL, LOW(MYDATA<<1) ;ZL = 0 look-up table low-byte addr
LDI ZH,HIGH(MYDATA<<1) ;ZH = 0A look-up table high-byte addr
LPM R20,Z LPM R20,Z+
OUT PORTB,R20 ;send it to PortOUTB PORTB,R20
INC ZL ;R30 = 01 pointing toLPM
next byte (A01)
R20,Z+
LPM R20,Z ;load R20 with
OUT'S' char pointed to by Z
PORTB,R20
OUT PORTB,R20 ;send it to Port B
INC ZL ;R30 = 02 pointing to next (A02)
LPM R20,Z ;load R20 with 'A' char pointed to by Z
OUT PORTB,R20 ;send it to Port B
HERE: RJMP HERE ;stay here forever
;data is burned into code(program) space starting at $500
.ORG $500
MYDATA: .DB "USA"
17
Example
 Assume that ROM space starting at $500 contains the
message “The Promise of World Peace”. Write a program
to bring it into CPU one byte at a time and place the
bytes in RAM locations starting at $140.
.ORG 0 ;burn into ROM starting at 0
LDI ZL, LOW(MYDATA<<1) ;R30 = 00 low-byte addr
LDI ZH, HIGH(MYDATA<<1) ;R31 = 0A, high-byte addr
LDI XL, LOW(0x140) ;R26 = 40, low-byte RAM address
LDI XH, HIGH(0x140) ;R27 = 1, high-byte RAM address
AGAIN: LPM R16, Z+ ;read the table, then increment Z
CPI R16,0 ;compare R16 with 0
BREQ END ;exit if end of string
ST X+, R16 ;store R16 in RAM and inc X
RJMP AGAIN
END: RJMP END
.ORG 0x500 ;data burned starting at 0x500
MYDATA: .DB "The Promise of World Peace",0

18
Macro

.MACRO INITSTACK
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
.ENDMACRO

INITSTACK

19
Macro
.MACRO LOADIO
LDI R20,@1
OUT @0,R20
.ENDMACRO

LOADIO DDRB,0xFF
LOADIO PORTB,0x55

20
EEPROM
EEPROM Address Register
 EEPROM is a place to store data. It is not deleted
EEPROM Data Register
when power isEEPROM
off Control Register
 ATmega328 has 1024 bytes of EEPROM
 In AVR 3 registers are dedicated to EEPROM
 EEARH:EEARL
 EEDR
 EECR

21
Reading from EEPROM
1. Wait until EEWE becomes zero.
2. Write new EEPROM address to EEAR
3. Set EERE to one.
4. Read EEPROM data from EEDR.
The following program reads the content of location 0x005F of EEPROM:

WAIT: SBIC EECR,EEWE ;check EEWE to see if last write is finished


RJMP WAIT ;wait more

LDI R18,0 ;load high byte of address to R18


LDI R17,0x5F ;load low byte of address to R17
OUT EEARH, R18 ;load high byte of address to EEARH
OUT EEARL, R17 ;load low byte of address to EEARL
SBI EECR,EERE ;set Read Enable to one
IN R16,EEDR ;load EEPROM Data Register to R16

22
Writing into EEPROM
1. Wait until EEWE becomes zero.
2. Write new EEPROM address to EEAR (optional).
3. Write new EEPROM data to EEDR (optional).
4. Set EEMWE bit to one.
5. Within four clock cycles after setting EEMWE, set EEWE to one.
The program writes ‘G’ into location 0x005F of EEPROM:
WAIT: SBIC EECR,EEWE ;check EEWE to see if last write is finished
RJMP WAIT ;wait more
LDI R18,0 ;load high byte of address to R18
LDI R17,0x5F ;load low byte of address to R17
OUT EEARH, R18 ;load high byte of address to EEARH
OUT EEARL, R17;load low byte of address to EEARL
LDI R16,'G' ;load 'G' to R16
OUT EEDR,R16 ;load R16 to EEPROM Data Register
SBI EECR,EEMWE ;set Master Write Enable to one
SBI EECR,EEWE ;set Write Enable to one
23
Checksum
 To detect data corruption
 Calculating checksum byte:
 Add the bytes together and drop the carries
 Take the 2’s complement of the total sum
 Testing checksum
 Add the bytes together and drop the carries
 Add the checksum byte to the sum
 If the result is not zero, data is corrupted

24
Example
 Find the checksum byte for the followings:
$25, $62, $3F, $52
Solution:
$25
+ $62
+ $3F
+ $52
$1 18
Checksum byte = 2’s complement of $18 = $E8

25
Example
 The checksum byte is $E8. Test checksum for the
following data:
$25, $62, $3F, $52
Solution:
$25
+ $62
+ $3F
+ $52
+ $E8
$00  not corrupted

26

You might also like