1. Assembler / Говнокод #6936

    +197

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    ; загрузка из cfg-файла переменной Gravity
    seg011:06CA         fld     [dbl_45A48]   ; 0.2
    seg011:06CF         add     sp, -8
    seg011:06D2         fstp    [bp+var_16]   ; default=0.2
    seg011:06D6         push    ds
    seg011:06D7         mov     ax, offset aGravity
    seg011:06DA         push    ax            ; key="GRAVITY"
    seg011:06DB         wait
    seg011:06DD         push    cs
    seg011:06DE         call    near ptr cfg_ReadDbl
    seg011:06E1         add     sp, 12
    seg011:06E4         fstp    [curGravity]  ; cur=cfg_ReadDbl()
    ; проверка загруженного значения на диапазон [0,05..10,0]
    seg011:06E9         fld     [flt10]
    seg011:06EE         add     sp, -8
    seg011:06F1         fstp    [bp+var_16]   ; max = 10.0
    seg011:06F5         fld     [minGravity]
    seg011:06FA         add     sp, -8
    seg011:06FD         fstp    [bp+var_1E]   ; min = 0.05
    seg011:0701         fld     [curGravity]
    seg011:0706         add     sp, -8
    seg011:0709         fstp    [bp+var_26]   ; cur
    seg011:070D         wait
    seg011:070F         push    cs
    seg011:0710         call    near ptr CheckRangeDbl
    seg011:0713         fstp    st            ; результат нах...
    seg011:0716         add     sp, 24
    <....cut....>
    
    ; double CheckRangeDbl(double cur, double min, double max)
    seg011:0077 proc    CheckRangeDbl far
    seg011:0077 var_2   = word ptr -2
    seg011:0077 @@cur   = qword ptr  6
    seg011:0077 @@min   = qword ptr  0Eh
    seg011:0077 @@max   = qword ptr  16h
    seg011:0077         push    bp
    seg011:0078         mov     bp, sp
    seg011:007A         dec     sp
    seg011:007B         dec     sp
    seg011:007C         fld     [bp+@@cur]
    seg011:0080         fcomp   [bp+@@min]
    seg011:0084         fnstsw  [bp+var_2]
    seg011:0088         wait
    seg011:008A         mov     ax, [bp+var_2]
    seg011:008D         sahf
    seg011:008E         jnb     @@chk_max     ; if (cur < min)
    seg011:0090         fld     [bp+@@min]    ;     st(0) = min
    seg011:0094         jmp     @@exit
    seg011:0096 @@chk_max:                    ; else
    seg011:0096         fld     [bp+@@cur]
    seg011:009A         fcomp   [bp+@@max]
    seg011:009E         fnstsw  [bp+var_2]
    seg011:00A2         wait
    seg011:00A4         mov     ax, [bp+var_2]
    seg011:00A7         sahf
    seg011:00A8         jbe     @@ret_cur     ; if (cur > max)
    seg011:00AA         fld     [bp+@@max]    ;     st(0) = max
    seg011:00AE         jmp     @@exit
    seg011:00B0 @@ret_cur:                    ; else
    seg011:00B0         fld     [bp+@@cur]    ;     st(0) = cur
    seg011:00B4 @@exit:
    seg011:00B4         fst     [bp+@@cur]
    seg011:00B8         wait
    seg011:00BA         mov     sp, bp
    seg011:00BC         pop     bp
    seg011:00BD         retf                  ; return st(0)
    seg011:00BD endp    CheckRangeDbl

    Из старой, очень популярной игрухи (Scorshed Earth). Все как положено, подгружаемые из cfg-файла данные проходят проверку. Только вот результаты проверок (для double, для int и прочих типов) попросту отбрасываются :) Даже не знаю, как такое можно было накодить, на невнимательность непохоже - такого кода довольно много.

    Запостил: DemonId7, 12 Июня 2011

    Комментарии (21) RSS

    • Моя первая игруха *_* А что, сорцы открыли? Или это дизасм?
      Ответить
      • Это как раз с той самой, первой игрухи. В 90-х снимал с нее регистрацию, вынимал алгоритмы, вот и запомнился этот странный код. Сейчас вспомнил и быстренько нашел его в иде (эх, тогда бы такие инструменты!).
        Ответить
    • http://www.scorch2000.com/
      Слева в меню можно выбрать расширение окна игры, удобное для вас.
      Ответить
    • А там дальше по коду, после вызова 'CheckRangeDbl' не делается чтения значения '[bp+var_26]'? А то, если вы обратите внимание, внутри функции 'CheckRangeDbl' по метке '@@exit' финальное значение таки записывается командой 'fst [bp+@@cur]' в параметр 'cur'.

      Я, конечно, понимаю, что с точки зрения языка высокого уровня, 'cur' - это локальная переменная (параметр) функции, которая "снаружи" не видна, но тем не менее на уровне машинного кода возможность "восстановить" результат функции даже после 'fstp st' все-таки существует, ибо этот результат продублирован в '[bp+var_26]'.

      Там у вас не видно, что происходило дальше.
      Ответить
      • Почему не видно? Дальше идет "add sp, 24", исключающее такую версию. Еще дальше новые чтения и "проверки".
        Впрочем, проверить легко. Выставляешь в scorch.cfg некорректные значения (там для каждой переменной в каментах указан допустимый диапазон) и запускаешь игруху. Заходишь в меню и видишь те значения, что были прописаны в файле, хотя, по идее, они должны были бы отсечся.
        ps: уточню, для Scorched Earth Version 1.1, более новую не смотрел, как и 1.0 (а она была такая?)
        Ответить
        • 'add sp, 24' ничего само по себе не исключает. Это с концептуальной точки зрения мы "освободили стек", а практически ничего, разумеется, не поменялось и в '[bp+var_26]' по-прежнему надежно сидит корректное значение. Если бы там дальше шло уничтожение значения 'bp', то тогда можно было бы говорить что "все пропало". А какой-то несчастный 'add sp, 24' - это еще совсем не вечер :)
          Ответить
          • Теоретически Вы конечно правы и даже практически этот трюк применим к некоторым системам, не использующим стэк программы в своих целях. Но, игруха досовская, следовательно все что ниже верхушки стека может быть в любой момент испорчено прерыванием. Запретов прерываний в коде разумеется не наблюдается ;) В общем остается только гадать, как получился такой конфуз. Возможно изначально функция выглядела как:
            void CheckDbl(double *var, double min, double max)
            а уж затем ее коснулась переделка, со всеми вытекающими.
            Ответить
    • <del>
      Ответить
    • поиск порно игры бесплатно играть онлаин для взрослых фамилия трахтенберга настоящая тинто брасс порно фильмы онлайн большие звездные сиськи фото галерея секс со зрелой дамой
      [URL=http://wooden-hause.ru/gruppovuxa/s
      eks-narktiki-i-rok-n-roll.html]бесплатно
      е секс видео из дома 2[/URL] [URL=http://ultants.info/gruppovuxa/porn
      o-v-baku.html]порновидео бесплатно смотреть кунилингус[/URL] [URL=http://blog17.ru/minet/porno-kartin
      ki-anime.html]бесплатное онлайн порно нижнее бельё[/URL]
      сайт знакомств геев и бисексуалов в краснодарском крае кожный отросток на анальном отверстии аниме порно онлайн лучшее
      [URL=http://victoriamoscow.ru/anal/posmo
      tret-besplatno-russkie-pornofilmy.html]б
      есплатное порно-секс видео с предварительным просмотром[/URL]
      частное порно студентов видео секс видео русские бабы порно влагалище клитор
      [URL=http://kirovcenter.ru/molodenkie/ru
      sskoe-porno-u-ginekologa.html]порно бесплатно трусики[/URL] [URL=http://kirovcenter.ru/domashnee-por
      no/smotret-video-seks-festivali.html]сек
      с старухи порно смотреть бесплатно[/URL]
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий