This test demonstrates the different types of CALLs and JMPs to unique labels used in 32 bit code. Conditional jumps are looked at separately.
Set a breakpoint at TYPESOF_JMPSCALLS and run the test, then single-step through the code.
TESTCALL:
XOR EAX,EAX
RET
;
TESTJMP:
XOR EAX,EAX
JMP >L10
TESTJMP1:
XOR EAX,EAX
JMP >L11
TESTJMP2:
XOR EAX,EAX
OR EDX,EDX
JZ >L12
JMP >L13
;
TYPESOF_JMPSCALLS:
JMP TESTJMP ;jump to symbol direct
L10:
MOV EAX,ADDR TESTJMP1
JMP EAX ;jump to symbol direct via register
L11:
MOV EAX,ADDR TESTJMP2
MOV KEEP,EAX
XOR EDX,EDX
JMP [KEEP] ;jump to symbol indirect
L12:
MOV EAX,ADDR KEEP
INC EDX
JMP [EAX] ;jump to symbol indirect via register
L13:
CALL TESTCALL ;call to symbol direct
MOV EAX,ADDR TESTCALL
CALL EAX ;call to symbol direct via register
MOV EAX,ADDR TESTCALL
MOV KEEP,EAX
CALL [KEEP] ;call to symbol indirect
MOV EAX,ADDR KEEP
CALL [EAX] ;call to symbol indirect via register
RET