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

    +251

    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
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    use32
    kernel:
      mov ax,0x8
      mov es,ax
      mov ds,ax
      mov ss,ax
      mov esp,0x10000
      
      
      macro SetPixel x,y
      {
        mov ebx,x
        mov eax,y
        call GSetPixel
      }
      
      mov esi,0xA0000
      xor ecx,ecx
      @@:
      mov eax,dword[charH+ecx*4]
      mov dword[esi],eax
      add esi,320
      inc ecx
      cmp ecx,7
      jb @b
      
      mov esi,0xA0006
      xor ecx,ecx
      @@:
      mov eax,dword[charE+ecx*4]
      mov dword[esi],eax
      add esi,320
      inc ecx
      cmp ecx,7
      jb @b
      
      mov esi,0xA000C
      xor ecx,ecx
      @@:
      mov eax,dword[charL+ecx*4]
      mov dword[esi],eax
      add esi,320
      inc ecx
      cmp ecx,7
      jb @b
      
      mov esi,0xA0012
      xor ecx,ecx
      @@:
      mov eax,dword[charL+ecx*4]
      mov dword[esi],eax
      add esi,320
      inc ecx
      cmp ecx,7
      jb @b
      
      mov esi,0xA0018
      xor ecx,ecx
      @@:
      mov eax,dword[charO+ecx*4]
      mov dword[esi],eax
      add esi,320
      inc ecx
      cmp ecx,7
      jb @b
      
      jmp $
      
    charH dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F0F0F0F
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F00000F
    charE dd 0x0F0F0F0F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0F0F0F0F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0F0F0F0F
    charL dd 0x0000000F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0000000F
          dd 0x0F0F0F0F
    charO dd 0x000F0F00
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x0F00000F
          dd 0x000F0F00

    Раскопал в старых файлах. Выводит на экран незамысловатое слово HELLO
    На World у меня бы одного бут-сектора не хватило.

    Запостил: Ivan0x32, 24 Июня 2010

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

    • Что такое GSetPixel?
      Ответить
    • use32 в бутсекторе? От нас что-то скрывают...
      Ответить
      • Вам же не сказали, что эта программа запускается биосом при загрузке компа)
        Может быть она стартует из винды, просто лежит в бут-секторе))

        Потому что если представить, что биос стартует это из MBR, то непонято ни про GSetPixel ни про use32.
        Как она вообще работает? через прерывания биоса?
        Ответить
      • показать все, что скрыто> use32 в бутсекторе? От нас что-то скрывают...

        допустим, бутится виртуалная машина)
        Ответить
        • Бут-сектор сюда не влез :)
          162 строки, вот они :
          http://pastebin.org/357178

          Да грузится она из виртуалки, а работает так:
          Сначала устанавливается режим 320 на 240(уже и не помню) с 8-битным цветом кажись, ну а дальше прямая запись в DMA-память адаптера. Это был собственно первый опыт программирования чистой графики.
          PS: Был еще вариант где использовался SSE для тех же операций, но он как то потерялся где то.
          Ответить
      • >use32 в бутсекторе? От нас что-то скрывают...
        Да всё норм. Там, просто, в бут секторе защищённый режим процессора устанавливают.
        Ответить
    • Шрифт можно кстати из биоса вытащить, тогда его в секторе хранить не надо. Правда, русифицированный биос крайне редко встречается...
      Ответить
      • хм, а где это в биосе такое место -- что б там графический шрифт лежал?
        Ответить
        • Целых три массива шрифтов: 8х8, 8х14, 8х16, адреса есть, например, в Ralf Brown interrupts list. Причём и в основном, и в видеобиосе.

          Приведённый код использует обычный растровый шрифт, к тому же неупакованный. В принципе, у этого кода есть плюс перед биосовским шрифтом: можно использовать цветной шрифт, но в данном коде эта возможность не использована.

          В своё время была коллекция демок 4К (ограничение на размер кода 4 килобайта; если надо, могу поискать), так там в графическом режиме на причудливые фигуры натягивали буквы, а шрифт генерировали на основе вынутого из сегмента биоса, то есть в программе шрифт не хранился.
          Ответить
          • Что в биосе видео-карты (точнее в RAMDAC) есть шрифты -- это очевидно. Иначе как бы работал текстовый режим? Русификация текстового режима осуществляется именно путем загрузки туда другого шрифта. Древние карты не позволяли загружать туда шрифт прогрмно, и приходилось доставать память и пихать в программатор:) В юные годы я Гука три раза перечитывал;)

            А вот откуда (и зачем) они в обычном биосе -- я не понимаю)
            И как их оттуда достать универсальным (не videcard-specific) методом тоже не очень ясно.

            Видимо я что-то прогулял.
            Ответить
            • Ну дык были времена, когда видеокарт вообще не было! Вот тогда и были шрифты в обычном биосе. Так и остались...
              Ответить
    • показать все, что скрытоПишу на PHP за еду:
      http://www.delphiplus.org/humor/images/work_for_meal.jpg
      Ответить
      • http://lulzov.net/165.html
        Ответить
        • Между прочим это не смешно. Меньше чем PHPшники -- я не знаю кто получает
          Ответить
          • дельфятники-фрилансеры?
            Ответить
            • На дельфи сейчас еще поди работу найди, а сайты нынче каждой забегаловке нужны.

              Кстати паскаль куда меньше ведет к дебилизму, чем php)
              Ответить
              • > На дельфи сейчас еще поди работу найди

                Да почнму... Сидит фрилансер со знанием единственного дельфи, у заказчика предложенияе - сделать небольшую утилиту для какой-то приклоадной задачи, заказчику пофиг на чём реализуется, лишь бы имелся эксе и было куда щёлкать... и тут-то хопа, фрилансер-дельфятник делает её за двадцать долларов... Вполне частое явление...

                > Кстати паскаль куда меньше ведет к дебилизму, чем php)

                Ну да, там ООП в принципе неплохой.
                Ответить
                • ага) в классическом паскале нет ООП, кстати)
                  Его туда борланд присунул
                  Ответить
                  • > ага) в классическом паскале нет ООП, кстати)
                    Его туда борланд присунул

                    Читаю паскаль - вижу дельфи %) Надо читалку откалибрировать
                    Ответить
                    • там и было дельфи, но разве дельфи не паскаль?
                      Ответить
                      • разве c++ не с? :)
                        Ответить
                        • В С++ кроме ООП еще много чего внесли, а что внесли в дельфи по сравнению с паскалем? Особенно с борланд-паскалем например?
                          Ответить
                          • динамические массивы, перегрузку функций, варианты - это навскидку, это притом, что я уже давно не пишу на Delphi
                            Ответить
                            • омг))) отстал я от жизни
                              сливаюсь
                              Ответить
                              • В Делфи ведь нет мета-программирования или лямбда-исчисления? Так что Анонимус прав, прыжок от С к С++ был больше чем прыжок от Паскаля к Делфи. А С между прочим не подмножество С++ как бы этого кому там не хотелось. На нем можно написать совершенно не компилируемый С++-ом код.
                                Ответить
                                • >>На нем можно написать совершенно не компилируемый С++-ом код.
                                  Насколько я помню -- С++ "строже" в некоторых вопросах.
                                  И потому совершенно извращенческие хаки, который вызовут ворнинг в С не скомпилируются в С++.
                                  Ответить
                                  • Да ну, в с++ те же яйца, только в профиль. Напр. вместо старого сишного (MyType*) можно использовать reinterpret_cast<MyType*>. Какая разница? Одни щели закрыли, другие открыли - профита нету.
                                    Ответить
                                    • В большинстве случаев, да - те же яйца. Но в С, уже есть нечто чего нет в С++. О том и речь. А вот в паскале нет ничего такого чего нет в Делфи, собственно это я и пытаюсь сказать :)
                                      Ответить
                                      • >А вот в паскале нет ничего такого чего нет в Делфи,

                                        Да ну? А встроенные в язык массивы port[index] и mem[index]?
                                        Ответить
                                        • А ещё ключевые слова Interrupt, Inline, Assembler.
                                          В дельфи они хоть и остались (кроме Interrupt), но уже не выполняют свою функцию.
                                          Ответить
                                      • >Но в С, уже есть нечто чего нет в С++

                                        Например?
                                        Ответить
                                        • Да хотя бы это:
                                          struct { int x, y, z; } point = { .y=10, .z=20, .x=30 };

                                          Примеры в Википедии есть. Посмотрите что стандарт С99 привнес нового - в википедии хотя бы.
                                          Ответить
                                          • Ты так говоришь, как будто в этом разбираешься...

                                            Ты лучше послушай человека с мировым именем и справкой "прослушал курс средней школы".
                                            Ответить
                                          • /me явно идиот - купился на аватарку :D
                                            Ответить
                                          • Жаль, что С99 на С++ не применили...
                                            Ответить
                                • А да здраствует великий и могучий перл со всеми его модулями! (хотя начинали-то, вродь как, про асм :(....)
                                  Ответить
    • Дааа, ни вочто есйчас биты и битовую маску не ставят)
      Ответить

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