Yes, "Assembly" and "ASM" mean the same thing. Basic knowledge is a must, because some things cannot be done without knowledge of ASM: Bootloaders, interrupt service routines, low-level memory management are examples for this. Beware: ASM source syntax is depending on the assembler tool used. There is a group of assemblers that is quite similar to each others, and a couple of very different others (GAS, most prominently). I'll leave the details to the ASM gurus of this board.
Then you need in-depth knowledge of the high level language of your choice. You don't have to know more than one, but that one you must have
detailed knowledge of, especially the runtime support requirements (something you don't get in touch with when coding "normal" applications). The one best documented, with the lowest runtime requirements, is C. C++ without exceptions and RTTI comes a close second, the rest are more complex.
Edit: And while there will always be someone telling you that you
can write in any language you like,
de facto there is a limited number of languages
suited to the task. Yes, you can build a bicycle with square wheels, and it will even give a smooth ride -
if you build the right roads...