"Assembler" usually refers to a program tha compiles assembly to machine code, assembly being the lowest-level language there is before plunging into raw ones and zeroes (nobody programs in those any more). Assembler is often used to code parts of the kernel since, you know, it's the bit of the operating system that deals directly with the hardware. However, assembly isn't used for just kernels and kernels aren't written entirely in assembly (except for some really special hardware of experiments).
Kernel, you're right, is a piece of software that gives all applications access to the hardware... it's the core of the operating system. Though I don't quite understand what you mean by "where it's located physically"... being software itself, it doesn't "physically" exist. When the computer is running, it's in the RAM... there's no rule as to where in the RAM it has to be, it's often dependent on the OS/kernel itself.
Firmware it's sort of like a small kernel itself on a device (in simplified terms, of course), it doesn't have anything to do with a computer's kernel directly. It simply controls the functions of the machine and likely also the interaction between the device and the driver on the host computer.