Microcontrollers use addressing modes to specify the source of operands and destination of results in instructions. The main addressing modes are: register addressing which uses register names; direct addressing which directly specifies the data address; register indirect which uses a register containing another's address; immediate which includes the data in the instruction; and index addressing which forms an address by adding a register value to a base pointer.