Is AVR Assembly Difficult?
AVR Assembly is not a difficult programming language. In fact, it's pretty darn simple... once you get the hang of it. The problem is, it can take some time to get to that point.
If you had any background in a high level language before you started learning AVR C, you probably found that programming concepts could be presented in small, digestable chunks that logically built on each other. Your progress was probably fairly steady and linear, with a slew of well thought out tutorials available online for any skill level.
Hopefully once you reached a certain point you understood enough to just go read the datasheets and could (mostly) figure things out on your own. A very accurate depiction of this process is shown below in Figure 1.
Learning AVR Assembly on the other hand, seems to necessitate a firehose approach. Nothing in assembly is that complicated, but for every simple concept you need to know ten other simple concepts for it to make sense. You almost have to understand everything to do anything. Learning assembly looks much more like what is depicted below in Figure 2.
AVR Assembly can be very overwhelming if it's your first low level language because there are so many things that need to be discussed before any sort of useful programs can be written. You may be surprised to find out that even some of the simplest and fundamental aspects of high level languages don't exist at the machine level. Learning assembly you practically have to forget everything you've learned before and start over from the beginning.
This can be frustrating and you may feel like your progress is extremely slow - maybe even going backwards at times. However, if you keep at it you will eventually reach a tipping point where it will all come together very quickly.
Structure of the following Tutorials
As I said before, the frustration with assembly is that every simple concept requires understanding ten other simple concepts. This can bog things down and require significant reading before writing any sort of program.
In the tutorials that follow I have tried to intersperse practical programming examples to keep the progress focused - at least for a short while - before diving headfirst into all of the underlying details. I hope this will help keep you motivated to continue and keep the big picture in mind, but it also means concepts are presented before they can be fully elaborated. Keep this in mind and digest as much as you can at a time, but know that you may need to reread things two or three times before they fully set in.
I will warn you - starting to learn assembly may be frustrating at first and progress will feel slow. But the amazing thing is, once you've learned the basics, you can easily implement anything you've learned in C. In fact, you won't even need assembly tutorials anymore. Translation from higher level languages to to assembly will be simple and obvious!