The program counter (PC) is a register that is part of the central processing unit (CPU). It contains the memory address for the next instruction that has to be executed during the instruction cycle of the microprocessor.
Principle of Operation
Each instruction cycle begins by accessing the instruction stored at the address that is pointed by the program counter and passing it to the instruction register. After that the program counter is updated to point to the address of the next instruction.
The program counter is incremented with a number equal to the size (in bytes) of the last instruction.

Fig. 1 Program counter operation during fetch phase
The flexibility given by high level languages for creating repeated actions using while structure and control path (decision making) using an if-else structure is made possible by the use of branch and jump instructions where the program counter plays a major role.
Branch instructions
A branch instruction performs a comparison and depending on the outcome of the comparison modifies the program counter value:
- if comparison is successful (true) the program counter is modified to take the branch
- if comparison is not successful (false) the program counter is incremented to the next instruction after the branch instruction
The branch instructions modifies the programs counter by adding an offset to its current value. So the new value is always relative to the previous one.
Example:
PC = PC + offset
Jump Instruction
The jump instruction puts a new address into the program counter (unlike the branch instruction that adds an offset) when it is executed during the instruction cycle. When the next instruction cycle begins, a new instruction is fetched from the address that was put by the jump instruction in the previous cycle.
I know this isn’t supposed to be a conclusive lecture but this article (and every other one I’ve read on this site) is so thin and general that it’s actually quite unhelpful for anyone wanting to get educated on the topic. This one however has such an eggregious error that I cannot avoid commenting.
The worst error here is the common mis-statement that the Program COUNTER is a REGISTER. It is NOT. The INSTRUCTION POINTER may be a register but the PROGRAM COUNTER is effectively that – a COUNTER. There is much more to it than a “special register”. It is a Presettable, Variable Up/Down COUNTER. Yes, often in core implementation the system’s ALU is used to perform the calculation of the next instruction address but at that time the ALU is technically part of the Program Counter.
You also fail to explain that the counter may be loaded (or preset) with a specific location to allow subroutine execution. This requires the counter to be closely bound to the return stack.
When the full functionality of the counter is realized it is quite clear that the PROGRAM COUNTER is not the same as the INSTRUCTION POINTER.
Thank you for the feedback, we appreciate it!
Regarding the issues you are describing:
1. In the article, we have stated that the Program Counter (PC) is a register. And that statement is correct. The program counter as specified in the programmer’s model of any modern microprocessor is a register and as such is mapped to a specific address. As a reference please see the following information regarding ARM Cortex-M4 processor https://developer.arm.com/docs/100166/0001/programmers-model/processor-core-register-summary.
2. Now if we go a little deeper than the programmer’s model abstraction, we can certainly say that the program counter is more than just a register. It is actually a synchronous digital counter, capable of doing a lot more than just counting as you already mentioned. We have made the decision not to include such details, as we are covering the program counter as functional abstraction in this article.
3. In the article, we have dedicated sections explaining how the value of the program counter can be modified. This can be achieved by using branch instructions or jump instructions.
4. The program counter and the instruction pointer both refer to the same thing. Some architectures use the term “instruction pointer” and others (like ARM) use the term “program counter”.
We agree that this is not an in-depth article on the topic of Microprocessor Program Counters, however, every statement in the article is researched, checked and we stand by it.
Best Regards,
Open4Tech Team
Simple and easy to understand.