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

    Комментарии (85) 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, у винды обновля через фирмваре) но я про формат конечно
                  Ответить
    • https://govnokod.ru/26076
      Ответить
    • Последний раз bormand говнокодил 9 Января 2019. Больше года прошло.
      Ответить
      • HanoMuHal0LLLuu_nemyx
        Ответить
      • Он даже не программист
        Ответить
        • Он даже не является членом ополчения!
          Ответить
          • Дальше вы не программист пока не получите бумаги.
            Ответить
        • А кто? Админ?
          Ответить
          • Стой, чужеземец. Я - Лотар. Программист короля ... *Как я могу получить программы, как у тебя?* ... Что-о? Я сочту это оскорблением. Ты даже не являешься переменной окружения. Ты даже ... Не программист ... ты не методист. Даже ... *атеист* ... Не программист ... Не программист ... Ты не программист ... Даже ... *онанист* ... Не программист! *Хорошо, объясни мне, как я могу стать программистом этого сервера?* Программистом может считаться тот, кто суппортит постоянный продакшн. Сюда стали пускать отбросы общества, вроде тебя. Невероятно! Такого не случалось уже долгие века! Наш менеджер, лорд Хаген, велел мне объяснять новоприбывшим новые законы. *Где я могу найти лорда Хагена? Этому серверу угрожают XSS-ы* Ха-ха-хаха-ха ... XSS-ы? Ты даже сам в это не веришь! Это не может быть правдой! В это трудно поверить. Если я еще хоть раз услышу, что ты рассказываешь людям об XSS-ах, у тебя будут проблемы! Тебе всё ясно? В Хоринисе ты можешь чувствовать себя в безопас... *Но я должен увидиться с лордом Хагеном* Ты вообще слушаешь меня? *Я пришёл, чтобы изучить путь линукса!* Я предупреждаю тебя! Не программист ... ты не методист. Даже ... Лорд Андре ... Не программист ... Не программист ... Ты не программист ... Даже ... Лорд Хаген ... Не программист! *Как мне зайти на сервер под рутом?* Достаёт тяжелую клавиатуру
            Ответить

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