1. Си / Говнокод #8295

    +145

    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
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    int nSymb;
    char pCh[32];
    char tbldec[] = "0123456789000000";
    char tblhex[] = "0123456789ABCDEF";
    
    void MyDWtoStr(DWORD dw)
    {
      __asm
      {
        mov eax,dw
        test eax,eax
        jnz short lab1
        mov esi,1//esi = nSymb = 1
        mov byte ptr [pCh],30h
        jmp short lab2
    lab1:
        mov ebx,eax
        mov ecx,eax//eax = ebx = ecx = dw
        xor esi,esi//esi = nSymb = 0
    lab4:
        mov eax,ecx//eax=ecx=b
        mov ebx,0Ah//ebx=10
        xor edx,edx
        div ebx
        mov ebx,edx//ebx=a=b%10
        mov al,[tbldec+ebx]
        mov [pCh+esi],al//pCh[nSymb]=tbldec[a]
        inc esi//nSymb++
        mov eax,ecx
        sub eax,ebx//eax=b-a
        mov ecx,0Ah
        xor edx,edx
        div ecx
        mov ecx,eax//ecx=b=(b - a)/10;
        test ecx,ecx
        jnz short lab4
    
        mov eax,esi
        dec eax//eax = i = nSymb-1
        jmp short lab5
    lab6:
        mov edx,esi//edx = nSymb
        sub edx,eax//edx = nSymb-i
        mov bl,[edx+pCh-1]//bl = pCh[nSymb-i-1];
        mov cl,[eax+pCh]
        mov [edx+pCh-1],cl//pCh[nSymb-i-1]=pCh[i];
        mov [eax+pCh],bl//pCh[i]=pCh[nSymb];
        dec eax
    lab5:
        mov ecx,eax
        shl ecx,1//add ecx,ecx
        cmp ecx,esi
        jge short lab6
    lab2:
        mov dword ptr [nSymb],esi
        mov byte ptr [esi+pCh],0
      }
    }
    
    DWORD MyStrtoDW(char *pch)
    {
      DWORD a;
      __asm
      {
        mov edi,pch
        xor eax,eax//eax = a
        xor esi,esi//esi = i
        mov ecx,10
        jmp short lab2
    lab1:
        mul ecx
        and ebx,0FFh
        sub ebx,48
        add eax,ebx
        inc esi
    lab2:
        mov bl,byte ptr [edi+esi]
        test bl,bl
        jnz short lab1
        mov a,eax
      }
      return a;
    }

    >Хочу представить вашему вниманию очень быстрые функции для преобразований DWORD <---> char [].

    http://www.gamedev.ru/flame/forum/?id=153979

    Запостил: AnimeGovno-_-, 25 Октября 2011

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

    • 1. не все регистры можно просто так поганить, не сохраняя.
      2. далеко не оптимально: результат надо возвращать в eax.
      3. глобальные переменные - не гуд, не потоко-безопасно
      4. tbldec - лишние обращения к памяти.
      5. в 1 итерации достаточно 1 операции div.
      6. строка 77 + строка 72: movzx ebx, byte ptr [edi + esi]
      кстати в процедуре esi вообще не нужен, достаточно edi.
      проще не исправлять, а переписать заново.
      Впечатление такое: сначала написали код на С, потом скомпилировали без оптимизации, потом дизассемблировали и заменили С-код не задумываясь.
      Ответить
      • >1. не все регистры можно просто так поганить, не сохраняя.
        Не заметил этого говна. Какие именно регистры нельзя? Вроде это не дельфи, где почти все регистры нужно сохранять.
        Ответить
        • в дельфи можно не сохранять только eax, edx, ecx.
          за все С++ - компиляторы сказать не могу - не в курсе:(
          где-то читал что в Visual C++ нужно сохранять EBX, ESI, EDI, EBP - получается те же...
          Ответить
          • зависит от calling convention
            Ответить
          • >нужно сохранять EBX, ESI, EDI, EBP
            С испорченым EBP - не сможешь обращаться к локальным переменным функции впринципи.
            А остальные сохранять то зачем?
            Ответить
            • так в документации написано - нет смысла ей не верить
              Ответить
    • помимо не сохранения трех обязательных регистров esi edi ebx
      вот так писать
      mov edi,pch
      тоже нельзя если функция не объявлена как __declspec(naked) оптимизатор изменит на вызов где какие то параметры пойдут через стек какие то через регистры а функция внутри будет ссылаться на несуществующие переменные говорю по собственому опыту напарывался уже надо как минимум ставить
      __declspec(naked) если на аргуметы ссылаешся
      Ответить
    • показать все, что скрытоКодец, НЯ-НЯ-НЯ-НЯШКА - просто таки, автору респект. А вы все завидете - потому что для вас всех мир проца - это страшное потустороннее измерение.
      Ответить
      • > страшное потустороннее измерение
        triple "ХA!"
        писал я на ассемблере, тоска смертная
        Люблю языки, в которых можно делать многое небольшим количеством кода
        Ответить
        • А ты дизасемблируй 10 строк делфей или подобной ереси - увидеш какую простынь комманд делает проц.
          Ответить
          • Я готов пойти на увеличение времени выполнения программы в 1.5-2 раза, если она будет в сто раз короче. По-моему, ассемблер реально нужен только в очень критических местах (~0.1% от общего кода?) специфического софта типа ОС (~1% от всего софта?).
            В ассемблере нет ничего сложного, просто нужно хорошенько думать, что делаешь.
            Часто убеждаюсь, что правильно выбранный алгоритм гораздо важнее языка, на котором он реализован.
            Ответить
            • >>В ассемблере нет ничего сложного, просто нужно хорошенько думать, что делаешь.

              О да, скажи это людям на моей работе которых от одного вида асма просто в дебагере ввергало в дрожь. И говорят ересь типа прога падает на cmp, а то что после идет скачек в неведомы ебеня, так им незнать.
              Ответить
              • Набрали непросвещённых - ваши проблемы, отчего сразу
                > для вас всех мир проца - это страшное потустороннее измерение
                По мне так в CL или Haskell въехать посложнее будет, чем в ASM
                Ответить
                • >По мне так в CL или Haskell въехать посложнее будет, чем в ASM
                  Конечно, пороги вхождения разные.
                  Ответить
            • специфического софта типа ОС (~1% от всего софта?)

              Под современные ОС написано значительно больше 100 программ.
              Ответить
              • Осей уж больно много развелось :)
                ок, понижаем до 0.1%
                Ответить
              • А вы меряете по програмным наименованиям или обьемам кода? Веддь если просумировать исходниики всех програм у меня на компе и сопоставить с сорцами оси - не Факт что сорци оси составят 1%.
                Ответить
                • Сорцы Linux 2.6.35: ~13,5 млн SLOC
                  http://en.wikipedia.org/wiki/Source_lines_of_code
                  Сорцы Debian: 324 млн SLOC (видимо, вместо с базовым набором ПО, там же)
                  Сорцы Windows XP: 50 млн SLOC (там же)
                  Сорцы Eclipse 3.7: ~46 млн SLOC http://www.eclipse.org/community/news/eclipseinthenews.php
                  Один только eclipse весит примерно как ОС, а это лишь одна из огромного числа существующих прикладных программ.
                  Ответить
                  • eclipse classic? а еще там допупа всяких плагинов
                    Ответить
                  • это напоминает мне сайтик с говорящим названием охлох, там пошли еще дальше и высчитывают сколько денег оказалось просрано из-за опен-сорца
                    Ответить
                  • Э-э-э. А как же сорцы всяких быдлоCMS, говносайтов и прочих ынтыпрайз высеров.
                    Ответить
          • да-да, оне проста зовидуют
            Ответить
      • какой тут респект?! код написан коряво - 100% говнокод.
        Ответить

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