An exhaustive answer to your questions would easily fill a book, so let's try direct answers.
In a multi-core processor, how are instructions assigned to CPU cores?
Binary code is organized in processes and sometimes threads (depending on OS). The OS's scheduler organizes running those processes/threads on the available CPU cores.
That is, on what basis is a program assigned or executed by a particular core and who makes this decision and how it is assigned?
Largely OS dependent, the scheduler may distribute load based on least loaded core, process/thread priority, core affinity, or something else.
Is is possible for the user or admin to instruct the system to run a specific program on a specific core?
Yes, that's called affinity.
How can this be performed?
Depending on the OS and its API, a process can set its core affinity by itself or a (possibly privileged) user can use tools to set the affinity of a given process.
How do these cores coordinate?
That's at the discretion of the OS and the scheduler.
Even if the OS manages scheduling, how does the OS instruct to run a program on a specific core?
Basically, the scheduler directly or indirectly sets the instruction pointer to the process/thread and lets the core run.
How does it look when translated to a code in C or assembly?
Scheduling works on the machine level. Any code needs to be translated to machine code first.