How does high-level assembly instruction get translated into low-level logical gate behaviors?
You really can't jump from assembly instructions to gates. Between the assembly language instructions and the actual gates, there is another level of abstraction: the functional circuit blocks.

The assembly language instructions generate control signals to a number of functional blocks. At a minimum there is the instruction decoder, the ALU for arithmetic and the program sequencer for instruction flow. Additionally, there is typically one or two address generators for addressing operands. They could be simple pointers, as in an 8051, or complex arithmetic units themselves, as in a DSP. You often have pipeline registers to allow instructions to flow faster. These days, there are also floating-point and other co-processors.

The workings of each of these blocks can be discussed at length. So we really can't answer that question.

Microcode was one way to simplify those blocks, at the expense of speed. The processor is made very simple, and complex instructions invoke a sequence of micro-instructions, pre-programmed in a "control-store", that run on the simplified hardware. The technique isn't used anymore, since speed is considered much more important than gates. Gates are almost free.