Reputation: 193
Hi i am new in avr asm programming,in the example below, i have few questions:
1) Is it label: 8 bit or 16bit long?
2) Why multiplication label with 2 is needed?
3) Instruction LPM is placing their result in register R0? If so, what does that have to do with Z?
4) Can you explaine the quoted text from the provided link:
"If the address is not multiplied by two and label is at byte address 0x60 (word address 0x30), Z will point at the code stored there. I hope this clarified the addressing problem. Other versions are"
ldi ZL, low(2*label)
ldi ZH, high(2*label)
label:
.db "Hello world", 0
lpm
Thanks.
Upvotes: 3
Views: 1815
Reputation: 1642
Its like this. Follow the diagram below..diagrams help a lot in visualizing.
Word Addresses..................................Byte Addresses
|--(0d)---;--(0c)---|06 |--------|06
|--(0b)---;--(0a)---|05 |--------|05
|--(09)---;--(08)---|04 |--------|04
|--(07)---;--(06)---|03 |--------|03
|--(05)---;--(04)---|02 |--------|02
|--(03)---;--(02)---|01 |--------|01
|--(01)---;--(00)---|00 |--------|00
So you see 0x01 word address would correspond to 0x02 byte address 0x04 word address would correspond to 0x08 byte address
Hence the multiply by two.Lets say you have stored your message at location.
.org 0x0200
message:
.db "1234567890#"
In case you are using avr studio and check the program memory section. then you will find this stored in 0x400 not at 0x200.
Upvotes: 2
Reputation: 58762
LPM
needs byte address. Note that not all assemblers do this, notably gas
that's used by avr-gcc
, doesn't. Then you don't need the multiplication.LPM
automatically loads into R0
, and it takes the address from Z
. See the instruction set reference.Upvotes: 5