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

    +225

    1. 1
    2. 2
    xor	eax, eax
    mov	al, 0

    Запостил: ragim, 28 Апреля 2011

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

    • счет прежний - 0:0
      Ответить
    • А это откуда такое чудо, если не секрет?
      Ответить
    • Ну, знаете ли, таких примеров можно навскидку на коленке выдумать сколько угодно. Выдуманный от безделья говнокод, я думаю, тут мало кому не интересен. А не выдуманный говнокод должен сопровождаться контекстом.
      Ответить
      • Чаще всего подобный говнокод "выдумывается" компиляторами...
        Ответить
    • xor eax, eax для выравнивания
      Ответить
    • xor eax, eax нужен, чтобы обнулить eax
      mov al,0 нужен, чтобы переместить ноль в al, то есть чтобы освободить память, где раньше находился этот ноль.

      То есть этот ГК обнуляет регистр и освобождает один байт памяти.
      Есть варианты, как это сделать за меньшее число команд?
      Ответить
      • Яниху я не понял. Это как вообще?
        Ответить
      • круто... сразу в перлы...
        Ответить
      • Какой еще пямяти, блин?
        Где раньше находился 0
        А где он собственно находился??? Вы что курите?

        И собственно да, это скорее для выранивания сделано каким-нить компилятором.
        Ответить
      • я вчерась в СН ноль переместила, не пригодился, как мне его теперь выместить обратно?
        Ответить
      • Вторая строчка не нужна.
        Ответить
      • А я не знаю asm и мне похуй.
        Ответить
      • перловщик, mov al,0 копирует, а не перемещает.
        Ответить
      • ты с нулчана, переносишь нули-рак к нам на говнокод?

        ps: посмотри сериал "повторная загрузка (reboot)" там и вирусы-рак и нули и прочая компьютерная хуйня
        ззы: сюжет начинается со второго сезона.
        Ответить
        • > вирусы-рак
          а что, идея, заменить интернет-быдло компактным и экономичным микрокодом
          Ответить
      • Это перл всех перлов!
        Какой, на х*й, ноль? А там, где был ноль, станет пусто! Вообще ничего там не будет! Ахахах хДДД 3,14здец как-то.
        Mov пишет куда-то что-то, а не безвозвратно перемещает откуда-то. А учитывая, что уже лет сто как принято, что пустая ячейка - это ячейка с "0" внутри, то здесь идет просто обнуление регистра al.
        Программист, ёп твою мать.
        Ответить
      • > то есть чтобы освободить память, где раньше находился этот ноль.
        от чего освободить? О.о
        Ответить
        • От информации, ЛОЛ! Такие уж вещи должен каждый знать.
          Ответить
          • Ммм, я, видимо, не каждый.

            Объясните пожалуйста, что же будет там находится после того, как мы освободим его от информации?
            Ответить
            • Ничего не будет. Будет свободная память, которую можно будет выделять под переменные.
              Ответить
              • Вы себе представляете механически структуру памяти в компьютере? :)

                Похоже, нет. Не говоря уже о том, что MOV - это не перемещение, а копирование :)
                Ответить
                • Понятно, ты перешёл на обсуждение моих знаний. Видимо, своих немного.
                  Ответить
                  • Вброс незасчитан.

                    Abort? Retry? Ignore?
                    Ответить
                    • Понятно, больше тебе сказать нечего. Про то, как переводится слово "move", ты не знаешь. Про то, что память надо освобождать, ты не знаешь.
                      Всё, уходи. Поговорим после, когда получишь необходимые знания.
                      Ответить
                      • О великий гуру, поделись со мной, недостойным, крупицей своего великого знания!111
                        Ответить
                        • Так, теперь ты перешёл на минусование моих комментариев? Смачный слив.
                          А про освобождение памяти я тебе уже всё сказал, просто до тебя не дошло. Жаль.
                          Ответить
                          • Возрадуйтесь, о великий гуру, вы победили в этой специальной олимпиаде, номинация "спор в интернете".

                            *плюясь, удаляется*
                            Ответить
                  • про memory layout в DOS совсем ничего не знает, я проверил.
                    Ответить
                    • А при чем тут перевод мнемокоманды MOV ?
                      Ответить
                      • при том, что ничего не знаешь, а лезешь спорить.
                        Ответить
                        • Докажите. Пока что вы мне доказали обратное. Что ВЫ ничего не знаете.
                          Ответить
              • И, самое главное, вы уверены, что команда MOV действительно освобождает память? :)

                Нет, вы серьезно уверены? А на Кнуте поклясться можете?
                Ответить
          • И еще... А зачем её освобождать? Тем более, от информации.
            Ответить
            • У тебя оперативка никогда не переполнялась?
              Вот из-за таких, как ты, программы глючат и текут.
              Ответить
              • небось с уэбдевелопером споришь
                откуда им про память знать...
                Ответить
                • А есть ли смысл что-то вам доказывать?

                  Вы ведь все равно не поверите, что я знаю что такое регистры, стек, очередь команд итд, а не только что их прочитал в педивикии.

                  А хотя стоп, есть способ.

                  Среда: чистый x86 DOS (хотя это не важно). Сколько байт занимает самая короткая программа? И почему?
                  Ответить
                  • 112h
                    как я это получил?
                    Ответить
                    • будьте добры, в мнемозаписи. Т.е. командами ассемблера.
                      Ответить
                      • буду зол и алчен.
                        наличные, чек или перевод?
                        го обратно в педивикию, о результатах доложите
                        Ответить
                        • Понятно все с вами.
                          Сказать вам нечего, а троллить окружающих хочется.

                          Продолжим, когда Вы хотя бы попытаетесь ответить на мой вопрос. Пока что вижу дитё, упоённо троллящее всех вокруг.
                          Ответить
                          • А я вижу то ли ни хера не знающего невежду, то ли мудреца, упорно скрывающего свои познания. Какой вариант вероятнее? =)
                            Число я привёл, а поскольку "экзаменовать" меня не всякому унтерменшу позволено - обоснование за вами.
                            Ответить
                            • Если вы считаете, что длина самой короткой программы в среде DOS 274 байта - вы ошибаетесь. Дам вам подсказку: есть не только exe-шники, еще есть com-файл, не содержащий заголовка.

                              Зная это, в 99% случаев отвечают: "2 байта" - "int 20h"

                              Но и этот ответ неверен.

                              Не пытайтесь пожалуйста переложить ответственность за свои ошибки на меня.
                              Ответить
                              • Правильный ответ: Г
                                Ответить
                                • А регистры кто будет восстанавливать?!
                                  Ответить
                                  • А она их не трогает.
                                    Ответить
                                    • В том то и проблема. COM-файл по методу вызова не ближний вызов процедуры, а.... кое-что другое :)
                                      Ответить
                              • 1 байт. "C3" - "retn".
                                SP при старте указывает на 0FFFFh.
                                По адресу CS:0FFFFh лежат нули.
                                По адресу CS:0000h лежит int 20h.
                                Ответить
                    • Это ж 2 байта уже, а не один.
                      Ответить
                      • Это вообще типа длина файла. Видимо 272 нопа, а потом int 20h

                        :-D :-D :-D
                        Ответить
                        • Блин, я спалился, что знаю однобайтовую корректную программу.
                          Ответить
                          • Неужели одинокий NOP? :-D
                            Ответить
                          • Не уверен, что ваш вариант правильный с точки зрения всех нюансов. Мне известен другой.
                            Ответить
                  • >Сколько байт занимает самая короткая программа?
                    Для DOS минимальный размер программы смещение 100h для PSP + sizeof(команда ассемблера RETF). В стеке всегда, но только для COM-программ, лежит адрес возврата в систему.
                    Ответить
              • Учим матчасть, уважаемый.
                Ответить
      • Тролль гнёт елль
        Ответить
    • xor eax,eax включает режим автоматического знакорасширения в семействе P6 и выше, чтобы избежать partial register stall при работе с байтовыми значениями. Далее, после помещения байта в al, использование полного регистра eax не будет ожидать прохождения uOpa-а через retirement.
      Да, копирование нуля абсолютно бесполезно, и может быть тупняком компилятора, но если в дальнейшем коде в al помещаются другие величины, а используется весь eax, то смысл есть. Ну и само собой, выравнивание, о котором судить из данных двух строк невозможно.
      Поэтому - контекст где???
      Ответить
      • >xor eax,eax включает режим автоматического знакорасширения в семействе P6 и выше
        Ничего себе я отстал...
        Ответить
        • Учитывая то, что я вообще не занимаюсь x86 оптимизацией уже лет 6-8 и пишу по памяти, мы оба отстали )
          Кстати, не знакорасширения, а 0-расширения, я написал неаккуратно.
          Речь идет о внутренней оптимизации архитектуры, которая при обнулении регистра командой sub или xor заставляет процессор считать операции, меняющие младшие 8 битов регитра, меняющими весь регистр. В противном же случае это не так, и микрооперация, читающая из 32-битного регистра, будет ждать прохождения микрооперации записи в младший байт почти через весь конвейер. Вот такое вот объяснение "на пальцах".
          без этой оптимизации xor eax,eax + mov al,[ebx] + add edx,eax была бы по прежнему эквивалентна movzx eax, BYTE PTR [ebx] + add edx, eax , но тормозила бы значительно больше. Если обнулить регистр eax более экзотическим способом, появятся лишние вполне заметные тормоза на подверженных этой проблеме процессорах.
          Операции inc/dec (писал в комментариях к другому посту) вызывает(вызывала?) сходную проблему из за того, что не меняет CF, но меняет остальные арифметические флаги.
          Ответить
          • Я пофапаю на ваше мыслеизвержение, вы не против?
            Ответить
          • давно здесь таких умных людей не было, все всякая школота, типа багминота
            Ответить
            • ах, олежка, твоя сладенькая попочка соскучилась по порции батхёрта?
              Ответить
              • самокомпрометирующий коммент? похвально :)
                Ответить
          • Пиздец, современный ассемблер под х86 - это уже хитрожопый ЯП с нюансами, а не ассемблер. На настоящем ассемблере писать бы дали...
            Ответить
            • смирись, не знаешь ты архитектуру.
              >ассемблер под х86 - это уже хитрожопый ЯП с нюансами
              не знаю, как у тебя в дельфи, а вот в нормальных языках высокого уровня делают так, что-бы без нюансов.
              делают так, что-бы не задумываться об архитектуре и прочих мелочах, а просто записывать алгоритм.
              "с нюансами" - это обычно как раз признак ассемблера или недоЯП
              Ответить
              • > не знаю, как у тебя в дельфи, а вот в нормальных языках высокого уровня делают так, что-бы без нюансов.

                Функциональная илита пришла? Здравствуйте, садитесь.
                Ответить
                • >илита
                  или эта
                  >Здравствуйте, садитесь
                  а ты постоишь
                  Ответить
      • >прохождения uOpa-а через retirement.
        Можно поподробнее? Что это такое?

        >partial register stall
        Почему это возникает? И что это?
        Ответить
        • почитайте, например, http://www.agner.org/optimize/microarchitecture.pdf
          Ответить
          • Вот так, зайдешь посмеяться, а узнаешь тааакое... о чем лишь смутно подозревал в молодости, а потом забыл совсем :)

            Спасибо!
            Ответить

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