Нужно чтобы вместо таблицы переходов (см. пример ниже) т.е. данных в коде, был код. Поэтому ищется компилятор си или опция сборки у более известных чтобы было так как надо. Код (Text): ; 39 : switch(ErrCode) { 00066 8b 55 08 mov edx, DWORD PTR _ErrCode$[ebp] 00069 89 55 f8 mov DWORD PTR -8+[ebp], edx 0006c 8b 45 f8 mov eax, DWORD PTR -8+[ebp] 0006f 83 e8 01 sub eax, 1 00072 89 45 f8 mov DWORD PTR -8+[ebp], eax 00075 83 7d f8 0a cmp DWORD PTR -8+[ebp], 10 ; 0000000aH 00079 0f 87 00 01 00 00 ja $L302 0007f 8b 4d f8 mov ecx, DWORD PTR -8+[ebp] 00082 ff 24 8d 00 00 00 00 jmp DWORD PTR $L490[ecx*4] $L280: ; 40 : case PSK_EVENT_MP_ERR: ... $L490: 001ab 00 00 00 00 DD $L280 001af 00 00 00 00 DD $L282 001b3 00 00 00 00 DD $L284 001b7 00 00 00 00 DD $L286 001bb 00 00 00 00 DD $L288 001bf 00 00 00 00 DD $L290 001c3 00 00 00 00 DD $L292 001c7 00 00 00 00 DD $L294 001cb 00 00 00 00 DD $L296 001cf 00 00 00 00 DD $L298 001d3 00 00 00 00 DD $L300 или Код (Text): ; switch(ErrCode) { ; mov eax,dword ptr [ebp+8] cmp eax,11 ja @3 jmp dword ptr [@16+4*eax] @16: dd @3 dd @15 dd @14 dd @13 dd @12 dd @11 dd @10 dd @9 dd @8 dd @7 dd @6 dd @5
Т.е. тебе нужен базонезависимый switch? Попробуй gcc с ключом -fpic. А так самый верный вариант - заменить на набор if'ов.
Код (Text): cmpl $10,%eax ja L16 movl L17(,%eax,4),%eax jmp *%eax .p2align 4,,7 L17: .long L5 .long L6 .long L7 .long L8 .long L9 .long L10 .long L11 .long L12 .long L13 .long L14 .long L15 .p2align 4,,7 L5:
Как вариант - вынести в отдельный С файл и скомпилировать любимым компилятором с полностью отключённой оптимизацией. В большинстве случаев помогает.
Ну что можно посоветовать... Разве что взять cparse, и из существующих примеров к ней сделать свой компилятор.
Не пойму я при чем тут С - все примеры на асме. Любой С (VC,OWC,gcc) делает базонезависимые ехе-шники с помощью релоков. Если это вирь, то в принципе можно поправить релоки тоже. Если возможен асм, то класика жанра: Код (Text): org 0 .data oT dd offset o0, offset o1, ..., offset oN .code ... call @0 @0: pop ebx sub ebx,@0 ... mov eax,dword ptr [ebp+8] ; switch value cmp eax,N+1 jnc oDefault lea eax,[ebx+oT+4*eax] mov eax,dword ptr [eax] add eax,ebx jmp eax ... o0: ... o1: ... oN: ... oDefault: ... Тут возможны ошибки я не проверял и код можно улучшить, но направление дано верно, постоянно этим пользуюсь.