Ищу специфичускую реализацию switch

Тема в разделе "LANGS.C", создана пользователем NoName, 16 апр 2008.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Нужно чтобы вместо таблицы переходов (см. пример ниже) т.е. данных в коде, был код. Поэтому ищется компилятор си или опция сборки у более известных чтобы было так как надо.

    Код (Text):
    1. ; 39   :     switch(ErrCode) {
    2.  
    3.   00066 8b 55 08     mov     edx, DWORD PTR _ErrCode$[ebp]
    4.   00069 89 55 f8     mov     DWORD PTR -8+[ebp], edx
    5.   0006c 8b 45 f8     mov     eax, DWORD PTR -8+[ebp]
    6.   0006f 83 e8 01     sub     eax, 1
    7.   00072 89 45 f8     mov     DWORD PTR -8+[ebp], eax
    8.   00075 83 7d f8 0a  cmp     DWORD PTR -8+[ebp], 10 ; 0000000aH
    9.   00079 0f 87 00 01 00
    10.     00       ja  $L302
    11.   0007f 8b 4d f8     mov     ecx, DWORD PTR -8+[ebp]
    12.   00082 ff 24 8d 00 00
    13.     00 00        jmp     DWORD PTR $L490[ecx*4]
    14. $L280:
    15.  
    16. ; 40   :     case PSK_EVENT_MP_ERR:
    17.  
    18. ...
    19.  
    20. $L490:
    21.   001ab 00 00 00 00  DD  $L280
    22.   001af 00 00 00 00  DD  $L282
    23.   001b3 00 00 00 00  DD  $L284
    24.   001b7 00 00 00 00  DD  $L286
    25.   001bb 00 00 00 00  DD  $L288
    26.   001bf 00 00 00 00  DD  $L290
    27.   001c3 00 00 00 00  DD  $L292
    28.   001c7 00 00 00 00  DD  $L294
    29.   001cb 00 00 00 00  DD  $L296
    30.   001cf 00 00 00 00  DD  $L298
    31.   001d3 00 00 00 00  DD  $L300
    или

    Код (Text):
    1.    ;        switch(ErrCode) {
    2.    ;   
    3.     mov       eax,dword ptr [ebp+8]
    4.     cmp       eax,11
    5.     ja  @3
    6.     jmp       dword ptr [@16+4*eax]
    7. @16:
    8.     dd  @3
    9.     dd  @15
    10.     dd  @14
    11.     dd  @13
    12.     dd  @12
    13.     dd  @11
    14.     dd  @10
    15.     dd  @9
    16.     dd  @8
    17.     dd  @7
    18.     dd  @6
    19.     dd  @5
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Т.е. тебе нужен базонезависимый switch? Попробуй gcc с ключом -fpic. А так самый верный вариант - заменить на набор if'ов.
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    нужно чтобы работал свитч. Есть какие-нибудь варианты кроме gcc?
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    попробовал gcc:
    "cc1: warning: -fpic ignored for target (all code is position independent)"
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Код (Text):
    1.     cmpl $10,%eax
    2.     ja L16
    3.     movl L17(,%eax,4),%eax
    4.     jmp *%eax
    5.     .p2align 4,,7
    6. L17:
    7.     .long L5
    8.     .long L6
    9.     .long L7
    10.     .long L8
    11.     .long L9
    12.     .long L10
    13.     .long L11
    14.     .long L12
    15.     .long L13
    16.     .long L14
    17.     .long L15
    18.     .p2align 4,,7
    19. L5:
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Как вариант - вынести в отдельный С файл и скомпилировать любимым компилятором с полностью отключённой оптимизацией.
    В большинстве случаев помогает.
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    нет непомогает
     
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Ну что можно посоветовать... Разве что взять cparse, и из существующих примеров к ней сделать свой компилятор.
     
  9. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Не пойму я при чем тут С - все примеры на асме. Любой С (VC,OWC,gcc) делает базонезависимые ехе-шники с помощью релоков. Если это вирь, то в принципе можно поправить релоки тоже. Если возможен асм, то класика жанра:
    Код (Text):
    1.    org 0
    2. .data
    3. oT dd offset o0,
    4.          offset o1,
    5.          ...,
    6.          offset oN
    7.  
    8. .code
    9.    ...
    10.    call @0
    11. @0:
    12.    pop ebx
    13.    sub ebx,@0
    14.    ...
    15.    mov eax,dword ptr [ebp+8]  ; switch value
    16.    cmp eax,N+1
    17.    jnc oDefault
    18.    lea eax,[ebx+oT+4*eax]
    19.    mov eax,dword ptr [eax]
    20.    add eax,ebx
    21.    jmp eax
    22.    ...
    23. o0:
    24.    ...
    25. o1:
    26.    ...
    27. oN:
    28.    ...
    29. oDefault:
    30.    ...
    Тут возможны ошибки я не проверял и код можно улучшить, но направление дано верно, постоянно этим пользуюсь.
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    NoName
    gcc -fno-jump-tables
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    green
    оказывается не все версии компиляторов gnu это поддерживают
     
  12. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    NoName
    At least gcc 4.2.x certainly supports it.