К слову. Вот вы вызываете call на 5 байт. Или call reg 2 байта, и перед этим mov reg, func 5 байт.
Но вот какая загвоздка - если код находится не в своём пространстве - адрес на func, в котором получается волшебный EIP - будет правильным?
Нет. А значит что? Значит можно это всё решить дело в 5 байт на одну строчку:
mov eax, $
Потому что какой смысл воротить дела с этим call, если вы всё равно передаёте ему статический адрес на вашу великую функцию? Вот именно - никакой!