idle but with that array you then have extra code (filling the array with values) every time the Jump proc is called, which seems counter-intuitive in regards to using a jump table to save a few cycles? i just checked and even with Static it's still a lot of overhead by comparison:
Code: Select all
!int3
Dim jt(5)
jt(0) =?Label_000
jt(1)= ?Label_001
jt(2)= ?Label_002
jt(3)= ?Label_003
jt(4)= ?Label_004
jt(5)= ?Label_005
!int3
JumpTo(jt(x))
!int3
Dim:
Code: Select all
00401070 . CC int3
00401071 . 8D1424 lea edx, dword ptr [esp]
00401074 . 52 push edx
00401075 . 68 00000000 push 0
0040107A . 68 15000000 push 15
0040107F . 68 06000000 push 6
00401084 . 68 04000000 push 4
00401089 . E8 C50F0000 call PureBasi.00402053
0040108E . BD FA104000 mov ebp, PureBasi.004010FA
00401093 . 55 push ebp
00401094 . 8B6C24 04 mov ebp, dword ptr [esp+4]
00401098 . 58 pop eax
00401099 . 8945 00 mov dword ptr [ebp], eax
0040109C . BD FC104000 mov ebp, PureBasi.004010FC
004010A1 . 55 push ebp
004010A2 . 8B6C24 04 mov ebp, dword ptr [esp+4]
004010A6 . 58 pop eax
004010A7 . 8945 04 mov dword ptr [ebp+4], eax
004010AA . BD FE104000 mov ebp, PureBasi.004010FE
004010AF . 55 push ebp
004010B0 . 8B6C24 04 mov ebp, dword ptr [esp+4]
004010B4 . 58 pop eax
004010B5 . 8945 08 mov dword ptr [ebp+8], eax
004010B8 . BD 00114000 mov ebp, PureBasi.00401100
004010BD . 55 push ebp
004010BE . 8B6C24 04 mov ebp, dword ptr [esp+4]
004010C2 . 58 pop eax
004010C3 . 8945 0C mov dword ptr [ebp+C], eax
004010C6 . BD 02114000 mov ebp, PureBasi.00401102
004010CB . 55 push ebp
004010CC . 8B6C24 04 mov ebp, dword ptr [esp+4]
004010D0 . 58 pop eax
004010D1 . 8945 10 mov dword ptr [ebp+10], eax
004010D4 . BD 04114000 mov ebp, PureBasi.00401104
004010D9 . 55 push ebp
004010DA . 8B6C24 04 mov ebp, dword ptr [esp+4]
004010DE . 58 pop eax
004010DF . 8945 14 mov dword ptr [ebp+14], eax
004010E2 . CC int3
Static Dim:
Code: Select all
0040108C . CC int3
0040108D . BD 03114000 mov ebp, PureBasi.00401103
00401092 . 55 push ebp
00401093 . 8B2D 30314000 mov ebp, dword ptr [403130]
00401099 . 58 pop eax
0040109A . 8945 00 mov dword ptr [ebp], eax
0040109D . BD 05114000 mov ebp, PureBasi.00401105
004010A2 . 55 push ebp
004010A3 . 8B2D 30314000 mov ebp, dword ptr [403130]
004010A9 . 58 pop eax
004010AA . 8945 04 mov dword ptr [ebp+4], eax
004010AD . BD 07114000 mov ebp, PureBasi.00401107
004010B2 . 55 push ebp
004010B3 . 8B2D 30314000 mov ebp, dword ptr [403130]
004010B9 . 58 pop eax
004010BA . 8945 08 mov dword ptr [ebp+8], eax
004010BD . BD 09114000 mov ebp, PureBasi.00401109
004010C2 . 55 push ebp
004010C3 . 8B2D 30314000 mov ebp, dword ptr [403130]
004010C9 . 58 pop eax
004010CA . 8945 0C mov dword ptr [ebp+C], eax
004010CD . BD 0B114000 mov ebp, PureBasi.0040110B
004010D2 . 55 push ebp
004010D3 . 8B2D 30314000 mov ebp, dword ptr [403130]
004010D9 . 58 pop eax
004010DA . 8945 10 mov dword ptr [ebp+10], eax
004010DD . BD 0D114000 mov ebp, PureBasi.0040110D
004010E2 . 55 push ebp
004010E3 . 8B2D 30314000 mov ebp, dword ptr [403130]
004010E9 . 58 pop eax
004010EA . 8945 14 mov dword ptr [ebp+14], eax
004010ED . CC int3
my original example is simply:
Code: Select all
OpFunc = PeekI(?PIXELOP_JMPTABLE + OpIndex)
! jmp [p.v_OpFunc]
=
00401045 . BD 00304000 mov ebp, PureBasi.00403000 ;?PIXELOP_JMPTABLE
0040104A . 89EB mov ebx, ebp
0040104C . 031D E8304000 add ebx, dword ptr [4030E8] ;+ OpIndex
00401052 . 53 push ebx
00401053 . E8 F80F0000 call PureBasi.00402050 ;PeekI()
00402050 8B4424 04 mov eax, dword ptr [esp+4]
00402054 8B00 mov eax, dword ptr [eax]
00402056 C2 0400 retn 4
00401058 . A3 E0304000 mov dword ptr [4030E0], eax
0040105D . FF25 E0304000 jmp dword ptr [4030E0]