Magnus,
The ESP or EBP numbers are just memory operands that are usually LOCAL in scope, with a stack frame it will be EBP, with no stack frame it will be ESP and you will just have to get used to it. I suggested using the UN optimised output options as they can usually be understood and you then have the choice of how to optimise it. It will need things like redundant jump removal and memory operand removal where possible.
Now with a stack frame in 32 bit that has 3 arguments, you start at [ebp+8], next arg is [ebp+12] and the third argument is [ebp+16]. A NO stackframe procedure uses [esp+4], [esp+8] and the third arg is [esp+12] but it starts to get complicated once you use PUSH to preserve registers.
If you have to preserve ESI and EDI, you PUSH them in order then the ESP addresses have to be corrected by 8 (2 pushes). What I tend to do to keep track of the arguments is use a notation like this, [esp+4][8], [esp+8][8] and [esp+12][8].
It looks messy and you have to get it right but it comes with practice.