The processor has a PC (Program Counter) register containing the address of the next instruction to be executed. On reset, the PC is set to a fixed value where execution begins.
The first byte of every instruction is the op-code byte; its coding determines what the instruction will do and how many operand bytes are required. The processor fetches the op-code byte from the address in the PC and increments the PC. The op-code is examined and any necessary operand bytes are fetched, always from memory pointed to by PC which is incremented for each one. Once a complete instruction is fetched the PC will be pointing at the op-code for the next instruction.
The CPU then performs the operations determined by the op-code byte and its operands, this is called instruction execution. Execution may change the PC in the case of a jump for example but at the end of execution, the PC will be pointing at the op-code byte of the next instruction to execute and the cycle, called the fetch-execute cycle, continues.
Bugs in programs are quite often due to the fact that the PC is changed to a value which is not the the start of an instruction written by the programmer/compiler. The CPU has no way of knowing that and proceeds regardless, executing memory content which was never meant to executed and performing essentially random operations.
An excellent resource for understanding how this is all put together is The Elements of Computing Systems which is a book but most of the content are available from that web site.
Hope that helps.