- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 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
ASD_77 16.02.2022 21:43 # −2
kcalbCube 17.02.2022 06:45 # 0
j123123 17.02.2022 08:31 # +1
Hu3KoypoBHeBblunemyx 17.02.2022 08:32 # 0
kcalbCube 17.02.2022 09:18 # 0
j123123 17.02.2022 09:25 # 0
Kypumca 17.02.2022 09:32 # 0
guest6 17.02.2022 13:49 # 0
OPAHrymaH 17.02.2022 19:54 # 0
guest6 17.02.2022 20:01 # 0
ObeseYoung 17.02.2022 13:31 # 0
Floating_cockerel 17.02.2022 13:32 # 0
OMuKPOH 17.02.2022 22:44 # 0
j123123 18.02.2022 06:25 # 0
Noodles 17.02.2022 10:18 # +1
OPAHrymaH 17.02.2022 11:14 # 0
bormand 17.02.2022 11:21 # +1
Как-будто в винде и линуксе фиксапов нет...
Тем более после прихода ASLR, который закидывает экзешник хрен пойми куда.
З.Ы. В линуксе pic, ему можно не патчить.
OPAHrymaH 17.02.2022 11:37 # 0
В Висте появилось ASLR, и снова стали собирать экзешники с фиксапами, чтобы их можно было «закинуть хрен знает куда».
OPAHrymaH 17.02.2022 11:46 # +1
В ebx теперь лежит адрес @1. К адресам данных теперь можно добавить ebx-@1, тогда в экзешник они лягут без фиксапов. Возврата не будет, потому что адрес возврата из стека вытолкнули.
Да, колл без рета. Такое вирусы любили использовать, потому что их никто патчить не будет.
j123123 18.02.2022 06:26 # 0
ObeseYoung 17.02.2022 11:23 # 0
guest6 17.02.2022 13:11 # +2
bormand 17.02.2022 13:18 # +1
guest6 17.02.2022 13:21 # 0
bormand 17.02.2022 13:22 # 0
З.Ы. Хотя не, там другие инварианты на старте, экзешник поди сам сегментные регистры выставляет.
guest6 17.02.2022 13:23 # 0
bormand 17.02.2022 13:24 # 0
guest6 17.02.2022 13:29 # 0
Для EXE он должен сделать какую-то интеллектуальную работу, а COM просто загружает.
Но когда EXE только появился, он различал именно по расширению. А потом перестал.
Почему?
bormand 17.02.2022 13:31 # +1
guest6 17.02.2022 13:33 # +2
COMMAND.COM и FORMAT.COM нельзя переименовывать не сломав к хуям примерно всё, хотя они уже и повылазили за 64K -- размер сегмента.
А вдруг COM файл начнется с MZ?
А не начнется, потому что MZ это
Прекрасный Реймонд Чен поясняет
kcalbCube 17.02.2022 13:52 # 0
OPAHrymaH 17.02.2022 18:59 # 0
kcalbCube 17.02.2022 13:32 # 0
guest6 17.02.2022 13:43 # 0
OPAHrymaH 17.02.2022 18:57 # 0
Винда их нормально запускает как приложение Win32, несмотря на расширение .com.
guest6 17.02.2022 18:58 # 0
Тупо, что оно 32 бита (майки наговнокодили и десятый год не могут перевестись в 64) но всё же оно .exe
OPAHrymaH 17.02.2022 19:01 # 0
guest6 17.02.2022 19:05 # 0
но всё, что он делает, это запускет .exe. Этакий трамполин.
наверное для совместимости с visual studio 4.0
OPAHrymaH 17.02.2022 19:10 # 0
ISO 17.02.2022 19:07 # 0
guest6 17.02.2022 19:07 # 0
666_N33D135 17.02.2022 19:11 # 0
HE_OTBE4Au_YE6KY 18.02.2022 09:32 # 0
Steve_Brown 18.02.2022 19:29 # 0
Rooster 18.02.2022 19:33 # 0
guest6 18.02.2022 21:11 # 0
guest6 18.02.2022 21:18 # 0
guest6 18.02.2022 21:11 # 0
OPAHrymaH 17.02.2022 19:22 # 0
Однако, для таких экзешников, если они влезают в 64К, был псевдоконвертор: он перед сигнатурой MZ прилеплял загрузчик в формате com-файла, который читал заголовок экзешника, рассовывал его секции по сегментам памяти и патчил фиксапы, а потом передавал управление. Я не помню, решали ли там задачу двойного потребления памяти.
Программы, сконвертированные псевдоконвертором, можно было восстановить в exe. Была программа com2exe, написанная... да, Фабрисом Белларом, кем же ещё.
ObeseYoung 18.02.2022 06:30 # 0
If Force Far Calls is off, the compiler uses the NEAR call models for any procedures or functions within the file being compiled.
тоесь нихуа не large
Ga_Dong_Tao 18.02.2022 06:32 # 0
KaBauHblu_nemyx 18.02.2022 07:32 # 0
OPAHrymaH 18.02.2022 07:37 # 0
yet_another_one_shit 18.02.2022 08:32 # 0
ObeseYoung 18.02.2022 10:26 # 0
OPAHrymaH 18.02.2022 10:38 # 0
Кстати, в ТП тип pointer и типизированные указатели (хоть на данные, хоть на функции) всегда far. Нельзя объявить переменную, чтобы она хранила near-указатель. Поэтому и к «ближним» процедурам и функциям нельзя применить операцию @ и их нельзя передать в другую процедуру или функцию как аргумент.
В качестве параметра f можно передать только far-функцию.
ObeseYoung 18.02.2022 11:01 # 0
OPAHrymaH 18.02.2022 11:20 # 0
Т. е. в сишке можно было так:
Если модификатор far/near не указан, то размер указателя выбирался по текущей модели.
По умолчанию far-указатели и на код, и на данные были в модели large.
Получается, что модель ТП больше всего похожа на модель large, но с исключением: неэкспортируемые процедуры и функции по умолчанию были near (но они были неполноценными, потому что даже в пределах модуля на них нельзя было брать указатель).
BOKCEJIbHblu_nemyx 18.02.2022 11:32 # 0
OPAHrymaH 18.02.2022 11:53 # 0
ObeseYoung 18.02.2022 12:22 # 0
KaBauHblu_nemyx 18.02.2022 12:32 # 0
guest6 18.02.2022 13:02 # +2
У каждого компилятора могут быть свои модели
OPAHrymaH 18.02.2022 13:21 # 0
В некоторых компиляторах отсутствовала модель тайни, для получения com-файла нужно было выбирать смолл и указывать дополнительные параметры, чтобы стек не создавался.
Kypumca 18.02.2022 13:32 # 0
ucnaHckuu_CTblD 18.02.2022 15:10 # 0
deneg.net
raboty.net
schastya.net
mozgov.net
Ответить
guest6 18.02.2022 15:19 # 0
ObeseYoung 18.02.2022 19:14 # 0
bormand 17.02.2022 13:25 # 0
Думаешь я помню их названия?
Вроде что-то среднее, с far для данных и near для кода.
OPAHrymaH 17.02.2022 13:59 # 0
Каждый модуль, перечисляемый в uses, линкер клал в отдельный сегмент.
Можно было объявлять функции с директивой near, чтобы получить более оптимальный код (near- и short-джампы были rip-based и не требовали фиксапов), но поскольку все указатели были только far, то адреса near-функций нельзя было класть в указатели и куда-нибудь передавать, также их нельзя было экспортировать в другие модули.
OPAHrymaH 17.02.2022 14:10 # 0
OPAHrymaH 18.02.2022 09:44 # 0
Вопрос: нафига?
Ответ: call near будет rip-based, поэтому фиксапа не будет. Такой заменой получается pic.
OPAHrymaH 17.02.2022 13:52 # 0
guest6 17.02.2022 13:55 # 0
OPAHrymaH 17.02.2022 14:05 # 0
В тройке не было модульной системы, поэтому для использования библиотек применяли чёрную магию:
https://govnokod.ru/19045
guest6 17.02.2022 14:10 # 0
Я ходил в некоторый аналог дворца пионеров, и там был turbo или borland паскаль (отличался набором либ, всяким OWL, вроде оверлеями и пр), на тот момент это было очень продвинуто.
OPAHrymaH 17.02.2022 14:13 # 0
guest6 17.02.2022 14:15 # 0
Турбо влазил на дискету, а борманд -- нет.
Кстати, IDE сама была под дос (подозреваю турбо вижн) а писать можно было и под винду и OWL. Все помнят эти кнопочки с зеленой галочкой и красным крестиком, да?
OPAHrymaH 17.02.2022 14:19 # 0
OPAHrymaH 17.02.2022 14:18 # 0
Были ещё пиратские сборки «на двух дискетах», которые я терпеть не мог. В конце 1990-х уже ни у кого не было 20-мегабайтных винчестеров, чтобы так экономить.
guest6 17.02.2022 14:23 # 0
OPAHrymaH 17.02.2022 14:31 # 0
В пакете Борланд были те же самые компиляторы, которые были в раздельных пакетах Турбо, и даже те же самые библиотеки. Разница была только в том, что в Борланд это всё засунули в один установочный пакет.
Правда, в Борланд дополнительно положили ещё одну версию IDE и компилятора. Обычные turbo.exe и tpc.exe были под реальный режим, а bp.exe и bpc.exe (которые клали только в Борланд, но не клали в Турбо) работали в защищённом (через бормандовскую прослойку RTM+DPMI), так что могли использовать больше оперативки (это было важно при компиляции огромных программ). Эти компиляторы поддерживали одни и те же языковые конструкции и генерировали одинаковый код, и библиотеки были одинаковыми, разница была только в доступной компилятору и IDE оперативке.
KaBauHblu_nemyx 17.02.2022 14:32 # 0
guest6 17.02.2022 14:34 # 0
Если ты студень, то тебе хватит турбы для лаб.
Если ты пишешь коммерческий софт, то тебе уже не скомпилица турбой, и нужен борманд. Думаю, так.
OPAHrymaH 17.02.2022 14:34 # 0
guest6 17.02.2022 14:37 # −1
OPAHrymaH 17.02.2022 14:43 # 0
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.
ObeseYoung 17.02.2022 15:15 # 0
OPAHrymaH 17.02.2022 15:23 # 0
guest6 17.02.2022 15:27 # 0
>менять заголо
помнишь ANSI.SYS? Поди, через него можно было?
Floating_cockerel 17.02.2022 15:32 # 0
guest6 17.02.2022 15:37 # −1
Славилась доброй душой
(с)
OPAHrymaH 17.02.2022 15:33 # 0
ANSI.SYS про другое. Он интерпретировал эскейп-последовательности в стандартном выходном потоке.
guest6 17.02.2022 15:35 # −1
Это, пардон, кокая? Там была только ``command.com`` же.
консоль (cmd.exe, Win32API Console API) были тока в NT.
Или я вру?
>ANSI.SYS про другое.
А знаешь, как в прыщах программы устанавливают тайтл у окна эмулятора терминала?
OPAHrymaH 17.02.2022 15:37 # 0
FAR, который был чистым portable executable для win32 console API, в Win95 работал.
guest6 17.02.2022 15:39 # 0
https://en.wikipedia.org/wiki/Cmd.exe
моя память -- тоже. Но мы можем врать (четверть века прошла всё таки), так что я наверное и правда скачаю на досуге, да посмотрю.
Так что с тайтлами xterm, putty и пр? Знаешь, как их устанавливают?
>far
хм.. и пправда
ааа!!
вот как дело было
https://en.wikipedia.org/wiki/Windows_Console#Windows_9x
но cmd.exe там не было
OPAHrymaH 17.02.2022 15:46 # 0
Но Win32 console API точно было. Я точно помню программы в формате portable executable, которые в DOS не работали, а в Win95 работали. Помню, что в Win95 console API были реализованы все функции с суффиксом A (ANSI), а вот с функциями с суффиксом W (Wide, что означает поддержку UTF-16) была беда, были реализованы не все, поэтому некоторые консольные программы, предназначенные для NT, в Win95 могли не работать.
guest6 17.02.2022 15:51 # 0
Но API было, хотя и урежанное (работало оно в v86, как я там выше дал ссылку). Иными словами, любая соснольная херня в win9x всегда порождала 16-ти битный процесс, как я понял.
И ты прав на счет "A": в 9x всё было "A", а в NT -- "W".
Отсюда у нас TEXT() и прочие хаки
ObeseYoung 17.02.2022 15:56 # 0
OPAHrymaH 17.02.2022 16:11 # 0
Ядром системы был 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-битных не стало.
OPAHrymaH 17.02.2022 16:24 # 0
Да, в Windows 3.1 уже были 32-битные vxd-драйвера, хотя я не знаю, зачем, ведь ядро и API были 16-битными.
Kypumca 17.02.2022 16:32 # 0
OPAHrymaH 17.02.2022 15:58 # 0
В Win95 консоль была реализована через жопу. В Win 3.x был vdm.exe (или как-то так), который умел рисовать чёрное окошко для досовских программ.
В Win95 решили для рисования консоли взять за основу этот код из Win 3.x, чтобы не писать с нуля. Поэтому в Win95 при запуске любого приложения win32 console API прицепом загружалась VDM, что создавало дополнительную нагрузку.
cmd.exe действительно был только в NT и в OS/2.
ucnaHckuu_CTblD 17.02.2022 16:00 # 0
guest6 17.02.2022 16:02 # +1
Правда, в ту пору консоль считалась устаревшей, легаси для старого говна, а светлое будущее должно было состоять примерно из MFC.
Иронично, что 90% софта у ту пору было как раз таки под дос
ObeseYoung 17.02.2022 15:46 # 0
OPAHrymaH 17.02.2022 15:41 # 0
Я тебя понял. Оригинальный ANSI.SYS писался под голый ДОС и про сервисы, предоставляемые VXD, не знал. Но если его дописать, то такую функцию реализовать можно.
OPAHrymaH 17.02.2022 18:44 # 0
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++ вроде).
OPAHrymaH 17.02.2022 18:44 # 0
Я не знаю реальные примеры программ, которые бы использовали расширитель Pharlap для Windows. Когда появился Win32s, стали писать программы под Win32 API и запускать через него. Например, древний 32-битный Фотошоп спокойно запускался не только в NT и в Win95, но и в Win 3.x через Win32s.
HE_OTBE4Au_YE6KY 18.02.2022 09:32 # 0
yet_another_one_shit 18.02.2022 09:32 # 0
OPAHrymaH 17.02.2022 15:09 # 0
Для поддержки массивов более 64К в 16-битном коде нужно было крутить сегмент. В защищённом режиме для этого нужно плодить записи в LDT или крутить базу.
В Борманд Паскале сделали проще: не стали реализовывать модель Huge. Т. е. писали код так, чтобы массивы и объекты укладывались в 64К. Если нужно было больше 64К, использовали датастримы: в библиотеке Турбовижн были классы, предоставляющие интерфейс к памяти как к файлу. Или использовали связанные списки и деревья, у которых каждый узел аллоцировался отдельно.
ObeseYoung 17.02.2022 13:30 # 0
bormand 17.02.2022 13:33 # 0
guest6 17.02.2022 13:39 # 0
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.
ObeseYoung 17.02.2022 13:50 # 0
> 1 MB range
ucnaHckuu_CTblD 18.02.2022 15:37 # 0
JlAKOMKA 16.02.2022 22:13 # 0
kcalbCube 17.02.2022 13:38 # 0
ура, стандартная библиотека.
кстати при чётных y2 почему-то не рисует, интересно почему
ucnaHckuu_CTblD 17.02.2022 18:37 # 0
guest6 17.02.2022 17:32 # 0
digitalEugene 17.02.2022 19:22 # 0
guest6 17.02.2022 19:29 # 0
kcalbCube 18.02.2022 08:55 # 0
HE_OTBE4Au_YE6KY 18.02.2022 09:26 # 0
Выбирай, что тебе ближе.
ObeseYoung 18.02.2022 10:27 # 0
Rooster 18.02.2022 10:32 # 0
ucnaHckuu_CTblD 18.02.2022 10:46 # 0
ObeseYoung 18.02.2022 10:41 # 0
guest6 17.02.2022 19:14 # 0
https://www.youtube.com/watch?v=_dydTviK8gY