Таки образом выглядит case?

Тема в разделе "WASM.BEGINNERS", создана пользователем Sgor, 13 апр 2008.

  1. Sgor

    Sgor New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2008
    Сообщения:
    1
    Есть такой результат работы иды, в котором я предполагяю находится "case", который в зависимости от значения вызывает CALL1, CALL2, и т.п. Но я не понимаю каким образом он действует.

    Что подскажете?

    Код (Text):
    1. ...
    2. .text:0016AEEE
    3. .text:0016AEEE var_10          = dword ptr -10h
    4. .text:0016AEEE arg_0           = dword ptr  8
    5. .text:0016AEEE arg_8           = word ptr  10h
    6. .text:0016AEEE arg_C           = dword ptr  14h
    7. .text:0016AEEE arg_10          = word ptr  18h
    8. .text:0016AEEE arg_14          = dword ptr  1Ch
    9. .text:0016AEEE
    10. .text:0016AEEE                 push    ebp
    11. .text:0016AEEF                 mov     ebp, esp
    12. .text:0016AEF1                 push    edi
    13. .text:0016AEF2                 push    esi
    14. .text:0016AEF3                 push    ebx
    15. .text:0016AEF4                 push    eax
    16. .text:0016AEF5                 call    sub_11C5D4
    17. .text:0016AEFA                 add     ebx, 0D8CEEh
    18. .text:0016AF00                 mov     esi, [ebp+arg_0]
    19. .text:0016AF03                 mov     ecx, [ebp+arg_C]
    20. .text:0016AF06                 mov     edx, [ebp+arg_14]
    21. .text:0016AF09                 movzx   edi, [ebp+arg_8]
    22. .text:0016AF0D                 movzx   eax, [ebp+arg_10]
    23. .text:0016AF11                 mov     [ebp+var_10], eax
    24. .text:0016AF14                 lea     eax, [edi-1]
    25. .text:0016AF17                 cmp     eax, 22h
    26. .text:0016AF1A                 ja      loc_16AFBF
    27. .text:0016AF20                 mov     eax, [ebx+eax*4-28A18h]
    28. .text:0016AF27                 add     eax, ebx
    29. .text:0016AF29                 jmp     eax
    30. .text:0016AF2B ; ---------------------------------------------------------------------------
    31. .text:0016AF2B                 push    edx
    32. .text:0016AF2C                 push    ecx
    33. .text:0016AF2D                 push    esi
    34. .text:0016AF2E                 call    CALL1
    35. .text:0016AF33                 jmp     short loc_16AFAC
    36. .text:0016AF35 ; ---------------------------------------------------------------------------
    37. .text:0016AF35                 push    edx
    38. .text:0016AF36                 push    ecx
    39. .text:0016AF37                 push    esi
    40. .text:0016AF38                 call    CALL2
    41. .text:0016AF3D                 jmp     short loc_16AFAC
    42. .text:0016AF3F ; ---------------------------------------------------------------------------
    43. .text:0016AF3F                 push    edx
    44. .text:0016AF40                 push    ecx
    45. .text:0016AF41                 push    esi
    46. .... CALL3, ....
    47.  
    48.  
    49. -----
    50. sub_11C5D4      proc near              
    51. .text:0011C5D4                                
    52. .text:0011C5D4                 mov     ebx, [esp+0]
    53. .text:0011C5D7                 retn
    54. .text:0011C5D7 sub_11C5D4      endp
    55.  
    56. -----
    57. .text:0016AFBF loc_16AFBF:                          
    58. .text:0016AFBF                                        
    59. .text:0016AFBF                 xor     eax, eax
    60. .text:0016AFC1                 lea     esp, [ebp-0Ch]
    61. .text:0016AFC4                 pop     ebx
    62. .text:0016AFC5                 pop     esi
    63. .text:0016AFC6                 pop     edi
    64. .text:0016AFC7                 pop     ebp
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    выбор адреса из таблицы. адрес самой таблицы видимо получается здесь:
    По логике это стандартный прием, например, тебе нужно (грубо говоря) сделать кейс на значение A чтобы
    если A==1 то возвращалось 4 из функции,
    если A==2 то возвращалось 536 из функции,
    если A==3 то делалось int3, иначе должно возвращаться 0.
    (к примеру надо такое написать).
    сишный код транслируется в нечто вида
    Код (Text):
    1. ourfunc:
    2.   mov  eax, [A]
    3.   cmp  eax, 3
    4.   ja     ourfunc_quit
    5.  
    6.   jmp  dword [case_table + eax*4]
    7.  
    8. ourfunc_quit:
    9.   xor eax, eax
    10.   retn
    11.  
    12. case_table:
    13.   dd ourfunc_quit       ; A == 0
    14.   dd case2                ; A == 1
    15.   dd case3                ; A == 2
    16.   dd case4                ; A == 3
    17.   ; A > 3 отсеяно командами (cmp eax, 3 / ja ..)
    18.  
    19. case2:
    20.   mov eax, 4
    21.   retn
    22.  
    23. case3:
    24.   mov eax, 536
    25.   retn
    26.  
    27. case4:
    28.   int3
    29.   jmp ourfunc_quit
    то есть составляется таблица адресов веток case для соответствующих значений аргумента.
    если значения не составляют последовательного ряда чисел, тогда используется более сложный код, но принцип тот же