1. C++ / Говнокод #26041

    +2

    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
    case Type::Instruction:
            {
              if (o == "movzwl") return OpCode::movzwl;
              if (o == "movzbl") return OpCode::movzbl;
              if (o == "shrb") return OpCode::shrb;
              if (o == "shrl") return OpCode::shrl;
              if (o == "xorl") return OpCode::xorl;
              if (o == "andl") return OpCode::andl;
              if (o == "ret") return OpCode::ret;
              if (o == "movb") return OpCode::movb;
              if (o == "cmpb") return OpCode::cmpb;
              if (o == "movl") return OpCode::movl;
              if (o == "jmp") return OpCode::jmp;
              if (o == "testb") return OpCode::testb;
              if (o == "incl") return OpCode::incl;
              if (o == "sarl") return OpCode::sarl;
              if (o == "decl") return OpCode::decl;
              if (o == "jne") return OpCode::jne;
              if (o == "je") return OpCode::je;
              if (o == "js") return OpCode::js;
              if (o == "subl") return OpCode::subl;
              if (o == "subb") return OpCode::subb;
              if (o == "addl") return OpCode::addl;
              if (o == "addb") return OpCode::addb;
              if (o == "sall") return OpCode::sall;
              if (o == "orl") return OpCode::orl;
              if (o == "andb") return OpCode::andb;
              if (o == "orb") return OpCode::orb;
              if (o == "decb") return OpCode::decb;
              if (o == "incb") return OpCode::incb;
              if (o == "rep") return OpCode::rep;
              if (o == "notb") return OpCode::notb;
              if (o == "negb") return OpCode::negb;
              if (o == "sbbb") return OpCode::sbbb;
              if (o == "pushl") return OpCode::pushl;
              if (o == "retl") return OpCode::retl;
            }

    Фрагмент транслятора из ассемблера в ассемблер.

    https://github.com/lefticus/x86-to-6502

    Запостил: XYPO3BO3, 24 Ноября 2019

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

    • SEO-пост.

      #8086 #6502 #ассемблер #C++ #извращения
      Ответить
    • Ахахах, чувак не знает про std::map, но
      > requires a full C++14 compiler

      Какой багор )))
      Ответить
      • Хотел спросить, где там C++14, но уже нашёл:
        use of 'auto' in lambda parameter declaration only available with -std=c++14 or -std=gnu++14


        Только ради auto в параметрах лямбд и требуется C++14. Хотя тут автору известно, какого типа должен быть параметр:
        [ text ](auto &ins){ 
                      
                      ins.comment = text; 
                    }
        Если он следующей строкой пишет «ins.comment», значит, знает, что у параметра ins должно быть как минимум поле comment.
        Ответить
        • > Хотел спросить, где там C++14

          А надо было стараться вписаться в минимально возможную версию C++?
          Ответить
          • Никак нет. Но если есть вопрос «Где тут C++?», то почему бы не быть вопросу, где тут C++14.
            Ответить
      • >std::map,
        так пифоманс жи?
        Ответить
        • А кстати, в std::map кокококой поиск? Двоичный? То есть каждый ключ находится в карте примерно за одинаковое время, так? А тут автор сам может отсортировать ключи, чтобы наиболее вероятные опрашивать в первую очередь и находить быстрее, а самые редкие ключи можно засунуть в самый конец.

          Всё так?
          Ответить
          • Search, removal, and insertion operations have logarithmic complexity. Maps are usually implemented as red-black trees.
            Ответить
          • Я бы структуру "Trie" использовал, это будет быстрее map. Поиск за длину строки.
            Ответить
            • Почем ты знаешь, что там в качестве ключа? Вдруг там шагизагиги?
              а, ты про именно этот кейс
              тогда ок
              Ответить
            • А я вот вижу, что тут кое-какая ценная инфа проебывается

              допустим, мы посчитали
              >o == "movzwl"
              и узнали, что movz совпадает, а wl -- нет

              а потом мы
              >o == "movzbl"
              и тут мы СНОВА проверяем "mov".

              Почему не сделать нормальный автомат чтобы 2 раза одно и тоже не считаьть?!
              Ответить
              • Ну вот трие это учтёт.
                Ответить
                • Да любое дерево учтет тащемто например, нет рази?
                  Ответить
                  • map не учтёт, он вообще не знает, что в него строку засунули
                    Ответить
                    • Я ХЗ как у вам в плюсах мап реализован. Он берет хеш от строки, и кладет по нему в веткочки что-ли?

                      Тогда ты прав, не учтет.
                      Ответить
                      • Красно-чёрное дерево использует только operator<. Никакого хеша нет.
                        Ответить
                        • А как этот оператор реализован для string: лексикографической сортировкой?
                          Все равно отстой конечно, нужно или автомат делать, либо правда префиксное.

                          Сложно всё. Не даром Сёма говорит, что алгоритмы знать не нужно
                          Ответить
                          • Пэхапэшники не знают, как в их языке устроен ассоциативный массив, и текут.
                            Ответить
                            • Есть мнение, что кроме крестоблядей про такие вещи вообще редко кто думает. Ах, всё это байтоёбство, зачем она? Надо веб-сайты делать!
                              Ответить
                              • Вот я уверен, что многие жабоёбы (вроде после крестовиков они наиболее смышленые) поклали бы это все в HashMap и успокоилось бы.

                                Чтоб извлечить цимес из того факта, что тут не просто какие-то случайные данные, а строки, надо всё таки быть чуть-чуть задротом.

                                Кстати, как правильно называется эта ситуация? Поиск по таблице?
                                Ответить
                                • Вот вы доебались до наколеночной программы, которая конвертит асм в асм, и где приведённый кусок кода наверняка не является узким местом. Говно только в дублировании строк и энумов.
                                  Ответить
                                  • конечно, говно.

                                    Обычно люди используют Flex или JFlex для генерации лексеров, нет разве?
                                    Ответить
                                  • Синдром поиска глубинного смысла же.
                                    Ответить
                          • https://github.com/google/libcxx/blob/master/include/string#L3451

                            Что за кодстайл, что всё с подчёркиваний или двумя подчёркиванием?
                            Ответить
                            • ну да, вроде так и есть

                              кодстайл гугла
                              Ответить
                              • > кодстайл гугла

                                Уверен? Я не думаю, что это код гугла. Да и в MSVS такая же хуйня.
                                Ответить
                                • нет, не уврене
                                  просто напизде предположил
                                  https://google.github.io/styleguide/cppguide.html

                                  кажется что нет

                                  а у MS где такое?
                                  Ответить
        • Тогда лучше так http://govnokod.ru/26027
          Ответить
    • Ассемлерный транслятор на плюсах, ну да, хотя это в мос 6502 oh shi~.
      Ответить
      • Это далеко не единственный транслятор из x86 в MOS 6502.

        Я не понимаю, зачем в 2016 году понадобился транслятор именно в этом направлении. На 6502 и его клонах собирали поделку Стива Возняка «Apple ][», советский «Агат» и приставку «Денди» (да, теперь я уже знаю, что это клон «NES», но в 1990-х у нас оригинальных «NES» не было).

        Я понимаю, зачем нужен транслятор из 6502 в x86: кто-нибудь может загореться желанием поиграть в старые игрушки. А наоборот? Сейчас живой 6502 найти реально?
        Ответить
        • P.S. WDC до сих пор производит клон 6502 (даже есть страничка «How to order»):
          http://www.westerndesigncenter.com/wdc/w65c02s-chip.cfm

          Только не в оригинальном DIP-корпусе, а в DIL или PLCC.
          Ответить
        • Транслировать не нужно, тем более где исходники каждый раз брать? Мос6502 успешно эмулируют, те же 8-битки с NES/Atari на эмуляторах бегают аж бегом.
          Ответить
    • Именно поэтому я за
      https://github.com/lefticus/x86-to-6502/blob/ba5fa6c97877c550932f0c2f734e102d0f58a3fe/src/main.cpp#L112
      Ответить
    • Это царский ролл?
      Ответить
    • OpCode::$$o
      Ответить

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