There are many and I mean many ways to learn something and what works the best is a personal endeavor. Many individuals prefer videos or online guides to learning over books. I for one feel there is a culmination of things we need to do to learn something well. I believe reading a book cover to cover first and then paying attention to technical details is a path that has worked for many and worked well for me.
So what book should you start with? I personally believe the book “Introduction to 64 bit Assembly Programming for Linux and OSX” is a great start. No it is not free, but it is only $4.99 and you’re supporting someone who has created some great work for us that love assembly programming. I would note that the syntax is not that of GNU assembly, but that of the Netwide Assembler. Once you learn and understand the differences between 64-bit and 32-bit assembly you can really read many other things and adopt it to your needs.
I really recommend afterwards reading Programming from the Ground Up. It teaches 32-Bit assembly, but uses the GNU assembler and explains concepts really, really well. If you decide to go that route I would read something along the lines of Getting started with x86-64 assembly on linux to give you an understanding of 64 bit assembly and then deeper understanding with the other books.
Once you start writing some programs and exploring Linux system calls I would bookmark Linux System Call Table for x86 64 as you will be referencing this a great deal.. at least I do. Don’t forget to read ALOT of code. Step through code in a debugger and understand why things do what they do.
Environment setup
I use Vim to write all GNU Assembly code with this syntax file for vim. Just be sure you copy the gas.vim file to ~/.vim/syntax and then create a different ~/.vim/ftdetect/gas.vim and put this line in it:
au BufRead,BufNewFile *.s,*.S set filetype=gas
Advanced reading
I wouldn’t say this stuff is really “advanced”, but I would make sure I have a good grasp before spending too much time on it. I would start with Ray’s book and look at Chapter 16 on performance programming with assembly and be sure to reading the System V ABI. Then when you really want to go full assembly grey beard reading the Intel Manuals. If you’re more of a video person you can watch Creel’s videos on x64 assembly as he even goes into SIMD and Floating Point stuff. Lastly if you still really love GNU Assembler, then read the manual here. This will teach you syntax, directives, flags, etc..
In closing, finding your path takes some time and finding the resources that helps you understand things in a way which works for the individual. Learning how to learn is a skill in and of itself. Take time to understand yourself and how you best can learn new concepts and retain them. You should spending the majority of your time in code. Reading and writing and debugging. This is where your knowledge will be transferred to long term memory and you will begin to understand things in greater detail.
Have fun on your path to learning x64 assembly!