A good start is a disassembler like Objdump, HopperApp or IDA Pro for example. The latter of them detects the parameters automatically for non-special cases.
If you want to understand for your own how this works I would look up the different "calling conventions" (wikipedia is a good start).
Example for __stdcall: say you have x86 .so library and something like this happens in the binary:
push 3
push 2
push 1
call func ; void func(int a, int b, int c) where a=1, b=2 and c=3
The arguments are pushed to the stack in reverse order. EAX, ECX and EDX can be used inside the function (saved by the caller) other registers have to be explicitely saved from the function itself (saved by the callee). This does not tell you anything about the datatype behind the argument. This needs often some more reversing to be resolved.
Even IDA Pro does not detect every information automatically because it depends on a lot of factors and can be very hard :)