I have this problem that i cannot manage to solve.

I had to write a program that reads hex symbols (a set of simple commands, like mov dx, 1234h) from the entered input file (in PSP). It's all ok, i have opened the file, read the commands, stored them in a var in dseg. Now i have to jump to these commands, execute them and give the control back to the original CS:IP. So anyway, as i read in some forums, i defined a var:
pfnFarCall db 0F3h,05h,0E9h,05Ah

and executed it:
call dword ptr [pfnFarCall]

and the following code in data segment is:

BA 34 12 C3

which is:
(mov dx, 1234h)

now the CS:IP are in the stack. It's all fine, the simple command (mov dx, 1234h) is done, but i have to go back into the code segment. Ret seems to work fine, but it doesn't return to the right place. The CS:IP before the call were 5AF9:0103 ant in stack they were 5AF9:0107 (return address of the instruction after call). So anyway, when the ret from the data segment is done, the control is given to a wrong spot. CS = 5AE9, IP = 0107. This is what's bothering me, because i have to go to CS = 5AF9, IP = 0107.

please, help me!!!