I can speak only for C++ and Pascal.
These two languages use the stack to pass variables. Pascal pushes the variables in the order that they are declared, C++ reverses this. The thing you can't forget is that the calling function also pushes the the return address onto the stack after pushing any parameters, offset for a near call, seg then offset for a far call.
Now, in Pascal Terms, To pass a VAR parameter( in other words, you want to maintain any changes to the variables made by the called function) the calling funcion passes the address of the variable on the stack. To pass just a parameter,(all changes are lost once the called function exits) The exact value of the data is pushed onto the stack, with the exception of string data. String Data is copied to a new memory location and then that address is passed on the stack. I'm not as sure about C++, but I beleive the conventions are similar. Pascal functions return values in the registers. A byte sized data value is returned in al, word sized in AX, Dword in AX

X, Reals are Passed in AX

X:BX. Strings are passed by pointer in AX

X, as are any structures larger than word
This is why you see a lot of this code:
PUSH BP ;save callers BP
MOV BP,SI ;Set BP to Current Stack Frame
...
POP BP ;restore Callers BP
RET
This allows you to access the passed parameters on the stack like so:
...
MOV AX,[bp-4] ;Access the data pushed last by calling function for a far call
...
Hope this helps.