I think one of the best ways to start learning assembler is to look at the result created by the compiler for a language you are familiar with. For example, if you are familiar with Visual C ++, write very simple C ++ code and use the built-in debugger to show the assembly language created by the compiler (make sure you compile with optimization). Write some simple for loops, assignment, arithmetic, etc. And look what the assembler language looks like.
For training, you do not need to know anything about the extensions to the set of instructions that you indicated in your question. All that bothers you is the x86 32-bit instructions. You can learn about 64-bit instructions, MMX, SSE, etc. Later, as soon as you have a reason in place.
Once you have a basic understanding, you will need assembler. A good, well-supported, open source general purpose assembler is nasm .
source share