I want to know if I can manipulate (read and change the value of) the instruction pointer (IP) in 8086 assembly.
For example,
Say IP is currently storing
If you wanted to set the instruction pointer to a known value, say hex value 4020h, you could jump directly to that address:
jmp 4020h
Or if some memory location, myVariable, held the value you wanted to store in IP you could do an indirect jump:
jmp [myVariable]
The result of a jmp (indirect or direct) modifies the instruction pointer.
Reading the instruction pointer is problematic. Position independent code on Linux used to work by using a set of code something like:
call getIP
with
:getIP
mov bx, [sp] ; Read the return address into BX.
ret
For other methods of reading IP, see Stack Overflow: reading IP.