There's no need to perform any push operations since you control the stack already. You can have the data you wish to store within your registers already placed where you can conveniently perform operations with them.
In ROP, you find a series of useful code snippets present already within your target program that you can refer to as gadgets, which are typically the tail ends of normal subroutines that do operations you need for successful exploitation. You line up the addresses of the gadgets you wish to execute and the data you'd like to use with them inside a fake stack in memory you control before you perform a "stack pivot" to move your stack pointer (esp in x86) into your data.
After the stack pointer has been moved into your data, control of the program will be forfeited to your fake stack at the next
ret. When this instruction executes, the top word/address on the stack (0x100016f0 in your example) will be popped of, and placed into the program counter to redirect it into a gadget on the tail end of some function looks like
pop eax; ret;.
Where the next word on your stack is
2) 0x01a19f7f (a value), your stack pointer would already be pointing to this data when the
pop instruction executes, storing this word inside your eax register.
ret to immediately follow pops off your next ROP gadget address to continue on in execution.