Intel and AMD publish very good documentation regarding x86.
Here's a link to Intels instruction set reference which (of course) has a section on CALL.
http://www.intel.com/design/intarch/manuals/243191.HTM
OP Code: FF /2
Instruction: CALL r/m32
Description: Call near, absolute indirect, address given in r/m32
Using NASM syntax
lbl_start:
MOV EAX, lbl_function1
CALL EAX
RETN
lbl_function1:
MOV EAX, 1
RET 0
If you're getting an exception it could mean almost anything. Here's a few common issues...
- you're not setting the register to an address within the program
- you're setting the register value but it's being changed by an API call that happens before your CALL reg32
- you're setting the register value to the data located at a specific address rather than the address itself
- you're encoding your CALL reg32 OP Code incorrectly, (ex: FF D0 is CALL EAX in hex)