Assembly is kind of a programming language.
Since each system has a different processor it will have different assembly languages altogether so you'll have to start from zero for new systems... but some have large similarities (Master System/GB/GBC/WS) (NES/SNES/PC Engine) (GBA/DS/3DS) (Megadrive) (PS1/Saturn/N64)
Since you want to modify the programming, it makes sense to learn that programming language and even try and code some simple programs using it (hello world, calculators, snake...)
Then, comes the part where you modify an existing NES rom programming.
A debug emulator (FCEUX is among the best in this category) like all emulators, well, execute the programming written in the assembly language used by the system's processor (in this case, NES). The difference being, he allows you to see that code as it's being executed, and even stop at specific lines whenever something of interest is modified/called/executed (breakpoint, you find the targeted "something of interest" with a cheat code research), or use brute force and try to spy on everything à la NSA and just see everything executed between instants A and B (tracing).
It also offers various nifty viewers for graphical data and patterns in the system's RAM, or you can dump the entire RAM with this debug emulator in a file and try and study it elsewhere with a more efficient program.
For more advanced systems, you can even get the palettes.
It boils down to studying the assembly language and then figuring out what does what.