A word of warning

ASM isn't a difficult language. Except sometimes.
ASM is a very unique kind of language, so in the beginning, it's somewhat difficult to grasp. If you know the language C, you will probably recognize pointers and process everything much more smoothly; it's however possible to learn ASM even as your first language. I agree with several people that writing ASM isn't too hard, but writing large amounts of code properly is difficult and requires discipline. However, in this tutorial, I will do my best to teach that discipline, and patterns that will help writing complex code cleanly. Lastly, be aware that ASM has no facilities whatosever - after all, you're dealing with the hardware raw - so there will be quite a lot before we get something shown on-screen.

Note that this tutorial is primarily intended for people who have some programming experience. If you're OK with learning another language before ASM, I recommend C. Having learned some language prior, basically any language, will also be helpful in constructing ASM code, because you will be used to constructs such as ifs, loops, etc. ASM is fairly backwards in that regard, but it will be touched upon in due time.
If you only ever did object-oriented (or, less likely, functional) programming, ASM may take you by surprise quite a bit. ASM is the CPU's language, and CPUs are fundamentally imperative - thus, ASM is an imperative language. I think there exist some C++ solutions for the Game Boy, but given how difficult it is to make a game run smoothly using ASM (let alone C), I strongly don't recommend using C++ on the Game Boy, no ifs not buts.

Still with me? Then let's get going!