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

    −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
    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
    ; %ch - x1, %cl - y1, %dh - x2, %dl - y2 ;
    drawline:
    	push %a
    	push %b
    	push %c
    	push %d
    	push %e
    	
    	mov %al %dh
    	sub %al %ch
    	call @abs
    	mov %ah %al ; ah - dX ;
    	
    	mov %al %dl
    	sub %al %cl
    	call @abs
    	neg %al ; al - -dY ;
    	
    	mov %bh FFh ; bh - signX;
    	mov %bl FFh ; bl - signY ;
    	
    	cmp %ch %dh
    	jgz @.S1
    	neg %bh
    	.S1:
    	
    	cmp %cl %dl
    	jgz @.S2
    	neg %bl
    	.S2:
    	
    	mov %el %ah
    	add %el %al ; el - error ;
    	
    	push %d
    	call @drawpixel
    	pop %d
    	 
    	.loop:
    		cmp %ch %dh
    		jnz @.L1
    		cmp %cl %dl
    		jnz @.L1
    		jmp @.loop_end
    		.L1:
    		
    		push %c
    		call @drawpixel
    		pop %c
    
    		mov %eh %el
    		
    		cmp %eh %al
    		jng @.L2
    			add %el %al
    			add %ch %bh
    		.L2: 
    		cmp %eh %ah
    		jgz @.loop
    			add %el %ah
    			add %cl %bl
    		jmp @.loop
    		
    	.loop_end:
    	
    	pop %e
    	pop %d
    	pop %c
    	pop %b
    	pop %a
    	ret

    https://pastebin.com/k8697fae

    алгоритм брезенхема.

    результат: https://imgur.com/a/c1twuNt

    забавно что посреди тестов программа выдала красивые такие кривые на весь экран. с.м. имгур, приложил.

    Запостил: kcalbCube, 16 Февраля 2022

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

    • зачем нам этот ужос? ты еще бинарник ЕXE тут распечатай
      Ответить
      • моя вмка не умеет в страницы, exe не будет
        Ответить
        • Сделай ВМ-ку с bigint регистрами и бесконечной оперативкой, чтоб каждый "байт" тоже был бигинтом и самих байт было бесконечно
          Ответить
        • DOS'у это никак не мешало
          Ответить
          • Ага. Только из-за отсутствия виртуальной памяти в ДОСе в экзешниках были перемещаемые адреса (relocations a. k. a. fixups), которые загрузчик экзешника должен был фиксить.
            Ответить
            • > отсутствия виртуальной памяти

              Как-будто в винде и линуксе фиксапов нет...

              Тем более после прихода ASLR, который закидывает экзешник хрен пойми куда.

              З.Ы. В линуксе pic, ему можно не патчить.
              Ответить
              • В эпоху Windows 98 начали собирать экзешники без фиксапов. Для каждого загруженного экзешника VMM создавал своё адресное пространство, чтобы загрузить его по фиксированному адресу.

                В Висте появилось ASLR, и снова стали собирать экзешники с фиксапами, чтобы их можно было «закинуть хрен знает куда».
                Ответить
              • Кстати, в 32-битных x86 rip-адресация была только для джампов и коллов, поэтому pic костылили таким кодом:
                call @1
                @1:
                pop ebx


                В ebx теперь лежит адрес @1. К адресам данных теперь можно добавить ebx-@1, тогда в экзешник они лягут без фиксапов. Возврата не будет, потому что адрес возврата из стека вытолкнули.

                Да, колл без рета. Такое вирусы любили использовать, потому что их никто патчить не будет.
                Ответить
              • У меня в контроллерах нет никаких ASLR. Прошивки контроллерам пишут Цари, которым не нужны эти анскильные костыли для безопасности
                Ответить
            • Нi, релокации нужны чтобы поманкипатчить позиционно зависимый кот, чтобы его можно было загружать по произвольному адресу.
              Ответить
            • У меня в "COM" никаких переимещаемых адресов не было. Оно всегда грузился на 100h вроде
              Ответить
              • Они position independent за счёт сегментных регистров, да.
                Ответить
                • У меня в "tiny memory model" нет никаких, ну ты понял
                  Ответить
                  • Ну вот tiny экзешник можно тоже не релочить, наверное.

                    З.Ы. Хотя не, там другие инварианты на старте, экзешник поди сам сегментные регистры выставляет.
                    Ответить
                    • Я никогда не видел тайни экзешниг:) Хотя... а какой мемори модел был у умолчанию в борманд паскале?
                      Ответить
                      • Вроде был какой-то конвертер таких экзешек в ком.
                        Ответить
                        • Кстати, загадка: Загрузчик в досе игнорирует расширение файла, и отличает EXE от COM по наличию MZ.

                          Для EXE он должен сделать какую-то интеллектуальную работу, а COM просто загружает.

                          Но когда EXE только появился, он различал именно по расширению. А потом перестал.
                          Почему?
                          Ответить
                          • Потому что какой-нибудь стандартной туле памяти не хватило и её пересобрали в экзешник, а переучивать людей и править скрипты было поздно?
                            Ответить
                            • Да, именно так.

                              COMMAND.COM и FORMAT.COM нельзя переименовывать не сломав к хуям примерно всё, хотя они уже и повылазили за 64K -- размер сегмента.

                              А вдруг COM файл начнется с MZ?
                              А не начнется, потому что MZ это
                              0100 4D            DEC     BP
                              0101 5A            POP     DX


                              Прекрасный Реймонд Чен поясняет
                              https://devblogs.microsoft.com/oldnewthing/20080324-00/?p=23033
                              Ответить
                              • а вот в .com файлах можно было без ассемблера клавиатурой программы писать
                                Ответить
                              • Кстати, ещё сигнатура ZM обрабатывается так же, как и MZ, хотя встречается редко.
                                Ответить
                          • это и в винде так.
                            Ответить
                            • Вероятно что по тем же причинам, хотя в x64 ты .com файл и не запустишь
                              Ответить
                              • В Винде бывает ещё пиздец, когда 32- или 64-битное приложение в формате portable executable имеет расширение .com. Реальный пример — devenv.com (IDE от MS Visual Studio) или soffice.com (универсальный лаунчер от Open Office / Libre Office).

                                Винда их нормально запускает как приложение Win32, несмотря на расширение .com.
                                Ответить
                                • "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe"


                                  Тупо, что оно 32 бита (майки наговнокодили и десятый год не могут перевестись в 64) но всё же оно .exe
                                  Ответить
                                  • Поищи, в той же директории зачем-то лежит и .com.
                                    Ответить
                                    • лол да лол

                                      но всё, что он делает, это запускет .exe. Этакий трамполин.

                                      наверное для совместимости с visual studio 4.0
                                      Ответить
                                      • Главное, я не понимаю, зачем. Я ещё могу им простить 64-битные format.com, chcp.com, mode.com, more.com — вдруг их какой-нибудь скрипт использует.
                                        Ответить
                                  • 2022-я Студия уже x64.
                                    Ответить
                                    • Я еще пока не обновлялся, я вообще консервативный очень в таких хренях. Ну ее нахуй, отвалица еще че нить
                                      Ответить
                                    • Возможно, вы имели ввиду «наконец-то».
                                      Ответить
                                • Это вроде как потому что единственный способ, чтобы один и тот же файл можно было запускать и из-под консоли, и из гуев. В экзешнике подсистема прописана, будет неудобно: гуевый экзешник от консоли сразу открепится, а консольный при вызове из проводника выдаст консоль.
                                  Ответить
                                  • У меня много друзей противоположного пола, и я их ценю, потому что они красивые
                                    Ответить
                                  • Типа .com запускается перед .EXE?
                                    Ответить
                        • Экзешники, собранные TP >= 4.0 (а также сишкой, если модель не tiny и не small или требуется отдельный сегмент стека), нельзя было конвертировать в .com.

                          Однако, для таких экзешников, если они влезают в 64К, был псевдоконвертор: он перед сигнатурой MZ прилеплял загрузчик в формате com-файла, который читал заголовок экзешника, рассовывал его секции по сегментам памяти и патчил фиксапы, а потом передавал управление. Я не помню, решали ли там задачу двойного потребления памяти.

                          Программы, сконвертированные псевдоконвертором, можно было восстановить в exe. Была программа com2exe, написанная... да, Фабрисом Белларом, кем же ещё.
                          Ответить
                          • Так падажжи ёпта
                            If Force Far Calls is off, the compiler uses the NEAR call models for any procedures or functions within the file being compiled.

                            тоесь нихуа не large
                            Ответить
                            • Во время второго акта Софьи и Молчалина у них под лестницей сидел Чацкий
                              Ответить
                              • Анна Каренина не нашла ни одного настоящего мужчины и потому легла под поезд
                                Ответить
                            • Только в пределах данного модуля. Если ты вызовешь процедуру или функцию из другого unit'а (в том числе и system), компилятор сделает far call.
                              Ответить
                              • Ночь - это такое время суток, когда снится таблица Менделеева
                                Ответить
                              • А разве мудель large предполагает ВСЕ укокозатели far?
                                Ответить
                                • Надо найти точное определение модели.

                                  Кстати, в ТП тип pointer и типизированные указатели (хоть на данные, хоть на функции) всегда far. Нельзя объявить переменную, чтобы она хранила near-указатель. Поэтому и к «ближним» процедурам и функциям нельзя применить операцию @ и их нельзя передать в другую процедуру или функцию как аргумент.

                                  type
                                      myfunc = function(x: real): real;
                                  
                                  function integral(f: myfunc; a, b: real): real;

                                  В качестве параметра f можно передать только far-функцию.
                                  Ответить
                                  • Понтёр в трубоскакале вроде был всегда 32 бита, типосовместимость не даст такое вытворять.
                                    Ответить
                                    • Ну вот в известных мне реализациях сишки для x86 у указателей были модификаторы far и near, а в ТП такого не было, там все указатели far.

                                      Т. е. в сишке можно было так:
                                      char far * petuh;
                                      char near * kurochka;


                                      Если модификатор far/near не указан, то размер указателя выбирался по текущей модели.

                                      По умолчанию far-указатели и на код, и на данные были в модели large.

                                      Получается, что модель ТП больше всего похожа на модель large, но с исключением: неэкспортируемые процедуры и функции по умолчанию были near (но они были неполноценными, потому что даже в пределах модуля на них нельзя было брать указатель).
                                      Ответить
                                      • Беговые кроссовки должны быть на упругой амортизирующей подошве, чтобы во время бега не получить сотрясение мозга
                                        Ответить
                                        • А если я на четырёх конечностях бегаю, мне на все конечности кроссовки надевать?
                                          Ответить
                                  • Модель это термин из конкретного компилятора, описывающий его споосб работы с памятью.

                                    У каждого компилятора могут быть свои модели
                                    Ответить
                                    • Действительно. В сишном стандарте, например, нет никаких моделей.

                                      В некоторых компиляторах отсутствовала модель тайни, для получения com-файла нужно было выбирать смолл и указывать дополнительные параметры, чтобы стек не создавался.
                                      Ответить
                                      • Электричество позволяет людям эффективно существовать ночью
                                        Ответить
                                        • Какая разница, существовать ли ночью или днем?..

                                          deneg.net
                                          raboty.net
                                          schastya.net
                                          mozgov.net


                                          Ответить
                                          Ответить
                                      • Потому что модель связана с конкретной платформой: линейная там адресация, или сегментная, или хуй знает еще какая бывает, стандарт этого не знает
                                        Ответить
                                    • Это случайно не с объектниками связано? assume в ЯВУ выглядит полной херней.
                                      Ответить
                      • > какой мемори модел

                        Думаешь я помню их названия?

                        Вроде что-то среднее, с far для данных и near для кода.
                        Ответить
                        • Начиная с четвёртой версии можно считать, что модель Large.

                          Каждый модуль, перечисляемый в uses, линкер клал в отдельный сегмент.

                          Можно было объявлять функции с директивой near, чтобы получить более оптимальный код (near- и short-джампы были rip-based и не требовали фиксапов), но поскольку все указатели были только far, то адреса near-функций нельзя было класть в указатели и куда-нибудь передавать, также их нельзя было экспортировать в другие модули.
                          Ответить
                        • Ещё про «среднее»: сегмент данных создавался один, поэтому глобальные переменные должны были влезть в 64К, но можно было использовать кучу «неограниченного» размера (640К минус ДОС и драйвера, минус другие запущенные программы, минус код и данные твоей программы).
                          Ответить
                        • Вспомнил ещё один прикол. Если «дальняя» функция находится в том же сегменте, что и вызывающий её код, компилятор может заменить call far func на
                          push cs
                          call near func

                          Вопрос: нафига?
                          Ответ: call near будет rip-based, поэтому фиксапа не будет. Такой заменой получается pic.
                          Ответить
                      • В Борманд Паскале до четвёртой версии была модель тайни, т. е. только COM-файлы, а начиная с четвёртой версии только large, т. е. все указатели длинные, только EXE-файл (но можно было по желанию объявлять near-функции, на которые нельзя брать указатели и которые нельзя вызывать из других модулей).
                        Ответить
                        • Я начинал с седьмого вроде, значит у меня были только длиные указатели, эх
                          Ответить
                          • Про TP до семёрки я узнал уже, когда вуз закончил, из диска «Библиотека программиста».

                            В тройке не было модульной системы, поэтому для использования библиотек применяли чёрную магию:
                            https://govnokod.ru/19045
                            Ответить
                            • Какой пиздец:)

                              Я ходил в некоторый аналог дворца пионеров, и там был turbo или borland паскаль (отличался набором либ, всяким OWL, вроде оверлеями и пр), на тот момент это было очень продвинуто.
                              Ответить
                              • Оверлеи можно было использовать чуть ли не с четвёрки, OWL появилась, кажется, в шестёрке, когда вышел первый ТП для Windows.
                                Ответить
                                • Были, но были ли они в турбо, или в борланде?
                                  Турбо влазил на дискету, а борманд -- нет.

                                  Кстати, IDE сама была под дос (подозреваю турбо вижн) а писать можно было и под винду и OWL. Все помнят эти кнопочки с зеленой галочкой и красным крестиком, да?
                                  Ответить
                              • Borland от Turbo отличался тем, что в пакете «Borland» были компиляторы и библиотеки сразу для DOS и для Windows, а в «Turbo» версия для DOS и версия для Windows были разложены в отдельные пакеты.

                                Были ещё пиратские сборки «на двух дискетах», которые я терпеть не мог. В конце 1990-х уже ни у кого не было 20-мегабайтных винчестеров, чтобы так экономить.
                                Ответить
                                • нахуя они по разному назвали продукты и еще и даже компиляторы назвали по разному?
                                  Ответить
                                  • Не знаю.

                                    В пакете Борланд были те же самые компиляторы, которые были в раздельных пакетах Турбо, и даже те же самые библиотеки. Разница была только в том, что в Борланд это всё засунули в один установочный пакет.

                                    Правда, в Борланд дополнительно положили ещё одну версию IDE и компилятора. Обычные turbo.exe и tpc.exe были под реальный режим, а bp.exe и bpc.exe (которые клали только в Борланд, но не клали в Турбо) работали в защищённом (через бормандовскую прослойку RTM+DPMI), так что могли использовать больше оперативки (это было важно при компиляции огромных программ). Эти компиляторы поддерживали одни и те же языковые конструкции и генерировали одинаковый код, и библиотеки были одинаковыми, разница была только в доступной компилятору и IDE оперативке.
                                    Ответить
                                    • Чтобы побороть любой стыд, надо по-немногу позориться
                                      Ответить
                                    • Думаю, разница правда в разрядности. Ну и в цене, вероятно

                                      Если ты студень, то тебе хватит турбы для лаб.
                                      Если ты пишешь коммерческий софт, то тебе уже не скомпилица турбой, и нужен борманд. Думаю, так.
                                      Ответить
                                      • В какой разрядности?
                                        Ответить
                                        • Я не знаю просто как у них DPMI работал. Код всё равно был 16 разрядным?
                                          Ответить
                                          • Так точно!

                                            32-битными стали только вторые Дельфи.

                                            В BP7.0 и в Delphi 1.0 были 16-битные rtm.exe и dpmi16bi.ovl. Можно было генерировать код под реальный режим и под защищённый режим с 16-битными сегментами, как в Windows 3.x. В этом же режиме работали консольные компиляторы bpc.exe и dcc.exe и IDE bp.exe.

                                            Во вторые Дельфи и в Борманд C++ 4.x (в пятые Борманд C++ стопудово) уже клали консольные компиляторы, работающие в защищённом режиме с 32-битным flat-сегментом. К ним прилагался 32rtm.exe и dpmi32bi.ovl.
                                            Ответить
                                            • А как еще? В третьих виндах консоли не было.
                                              Ответить
                                              • Консоль была, но только для досовских программ. Из-под неё можно было гонять даже программы для DPMI. Но, увы, у этой «консоли» не было доступа к WinAPI. Ну почти не было, с помощью VXD можно было пробросить в VDM доступ к некоторым функциям Windows. Например, из коробки была возможность менять заголовок окна. Ещё можно было подглядывать в буфер обмена.
                                                Ответить
                                                • А что, в w9x было иначе разве?

                                                  >менять заголо
                                                  помнишь ANSI.SYS? Поди, через него можно было?
                                                  Ответить
                                                  • Моя соседка уже старая, но до сих пор интеллигентная
                                                    Ответить
                                                    • Моя соседка -- прожженная блядь
                                                      Славилась доброй душой
                                                      (с)
                                                      Ответить
                                                  • Иначе. В Win95 уже была настоящая консоль и экзешники для подсистемы «Text», как в NT.

                                                    ANSI.SYS про другое. Он интерпретировал эскейп-последовательности в стандартном выходном потоке.
                                                    Ответить
                                                    • > В Win95 уже была настоящая консоль и экзешники для подсистемы «Text», как в NT.

                                                      Это, пардон, кокая? Там была только ``command.com`` же.

                                                      консоль (cmd.exe, Win32API Console API) были тока в NT.

                                                      Или я вру?

                                                      >ANSI.SYS про другое.
                                                      А знаешь, как в прыщах программы устанавливают тайтл у окна эмулятора терминала?
                                                      Ответить
                                                      • Win32 Console API и cmd.exe в Win95 уже были. Не веришь — скачай Win95 с old-dos.ru или ещё откуда-нибудь.

                                                        FAR, который был чистым portable executable для win32 console API, в Win95 работал.
                                                        Ответить
                                                        • Wiki с тобой не согласна
                                                          https://en.wikipedia.org/wiki/Cmd.exe

                                                          моя память -- тоже. Но мы можем врать (четверть века прошла всё таки), так что я наверное и правда скачаю на досуге, да посмотрю.

                                                          Так что с тайтлами xterm, putty и пр? Знаешь, как их устанавливают?

                                                          >far
                                                          хм.. и пправда

                                                          ааа!!
                                                          вот как дело было
                                                          https://en.wikipedia.org/wiki/Windows_Console#Windows_9x
                                                          но cmd.exe там не было
                                                          Ответить
                                                          • Вот насчёт cmd.exe нужно проверить. Возможно, в Win95 его не клали, и вместо него использовали command.com.

                                                            Но Win32 console API точно было. Я точно помню программы в формате portable executable, которые в DOS не работали, а в Win95 работали. Помню, что в Win95 console API были реализованы все функции с суффиксом A (ANSI), а вот с функциями с суффиксом W (Wide, что означает поддержку UTF-16) была беда, были реализованы не все, поэтому некоторые консольные программы, предназначенные для NT, в Win95 могли не работать.
                                                            Ответить
                                                            • Не клали, но cmd.exe на самом деле имеет опосредованное отношение к консоли, и вместо него был command.com.

                                                              Но API было, хотя и урежанное (работало оно в v86, как я там выше дал ссылку). Иными словами, любая соснольная херня в win9x всегда порождала 16-ти битный процесс, как я понял.

                                                              И ты прав на счет "A": в 9x всё было "A", а в NT -- "W".
                                                              Отсюда у нас TEXT() и прочие хаки
                                                              Ответить
                                                              • Да, там было как-то через жопу. Вроде бы само очко и/или его внутренности были 16 бит и приходилось это тащить с собой, запуская проги 32 бит.
                                                                Ответить
                                                                • В Win95 было всё сложно.

                                                                  Ядром системы был 32-битный VMM.vxd (virtual memory manager).

                                                                  Часть функций WinAPI была реализована вызовом функций DOS и BIOS, сидящих в V86, посредством vxd-драйверов. Поэтому Win95 мог использовать досовские драйвера и резидентные программы, запущенные через autoexec.bat и config.sys.

                                                                  К некоторому железу уже были прямые 32-битные драйвера в обход DOS и BIOS.

                                                                  Win95 умел загружать и 32-битные drv, и 16-битные от Win 3.x.

                                                                  WinAPI был в двух вариантах: 16-битный (на основе API Win 3.x) и 32-битный, как в NT (но функций с суффиксом W было мало).

                                                                  Некоторые функции одного API вызывали из-под себя функции другого API, так что при работе любой программы использовались и 16-битные, и 32-битные сегменты.

                                                                  В NT эти интерфейсы изолировали. Там придумали WOW (Windows on Windows). Win32 стал основным интерфейсом, а 16-битный API реализовали через него. И драйверов 16-битных не стало.
                                                                  Ответить
                                                                  • Отдельная тема — vxd-драйвера. Они появились ещё в Windows3.1 (тогда у файлов было расширение .386). Формат этих драйверов LE по сути был урезанным форматом LX, который использовался в OS/2 для 32-битных программ. Его особенностью была возможность в одном бинарнике держать 32-битные и 16-битные секции (какой ужас).

                                                                    Да, в Windows 3.1 уже были 32-битные vxd-драйвера, хотя я не знаю, зачем, ведь ядро и API были 16-битными.
                                                                    Ответить
                                                                    • Я призываю женщин как можно больше рожать, а мужчин - как можно больше в этом участвовать
                                                                      Ответить
                                                                  • >virtual memory manager

                                                                    а не machine?
                                                                    икарус прикинь, про кишки винды девяностопятой целую книжку написили

                                                                    https://vtda.org/books/Computing/OperatingSystems/Inside_Windows_95_Adrian_King_1994.pdf
                                                                    Ответить
                                                                    • Я прочитал книгу, кстати.

                                                                      Нам играют живые "Битлз"
                                                                      И стареющий Эдриан Пол Кинг.

                                                                      Там есть много всратого прыгания между 16 и 32 режимами, наивная вера в OLE, еще более наинвые diff провайдеры для потрфеля (который не взлетел), ода реестру, и довольно крутые многоуровневая архитетура сети, где петузы умудрились утоптать в одну абстракцию NetBIOS, TCP/IP, IPX/SPX, и еще черта в ступе

                                                                      А еще про модемы, принтеры, видяху ("плоский" драйвер SVGA), в общем такой как Руссинович про NT, только про Чикаго и на 400 страниц вместо 2K
                                                                      Ответить
                                                                  • Мне каежтся, ты путаешь с 3.0, или я неверно тебя понял.

                                                                    В 95 все VxD были защищенные (хз, могли-ли они быть 16-ти битными, но они точно были не под реальный режим), и
                                                                    Windows не мог использовать досовые драйвера.

                                                                    Досовые драйвера (и всякие TSR) загружались (вместе с autoexec.bat и config.sys) в каждый DOS VM, для досовских программ.

                                                                    То-есть досовские прогиаммы могли чото там использовать, а виндовые -- нет.

                                                                    В отличие от 3.0, где хождение например на диск было реализовано через досове прерывание (и могло всё завесить), в Win95 уже появился IFS с редиректорами.

                                                                    Досовым TSR винда могла "эмулировать" устройства (через записи в IO map и исключения) но не наоборот
                                                                    Ответить
                                                                    • > В 95 все VxD были защищенные (хз, могли-ли они быть 16-ти битными, но они точно были не под реальный режим), и
                                                                      Windows не мог использовать досовые драйвера.

                                                                      Всё сложнее. В одном VXD могли быть вперемешку 16-битные и 32-битные сегменты. Формат LE такое поддерживал. Да, и 16-битные, и 32-битные были в защищённом режиме.

                                                                      DOS в Win95 был в двух ролях:

                                                                      1. Тот, который стартовал до запуска Windows. Да, в Win95 загрузка начиналась с запуска IO.SYS.

                                                                      2. Тот, который сидит в виртуальных машинах (VDM).

                                                                      Так вот Win95, как и 3.1, посредством VXD могла использовать досовские драйвера, загруженные в первом ДОС. А второй ДОС был как бы в песочнице: он мог использовать драйвера Windows посредством VxD, т. е. всё противоположно первому.
                                                                      Ответить
                                                                      • > Да, и 16-битные, и 32-битные были в защищённом режиме.

                                                                        Тогда в этом нет ничего страшного.

                                                                        В protected mode можно легко запустить 16-ти битный защищенный (aka 286) код: это же просто битик в дескрипторе сегмента, говорящий о том, какой это код.

                                                                        Вот код реального режима запустить нельзя, потому что он насрет тебе в порты ввода/вывода или в память.

                                                                        >Так вот Win95, как и 3.1, посредством VXD могла использовать досовские драйвера, загруженные в первом ДОС

                                                                        А как это работало?
                                                                        Ну вот я написал драйвер, который TSR, который перехватывает прерывание, и эмулирует диск "D" который на самом деле на луне.

                                                                        Пусть я даже написал VxD, который может его дернуть.

                                                                        А как он будет в реальном режиме-то работать? Как он будет ходить в IO порты?


                                                                        Мне кажется, что в отличии от 3.0, в Win95 dos ВСЕГДА работал в V86
                                                                        Ответить
                                                                        • Или вот вы спрашиваете: "а как обращались к VxD и VMM?"

                                                                          Что, не спрашиваете? Говорите, вам похуй?

                                                                          Ну и похуй, всё равно расскажу.

                                                                          VMM это ядро, а VxD это модуль ядра, да?

                                                                          Так вот сисколы (там они назывались сервисами) можно было вызвать:

                                                                          1. Через INT 2F (как в Win16)
                                                                          2. Через API Kernel.dll, который потом слал запрос через call gate (в отличие от **nix и NT использовалось НЕ прерывание, а до SYSENTER было еще лет пятандцать)

                                                                          Второй способ делал вас переносимвм на NT. Первый -- нет конечно

                                                                          Само собой, был и третий способ -- прерывания доса или биоса, но это только для реальных программ под DOS VM
                                                                          Ответить
                                                                          • Прочитай ещё про INT 20. В ДОС этот вызов завершал приложение, а в VxD это сисколл. Причём за INT 20 двойное слово, через которое процессор перепрыгнет (обработчик прерывания подкручивает адрес возврата).

                                                                            Необычно, да?
                                                                            Ответить
                                                                            • Почитал.
                                                                              Через этот API VxD регистрировали у VMM себя.

                                                                              Раньше надо было явно в system.ini писать, а с W95 стало можно динамически.

                                                                              Причем если ты хочешь предоставлять API для для других, то ты должен получить ID. А если только колбеки то не должен: просто регся.
                                                                              Ответить
                                                                            • Икарус, какая заебатая кнжика всё таки: не оторваца.

                                                                              Там описываются, например, как они делали thunkи.

                                                                              Часть кода была 16ти битной, и из 32х битного надо было вызывать его, а часть была наоборот.

                                                                              Ну там была мысль всё сделать 32 (спиздив код из NT) но это было бы тяжело по памяти (NT требовало 16 метров, а в 95 -- 4), потому часть осталась 16-ти битной.

                                                                              И был thunk генератор в SDK, который превращал вызовы 32 в вызовы 16, укорачивая там инты в стеке, меня значения регистров, и пр.

                                                                              А потом оказадлось, что 16битнеый код не реентерабелен (не только код приложений, но и системы), и они запилили вокруг него а-ля GIL
                                                                              Win16Mutex
                                                                              Ответить
                                                                              • Давно читал про thunk'и, уже забыл, как они сделаны. Thunk'и были трёх видов, какие-то из них можно было использовать не на всех платформах.

                                                                                В доках по Win32s вроде они были описаны.
                                                                                Ответить
                                                                                • Generic Thunk, Flat Thunk, Universal Thunk.

                                                                                  Flat thunk для вызова 16 из 32.

                                                                                  Generic thunk и universal thunk для вызова 32 из 16. Последний используется в Win32s, generic — в NT и 95.
                                                                                  Ответить
                                                                                  • Икарус нахуя ты разбираешься в технологиях 1994-го года?
                                                                                    Ответить
                                                                        • а не, гляди-ка, Икарус прав

                                                                          https://i.postimg.cc/XYTHRFXx/image.png
                                                                          Ответить
                                                          • Всё, вспомнил.

                                                            В Win95 консоль была реализована через жопу. В Win 3.x был vdm.exe (или как-то так), который умел рисовать чёрное окошко для досовских программ.

                                                            В Win95 решили для рисования консоли взять за основу этот код из Win 3.x, чтобы не писать с нуля. Поэтому в Win95 при запуске любого приложения win32 console API прицепом загружалась VDM, что создавало дополнительную нагрузку.

                                                            cmd.exe действительно был только в NT и в OS/2.
                                                            Ответить
                                                            • Поаккуратнее с этой штукою - cmd.exe, у многих после игр с нею поумирали родственники, как правило, родные и двоюродные братья. Стыдоба-то какая!
                                                              Ответить
                                                            • Ну то есть окошко не зря называлось "ms-dos" в win9x:)

                                                              Правда, в ту пору консоль считалась устаревшей, легаси для старого говна, а светлое будущее должно было состоять примерно из MFC.

                                                              Иронично, что 90% софта у ту пору было как раз таки под дос
                                                              Ответить
                                                            • Икарус, видал проект "Cairo"?
                                                              Ответить
                                                              • С таким названием куча проектов. Это как человека назвать Иванов Иван Иванович.
                                                                Ответить
                                                        • Откуда cmd в мастдае?
                                                          Ответить
                                                        • >Win32 Console API и cmd.exe в Win95 уже были.

                                                          Да, были, но поддерживали только одну консоль (в отличии от NT)

                                                          https://i.postimg.cc/rmt3fcJK/image.png
                                                          Ответить
                                                      • > А знаешь, как в прыщах

                                                        Я тебя понял. Оригинальный ANSI.SYS писался под голый ДОС и про сервисы, предоставляемые VXD, не знал. Но если его дописать, то такую функцию реализовать можно.
                                                        Ответить
                                            • Дополню про DPMI и RTM.

                                              DPMI играл две роли:
                                              1. Реализовывал переходники между программой защищённого режима и функциями DOS и BIOS.

                                              2. Реализовывал собственный API (INT 31h), в котором были функции для управления виртуальной памятью вроде VirtualAlloc, функций для работы с линейными адресами и сегментами, управления защитой, работы с обработчиками прерываний и т. п., так что в прикладной программе можно было обходиться без низкоуровневого кода.

                                              RTM же реализовывал дополнительную библиотеку.

                                              16-битный RTM мумулировал API OS/2 для соснольных приложений: часть функций DOSCALLS.DLL, VIOCALLS.DLL, KBDCALLS.DLL.

                                              32-битный RTM мумулировал Win32 для соснольных приложений: часть функций kernel32.dll, user32.dll, advapi32.dll.

                                              Для запуска ФАРа из голого DOS посредством 32RTM этих функций было недостаточно. Рантайм, позволяющий запустить ФАР из DOS, появился позже:
                                              https://www.japheth.de/HX.html

                                              Но даже тот рантайм, что был у Борланда, позволял собирать двойные приложения защищённого режима, которые могли работать и в голом DOS, и в винконсоли. К таким приложениям относились борландовские компиляторы и Турбо Дебагер. Даже IDA выпускалась в виде такого приложения.

                                              Почему 16-битный RTM мумулирует функции OS/2, а не Windows? Да потому что у 16-битных Windows (Win 3.x) не было консольного API.

                                              К слову, такой рантайм был не только у Борланда. Был Pharlap TNT DOS extender с похожим API. Его ещё использовали какие-то компиляторы (Metaware High C++ вроде).
                                              Ответить
                                              • У Pharlap было ещё одно извращение: можно было писать 32-битные программы для 16-битных Windows 3.x без Win32s. Создавался 32-битный сегмент с твоим кодом и линковался в одну программу с рантаймом Pharlap, который загружал этот сегмент, как положено, и создавал переходники для вызова функций 16-битного API. Твой код был полностью 32-битным, но 16-битный WinAPI был бутылочным горлышком.

                                                Я не знаю реальные примеры программ, которые бы использовали расширитель Pharlap для Windows. Когда появился Win32s, стали писать программы под Win32 API и запускать через него. Например, древний 32-битный Фотошоп спокойно запускался не только в NT и в Win95, но и в Win 3.x через Win32s.
                                                Ответить
                                              • Как реализовывался DPMI на w девять икс? Он же там был, иначе бы дум не работал
                                                Ответить
                                                • Был, да. Он и у Win 3.x был. Была реализована версия 0.9 (в 1.0 почти никто не умел: ни dos4gw, ни QEMM, ни go32, ни борландовские rtm и 32rtm, ни dos32a, ни cwsdpmi, ни wdosx, ни emx; вроде только 386max умел в 1.0).

                                                  Как именно реализовывался, не знаю. Где-то в VMM, вероятно.
                                                  Ответить
                                                  • Dat klopt!

                                                    https://i.postimg.cc/L4yfWpb8/image.png

                                                    Найди на картинке DPMI Server.
                                                    Ответить
                                            • Откуда тебе это известно? Тарас?
                                              Ответить
                                              • В зоне стихийных бедствий и военных действий появляются мародеры - верные спутники эпидемий
                                                Ответить
                                          • Теперь представь, каким был код в 16-битном DPMI.

                                            Для поддержки массивов более 64К в 16-битном коде нужно было крутить сегмент. В защищённом режиме для этого нужно плодить записи в LDT или крутить базу.

                                            В Борманд Паскале сделали проще: не стали реализовывать модель Huge. Т. е. писали код так, чтобы массивы и объекты укладывались в 64К. Если нужно было больше 64К, использовали датастримы: в библиотеке Турбовижн были классы, предоставляющие интерфейс к памяти как к файлу. Или использовали связанные списки и деревья, у которых каждый узел аллоцировался отдельно.
                                            Ответить
                    • .model tiny это и есть сом и PIC
                      Ответить
                      • Я не помню уже какая из них как называется, сорри.
                        Ответить
                        • Могу напомнить про C, про m/tasm не напомню так


                          Tiny. As you might guess, this is the smallest of the memory
                          models. All four segment registers (CS, DS, 55, ES) are set to the
                          same address, so you have a total of 64K for all of your code, data,
                          and stack. Near pointers are always used. Tiny model programs
                          can be converted to .COM format by linking with the It option.


                          Small. The code and data segments are different and don't overlap, so you have 64K of code and 64K of data and stack. Near
                          pointers are always used.

                          Medium. Far pointers are used for code, but not for data. As a
                          result, data plus stack are limited to 64K, but code can occupy up
                          to 1 MB.


                          Compact. The inverse of medium: Far pointers are used for data,
                          but not for code. Code is then limited to 64K, while data has a 1
                          MB range.


                          Large. Far pointers are used for both code and data, giving both a
                          1 MB range.

                          Huge. Far pointers are used for both code and data. Borland C++
                          normally limits the size of all static data to 64K; the huge memory
                          model sets aside that limit, allowing data to occupy more than
                          64K.
                          Ответить
                        • Ну как же, на тинях, вспоминай давай
                          Ответить
    • Астрологи объявили неделю %languagename%
      Ответить
    • .org 80h
      
      .include "stdvideo.inc"
      
      ; %al, overwrites ;
      abs:
      	test %al 1h
      	jz @.L2
      	neg %al
      	.L2:
      	ret
      
      ; %ch - x1, %cl - y1, %dh - x2, %dl - y2 ;
      drawline:
      	pusha
      	
      	mov %al %dh
      	sub %al %ch
      	call @abs
      	mov %ah %al ; ah - dX ;
      	
      	mov %al %dl
      	sub %al %cl
      	call @abs
      	neg %al ; al - -dY ;
      	
      	mov %b FFFFh ; bh - signX, bl - signY ;
      	
      	cmp %ch %dh
      	jgz @.S1
      	neg %bh
      	.S1:
      	
      	cmp %cl %dl
      	jgz @.S2
      	neg %bl
      	.S2:
      	
      	mov %el %ah
      	add %el %al ; el - error ;
      	
      	push %d
      	call @setpixelm1
      	pop %d
      	 
      	.loop:
      		cmp %ch %dh
      		jnz @.L1
      		cmp %cl %dl
      		jnz @.L1
      		jmp @.loop_end
      		.L1:
      		
      		push %c
      		call @setpixelm1
      		pop %c
      		
      		cmp %el %al
      		jng @.L2
      			add %el %al
      			add %ch %bh
      		.L2: 
      		cmp %el %ah
      		jgz @.loop
      			add %el %ah
      			add %cl %bl
      		jmp @.loop
      		
      	.loop_end:
      	
      	popa
      	ret
      
      start:
      	mov %sp FFFFh
      	outb 20h 1h
      	outb 21h 20h
      	out  22h @T1
      
      	mov %al 1h
      	int 10h
      	
      	mov %c 6050h
      	mov %d 0504h
      	
      	call @drawline
      
      	.loop:
      		jmp @.loop
      .org 1000h
      T1:

      ура, стандартная библиотека.
      кстати при чётных y2 почему-то не рисует, интересно почему
      Ответить
    • Очень трогательно... https://www.youtube.com/watch?v=9sI7WveN7vk
      Ответить
      • я прослезился
        Ответить
        • Больше никакого пива сраками, да?
          Ответить
          • теперь только с рыбкой
            Ответить
            • Если ты скушаешь рыбку, то на хуй не сядешь, и наоборот.
              Выбирай, что тебе ближе.
              Ответить
            • Рыбка тебя сдаст с потрохами Навальному.
              Ответить
              • Правое полушарие мозга отвечает за спортивные достижения, а левое за лирику
                Ответить
                • Интересная логика. А за что же в таком случае, отвечает среднее полушарие? Такое, извилистое...
                  Ответить
      • Какой робот с манипуляторами. Лучше бы чувак купил двух зеркальных карпов и сделал интерферометр.
        Ответить
    • Оказывается, я не видел эту прекркасную серию
      https://www.youtube.com/watch?v=_dydTviK8gY
      Ответить

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