pues mira, ebp marca siempre el principio del espacio de pila. A medida que haces push el valor de esp, que marca la cima de la pila disminuye.
cuando haces:
push Param2 push Param1 call MiFuncion
El call pone en la pila eip que luego usara el ret para volver, eso son esp+4 para el primer parámetro. Después se hace push ebp, lo que son entonces esp+8 para el primer parámetro.
Y luego se copia el valor de esp en ebp.por lo que el primer parámetro es siempre ebp+8.
Y las locales, lo que se hace es restarle el tamaño de las var local a esp. Con lo que si tienes una variable local que ocupa 4bytes y es la primera, la encontraras en ebp-4. si es la segunda pues estara en ebp-(sizeVar1+sizeVar2).
Esto son cosas que se ven muy claras con el OllyDbg al depurar un programa que tu mismo has hecho en asm.
si args es el primer argumento, si es el segundo seria 0xC(%ebp) Si es una variable local entonces seria a partir de -4(%ebp) hacia abajo. Y si es una gloval ($args).
como dijo jack el destripador, vamos por partes xD
rep repite una operacion hasta que cx o ecx sean 0.
movsb, movsw, movsd. Mueven el contenido de la direccion de memoria contenida en esi, a la direccion de memoria apuntada por edi y los aumentan o disminullen 1,2,4 respectivamente.
cld borra el falg que indica si se resta o aumenta edi y esi con un movsX STD hace lo contrario de CLD. Si el flag esta en 1, se disminuiran y en cero se incrementaran.
movzx es como un mov, pero sirve para copiar 1,2,4 bytes en un registro de 32bits. Rellenando lo que falte con zeros.
Byte ptr, word ptr, dwrod ptr es la forma que se usa para decirle al Masm la cantidad de bytes que se quiere leer de memoria.