i would also recommend learning datapaths, a good start is the single cycle data path, it will help you understand the inner workings of the CPU, learning datapaths also includes learning some assembly (not 2 hard if you dont try to go too deep). Also learing how things are stored in memory helps. Getting some idea of how things are stored in memory during the life cycle of a program will help when you start dealing with pointers and storage classes (static, register, volatile, extern) i'll give a link to some lecture slides after i stop rambling.
Note: using register isnt really needed, its a suggestion to the compiler to store a variable in a register for faster access but todays compilers are much smarter than the programmer and know weather or not a value needs to be kept in a register.
here is a link to the lecture slides used in a CS class i took:
some of these slides are vague and frustrating, kinda had to be in class to get it and i missed a few lectures but anyway if you notice hardware is one of the 1st lectures. Enjoy, oh....the stuff at the end was on lex and yacc which is more compiler related.