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

    0

    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
    void decode_chunk(const char* s, uint8_t* out)
    {
        __m128i a = _mm_loadu_si128((const __m128i*)s);
    
        __m128i u = _mm_and_si128(a, _mm_set1_epi8(0x74));
        u = _mm_add_epi8(u, _mm_set1_epi8(0x04));
        u = _mm_srli_epi32(u, 0x03);
        u = _mm_and_si128(u, _mm_set1_epi8(0x0F));
        u = _mm_shuffle_epi8(_mm_set_epi32(0xB9B9B9B9, 0xBFBFBFBF, 0x04041013, 0x00000000), u);
        a = _mm_add_epi8(a, u);
    
        __m128i m1 = _mm_set1_epi32(0xFF00FF00);
        __m128i m2 = _mm_set1_epi32(0xFFFF0000);
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m1, a), 2), _mm_andnot_si128(m1, a));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m2, a), 4), _mm_andnot_si128(m2, a));
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x80808080, 0x00010204, 0x05060809, 0x0A0C0D0E));
    
        _mm_storeu_si128((__m128i*)out, a);
    }

    Байтоёбский парсинг base64 (16 символов → 12 байт).

    По мотивам http://govnokod.ru/12822#comment173404

    Запостил: bormand, 09 Января 2019

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

    • ideone, к сожалению, не может в SSE3 :(
      Ответить
    • Я двинусь, если продолжу разбирать всякие _mm_shuffle_epi8 вручную. Надо изобрести кокококонпелятор из этих инструкций в человекочитаемый код.
      Ответить
      • В человекочитаемый код на J. Как раз векторная хуита.
        Ответить
        • И главное, что как в случае с кодом с SSE-интринсинками (правильно хоть написал это страшное слово?), так и в случае кода на "J" можно не бояться утечки исходников: всё равно никто ничего не поймёт. Даже сам автор спустя несколько недель.
          Ответить
          • вот кстати да: пиши лучше на асемблере сразу
            Ответить
            • У этих инструкций ещё более ёбнутые мнемоники чем названия соответствующих им интринсиков... Там можно ктулху призвать этими vpunpckiddqd.
              Ответить
              • а давай сделаем coffeasm по аналогии с coffescript?
                пусть будет язык с ВНЯТНЫМИ мнемониками который транслируется в асм.

                напишем LSP для него чтобы комплишен был
                Ответить
                • В принципе, в гцц есть attribute vector_size. Но он как-то совсем непредсказуемо работает. То высрет портянку из анролльной копипасты то одну инструкцию. Хотя код почти одинаковый и если что-нибудь переставить иногда в правильные инструкции превращается...
                  Ответить
                  • "coffeasm
                    Что-то мне подсказывать, что кофе надо было пить ни до, ни после, а вместо.
                    Сечёшь, пидар?
                    Ответить
              • > можно ктулху призвать
                Я только за.
                Ответить
          • > никто ничего не поймёт
            Не надо рассуждать о читаемости кода на языке, которого не знаешь.
            Ответить
        • Я только за, может быть, я тогда бы понял хоть что нибудь...
          Ответить
    • Вчера ты сувал пидарасам рыболовные крючки в жпа, а тебе бы свой вынуть.
      Ебанавт.
      Ответить
      • Как он его вынет? Он же там с какими-то зазубринками. Пусть будет как пирсниг.
        Ответить
    • раскажите мне тупому как процессор знает есть у него SSE или нет. и что будет прогай когда он это г-но запустит?
      Ответить
      • Старые процы не знают про SSE. На них сработает прерывание invalid opcode и ось убьёт прогу. Это работает для любой другой неизвестной инструкции, не только для SSE.
        Ответить
        • Если я помню, что на x86 номер этого исключения 6, то я нормальный?
          Ответить
          • ты ёбнутый, как и я, я тоже помню что для софтодебага прерывание 3
            Ответить
            • Для него ещё был отдельный однобайтовый опкод CC (да, как муха) вместо двухбайтового CD 03.

              Чорт! Проговорился.
              Ответить
              • РКГ, ты?
                Ответить
              • Ну int 3 аля 0xCC многие помнят. А вот остальные исключения - х.з.
                Ответить
                • некоторые даже забывают чем fault отличается от trap и abort.

                  хотя что это я
                  прерывание не исключение
                  Ответить
                  • Да, к исключению приводят определённые действия самого процессора, а к прерыванию может приводить какой-то внешний сигнал.

                    Вот деление на ноль –— это исключение. Оно детерминировано: каждый раз, когда мы пытаемся делить на ноль (или когда при делении возникает переполнение), срабатывает исключение. С другой стороны, само по себе оно сработать не может.

                    А вот событие нажатия на клавишу —– это прерывание. Мы заранее не можем предугадать, в какой момент времени юзер нажмёт клавишу.
                    Ответить
                  • Дык это знание полезно разве что в обработчике page fault да отладочных прерываниях. В остальных случаях всем похуй trap там или futa.
                    Ответить
                • INTO ещё есть: вызвать прерывание (исключение?), если флаг переполнения (OF) установлен. Кстати, очередная инструкция с предикатом (помимо CMOV).
                  Ответить
                  • The INTO instruction cannot be used in 64-bit mode.
                    Ответить
                    • В нём даже инструкцию с безобидным названием POPA юзать нельзя.
                      Ответить
                      • Я помню были такие Пуша и Попа
                        Когда пишешь функцию на асме надо сначала вызвать Пуша а в конце Попа.
                        Чтобы регистры не засрать случайно
                        Ответить
                        • Кажется, был мультик такой. А нет, вспомнил, был мультик «Тяпа и Ляпа».

                          Офигеть, его выложили в «Ютуб». Надо будет пересмотреть.
                          Ответить
                  • да там пиздец с терминологией.
                    Я предпочитаю такую: прерывание есть любая ситуация при которой процессор срет на следующую инструкцию и тушканчиком бежит в таблицу прерываний искать куда бы прыгнуть.

                    Прерывания могут прийти в виде сообщения через APIC от железа (MSI по PCI Express например) или от другого процессора (IPI, например чтобы запустить второй проц).
                    Могут быть результатом вызова инструкции INT.

                    А бывают так-же прерывания-исключения. Они случаются по желанию CPU, а не от внешних событий и не от их явного (как в случае INT) вызова.

                    Из бывает три сорта:

                    Fault: CPU возвращает IP назад, считая что обраточик прервания исправит сиутацию и попробует снова. Пример: Page Fault.

                    Trap: CPU не возврвращает IP назад, считая что исправлять ничего не надо. Либо все нормально, просто обработчику интересно что-то там почитать, либо все так плохо что программу уже не спасти. Первый случай это debug (через регистр например, хотя вероятно и через int 3 тоже). второй это overflow.

                    Abort: пиздец, хуйня, говно, надо перезагружаться. Пример: machine check, double fault (исключение из обработчика исключений)
                    Ответить
            • hex
              0 —– позовут при лелении на ноль
              3 –— беркпонт
              5 —– принт скрин/бонд
              9 —– что-то связанное с клавиатурой (помоему, зовётся при ножатии клавешы)
              10 –— видио хуйня
              13 —– раьота с письками
              16 –— получить код ножатой клавешы(ah = 0)/узнать, ножата ли клавеша и т.п.
              20 —– выдох из программы
              21(22,23,...? я ими не пользовался, но помоему есть) —– функции дос
              29 –— вывести символ в al на ыкран
              33 —– мыш (ax=0,1,2,3 —– инициалищация, показать, скрыть, получить сосояние)
              40 —– сиськи оли в КолибриОС(?)
              80 –— лунтикс

              Насколько я ёбнутый?
              Ответить
              • нормальный

                Если бы ты еще сказал

                46 -- пиньдуос


                вот тогда бы я испугался
                Ответить
              • Наглухо.

                0, 3, 5 –— энто исключения (тут вроде понятно, почему).

                9 наглухо привязано к IRQ1 –— это прерывание (к IRQ0...IRQ7 привязаны соответственно INT 8... INT 0F). IRQ с большими номерами засунуты в какую-то жопу (что-то типа INT 70h, уже точно не помню).

                То, что выше 0Fh –— это программные прерывания.

                Кстати, функция ah=0 у INT 16h не работала с клавишами F11, F12 и прочими, которых нет на IBM XT. Для полноценной работы с клавиатурой нужно было звать ah=10h.

                Сейчас ещё что-нибудь вспомню...
                INT 31h –— DPMI. Это чтобы выделять память из программ зощищённого режима.

                INT 28h —– фоновое прерывание для кооперативной многозадачности.

                INT 15h –— функции PS/2, которые позже были задействованы в рахит-тинктуре ATX.
                Ответить
                • > в какую-то жопу
                  Куда ремапнешь там и будут.
                  Ответить
                • напомню, что второе ерывание было зашкварено вторым 8259 после появления каскада в XT
                  Ответить
                  • Точно! Его напрямую нельзя было использовать именно по этой причине.

                    На текущий момент ты здесь самый ебанутый.
                    Ответить
                    • я просто в децтве успел поговнокодить под дос, и там все эти железки с их интерфейсами были так же естественны, как HTTP коды для современных программистов

                      думаю что пни уже имели APIC, но дос его в режим A конечно не переключал, так что он мумулировал обычный PIC
                      Ответить
                      • Интересно, закончится ли эта питушня?

                        В библиотеках можно всё замазать константами, в JS - и вовсе в клиентский код не допускать чисел:
                        var ERROR = {FILE_NOT_FOUND: {}}; // старые версии
                        const ERROR = {FILE_NOT_FOUND: Symbol('file not found')}; // ES2016+


                        ASCII-коды наверно останутся как последняя питушня, которую скорее всего так просто от программиста не скроешь. Как минимум, на клавиатуре через Alt набирать придётся.

                        А придумают ли что-то новое для задротов, чтобы числа запоминали?
                        Ответить
                        • в новых протах ее конечно нет, там числа заменят константами. но с хттп-то уже ничо не сделаешь

                          тем более что 404, напрмиер, стала уже нарицательной
                          Ответить
                • Выделил память тебе за щеку. Проверь.
                  Ответить
      • "Процессор" ничего не знает, он просто исполняет инструкции и течёт. Именно поэтому я за "процессор".
        Ответить
        • Поэтому я за "С++".
          Ответить
        • Я люблю внутренние баги железа. По мне - так там всё вообще держится на теории вероятностей.
          Ответить
          • Да не. Туда просто рукожопов не допускают.
            Ответить
            • Но как тогда объяснить Meltdown?
              Ответить
              • А это не баг. Это побочный эффект.

                Формально процессор всё правильно делает: результат недопустимого обращения к памяти зарубает. А что там в кеше остается (и влияет на скорость это другой вопрос
                Ответить
              • Это не баг железа, это скорее логический баг. Ну не подумали, что спекулятивное исполнение может дать возможность читать чужую память.
                Ответить
                • > не подумали
                  А может и подумали, но пирфоманс на тот момент показался важнее...
                  Ответить
                  • Спекулятивное исполнение реально прибавляет скорости, да. Скорее не подумали.
                    Ответить
                  • ну никто не подумал о сайд эффекте от кеша же

                    Это же как вентилятор из линолиума: нормальный человек не додумается
                    Ответить
      • Есть декодер опкодов. Во что он кстати их декодирует?
        Ответить
        • В микрокод?
          Ответить
          • Кстати, а можно ли писать программы в микрокоде? Не люблю много уровней обструкции, чувствую себя каким-то BblcoKoypoBHeBblM_nemyxoM.
            Ответить
            • Маловероятно.

              Сделай свой проц с микрокодом и пиши на нём. Хотя, если ты можешь делать проц, то нафиг тебе микрокод? Лишняя абстракция.
              Ответить
              • Меня интересуют широко распространённые рахитектуры, типа x86. Интересно, если бы можно было, были ли бы какие-нибудь возможности которых не было бы для простой программы, или просто бы получилось непереносимое говно?
                Ответить
                • Была статья, где микрокод древнего АМД реверсили (К6 кажется), когда ещё не было всех этих подписей и шифрований. Добудь себе такой да поиграйся.

                  Но мне кажется, что ничего принципиально нового там не запилить. Разве что какую-то более эффективную инструкцию удастся сложить из кусков других.
                  Ответить
                  • Нашёл про K8:
                    https://securiteam.com/securityreviews/5FP0M1PDFO/

                    > ничего принципиально нового там не запилить
                    Ну почему? Вот, например, установка хука на ассемблерную инструкцию из "JavaScript":
                    https://hsto.org/r/w390/webt/gx/af/w9/gxafw9lfzweuvhrirvuwf_qfbu0.png
                    (Лол, это реально работало? Какой багор))))
                    Ответить
                    • Нет, я напиздел, это только вызов хука.
                      Картинка отсюда: https://m.habr.com/ru/post/427757/

                      А источник:
                      Philipp Koppe. Reverse Engineering x86 Processor Microcode // Proceedings of the 26th USENIX Security Symposium. 2017. pp. 1163-1180.

                      Надо бы читнуть.

                      ЗЫ. что значт "use asm"?
                      Ответить
                      • Заманчива реализация интерпретатора шитого кода в мокрокоде. Только вот эти все подписи мешают. Заебли со своей безопасностью. Вот в "DOS" на 8086 не было никакой безопасности. Именно поэтому я за "DOS".
                        Ответить
                        • > шитого кода
                          Сделай себе проц, который напрямую исполняет шитый код. Вроде ничего сложного, если под FPGA.
                          Ответить
                      • > что значт "use asm"?
                        Какое-то говно, накостыленное поверх js.
                        Ответить
                        • use это способ подключения модуля в перле

                          use asm -- использовать ассемблер

                          в паскале был uses.

                          например uses crt: использовать ЭЛТ монитор
                          Ответить
                    • >> Поэтому Intel и AMD стали строить свои процессоры с применением технологии микрокодов. Intel – начиная с Pentium Pro (P6), выпущенного в 1995 году. AMD – начиная с K7, выпущенного в 1999 году.

                      Значит, я не ошибся. В «K6» никакого микрокода нет, именно поэтому я за «K6».
                      Ответить
                  • В те времена, когда для P6 (Pentium Pro и Pentium II) уже выходили обновления мокрокода, владельцы AMD K6 про мокрокод ничего не слышали.

                    На AMD первые обновлялки появились позже. Для K7?
                    Ответить
            • Можно конечно. Напиши свой микрокод в котором будет одна инструкция: 0x2131234 (опкод PLAYWOLF3D), вот правда API для заливки там не документированное

              и учти что микрокод плохо переносим между архитектурами. То-есть под coffelake и haswell придется писать разные программы
              Ответить
              • Ещё там очень мало места под патч для микрокода. А сам микрокод намертво зашит в проц.
                Ответить
              • > API для заливки там не документированное
                Вполне документированное, проверь. Все операционки его юзают.

                А вот формат самого блоба - да, не документирован.
                Ответить
                • я говёно выразился. Ты прав: операционки и фирмвари умеют обновлять микрокод (правда мне кажетчся то винда это не делает -- только linux, у винды обновля через фирмваре) но я про формат конечно
                  Ответить

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