Помощь OS как раз в виде [несуществующей в реале, но вполне возможной] функции NtOsLeaveProtectedMode.
И хитрые трюки тоже вполне возможны. Другое дело что это никому не надо -- какой смысл выходить в том же Windows в реальный режим? В чём сермяжная правда от этого? В чём цимес? Лично я не могу придумать никакой реальной пользы от этого.
Да почему же не можем прочитать? Мы же на нулевом кольце, поэтому что хотим то и читаем. Это раз. А два это то, что мы ведь всё ещё говорим про BSOD, да? А это, сюрприз, дело рук не какой-нибудь малвари, которая "ничего не знает про OS", а дело рук самой OS. Так что этим переходом из защищённого режима в реальный будет заниматься не mycoolprog.exe от абстрактного хакера j0hN $MiTh, а абстрактная функция NtOsLeaveProtectedMode где-то в недрах ядра OS, которая по дизайну будет иметь доступ ко всем internal таблицам и функциям этой самой OS. И обладая всей этой информацией эта функция прекрасно воссоздаст все необходимые вещи, включая пресловутый маппинг линейных адресов на физические.
Другое дело что эта функция не написана разработчиками ядра (хотя и могла быть написана). А вот почему она не написана -- "Впрочем, это уже совсем другая история" (C) Каневский.
Функция 9 прерывания int 21h не позволяет вывести знак доллара поскольку он является сигналом окончания строки. Можно использовать функцию 2 прерывания int 21h чтобы вывести отдельный символ, который кладётся в регистр DL. Тут ограничений нет, можно вывести любой символ, включая доллар.
К примеру можно в качестве окончания строки использовать нулевой байт как завершаются строки в C и C++ и выводить строку посимвольно. Приблизительно так:
.model tiny
.data
msg db "А тут будут три знака доллара: $$$ Вот они были только что!", 0
.code
mov si,offset msg
print_loop:
lodsb
test al,al
jz exit
mov dl,2
xchg al,dl
int 21h
jmp print_loop
exit:
mov ax,4c00h
int 21h
end
Это для tasm. Для nasm/fasm практически так же, только там вроде как нет директив .model, .code и .data
Ну да, это не совсем тривиально, но вполне возможно. Конечно обычный "программист на C#", а тем более "программист 1C" или того хуже "программист на JavaScript" или "программист на Python" это не сделает, но тот кто хотя бы умеет писать драйвера [для Windows или модули для Linux] вполне это осилит. Это раз уж мы говорим про процессоры x86/x64 и про т.н. "IBM PC Compatible" компьютеры. OS тут вообще никаким боком. Находясь на кольце #0 можно без проблем прочитать все необходимые page registers, все GDT, IDT и прочую кухню. Исходя из этого определить маппинг линейных адресов на физические становится очень даже возможным. Далее запрещаем прерывания, перезагружаем GDT и IDT, перезагружаем всё что относится к табличной адресации, заодно выключая её нафиг, загружаем в сегментные регистры корректные дескрипторы для real mode, сбрасываем младший бит в регистре CR0 для выключение protected mode и включения real mode, делаем длинный jmp для сброса кеша инструкций, разрешаем прерывания и вуаля, мы в обычно реальном режиме как после сброса.
Во времена 286 сбрасывать бит PE было невозможно -- регистра CR0 не существовало, а через lmsw/smsw это бит можно было только взвести для перехода из реального в защищённый, но сбросить никак. Поэтому приходилось делать аппаратный сброс процессора записью 0xFE в порт 0x64, предварительно записав в BDA (BIOS Data Area) по адресу 0x40:0x67 адрес куда процессор должен перейти после сброса вместо обычного для него цикла POST. А начиная с 386 у CPU появился CR0 в котором запросто можно было сбросить бит PE.
Как тут уже заметили DOS4GW это делал. И Phar Lap DOS Extender это делал. Даже досовский драйвер HIMEM.SYS это прекрасно умел делать.
Я со всем этим столкнулся впервые ещё на 286 (real mode/protected mode) в конце 80-х прошлого века, после уже на 386 и 486 (real mode/protected mode/v86 mode). Вот начиная с пентиумов у меня появилась другая работа и другие интересы и необходимость в подобном отпала. Поэтому с режимом SMM не сталкивался и знаю про него только понаслышке.
Достаем SIM-ку из телефона, заходим с ее помощью в Госуслуги (PIN на нее никто не ставит же)
Отучаемся говорить за всех ;-) К примеру я настолько параноик, что у меня пароли и пины на всё что только можно. И все пароли у меня разные. И не "12345", и не дата рождения, и не подобная банальщина, а примерно такие, какие генерирует pwgen из Linux. И это у меня началось не недавно, а с конца 80-х прошлого века -- у меня на домашнем (SIC!) компе, куда по идее кроме меня вообще никто доступ не имеет, помимо пароля на вход в OS обязательно ещё надо предварительно ввести и пароль на BIOS. И ничего, не жужжу, как говорится.
На ATARI я Shamus ни разу не видел, я и сам ATARI ни разу в жизни не видел. И да, в версии для IBM PC никакого синтезированного голоса не было. А Монтезуму я впервые увидел (и играл) на Apple ][e, уже много позже увидел на IBM PC.
Я про вот этот Shamus и про вот такого Монтезуму. Начала 80-х годов прошлого века, ещё CGA, ещё однофайловые и размером не более 64 килобайта чтобы в .COM умещаться.
Я из поколения "динозавров". Поэтому то, что на КДПВ, у меня вызывает приятные воспоминания, а вот скриншоты далее уже не то, нет той атмосферы... Порой, кстати, люблю тряхнуть стариной и запустить Монтезуму, ЛодРаннер, Шамуса, Диггера или ещё чего подобное. Как говорится кто на что учился кто с чего начинал в своё время ;-) Мне даже Larry и Space Quest самые первые, CGA'шные ещё, гораздо больше нравятся чем их более поздние версии на VGA (но по нынешним временам эти более поздние уже галимое старьё, "кринж" для зумеров).
symdeb в отличии от debug не входил в DOS, но входил в поставку MASM и в Windows SDK для Windows 3.x Умел делать абсолютно то же самое что и debug но чуть больше и чуть дружелюбнее в некоторых командах (если подобный интерфейс вообще можно назвать дружелюбным). Плюс AFAIR умел показывать символы в одном из первых форматов CodeView.
Ещё в далёкое время когда я пользовался OS/2 (в начале 90х прошлого века) и был подписан на все фидошные эхи из серии SU.OS2.* там всегда говорилось именно "МежДелМаш". А если кто-то "IBM" произносил как "АйБиЭм", то тот считался нубом и "ламером криворуким" и подвергался общественному порицанию :-)
Вижу только одно возможное объяснение этому. В те времена "один вэ эм рсат" были не особо распространены, а принтеры тем более. Поэтому тексты дикторам радио, ЦТ и прочего выдавались напечатанными на обычной пишущей машике. А на пишущих машинках тех врёмен естественно можно было печатать или кириллицей, или латинницей. Поэтому для "двухязычного письма" отсутствующие в кириллице буквы латинского алфавита заменяли похожими по начертанию буквами кириллицы или какими-нибудь похожими символами, в частности вместо буквы 'I' (ай) часто использовали '1' (цифра "ОДИН"). Так "IBM PC/AT" превращалась в "1ВМ РС/АТ". Поэтому дикторша на радио, которую я слышал, честно прочитала с выданной ей бумажки текст: "Один Вэ Эм РСАТ" (напечатанный знак деления вместо богоугодного слэша между "РС" и "АТ" она уже не стала озвучивать, а прочитала слитно -- "РСАТ")
Не до предела выделенной памяти, а до первого появления этого символа. И дальше выводить уже не будет.
Помощь OS как раз в виде [несуществующей в реале, но вполне возможной] функции NtOsLeaveProtectedMode.
И хитрые трюки тоже вполне возможны. Другое дело что это никому не надо -- какой смысл выходить в том же Windows в реальный режим? В чём сермяжная правда от этого? В чём цимес? Лично я не могу придумать никакой реальной пользы от этого.
Да почему же не можем прочитать? Мы же на нулевом кольце, поэтому что хотим то и читаем. Это раз. А два это то, что мы ведь всё ещё говорим про BSOD, да? А это, сюрприз, дело рук не какой-нибудь малвари, которая "ничего не знает про OS", а дело рук самой OS. Так что этим переходом из защищённого режима в реальный будет заниматься не mycoolprog.exe от абстрактного хакера j0hN $MiTh, а абстрактная функция NtOsLeaveProtectedMode где-то в недрах ядра OS, которая по дизайну будет иметь доступ ко всем internal таблицам и функциям этой самой OS. И обладая всей этой информацией эта функция прекрасно воссоздаст все необходимые вещи, включая пресловутый маппинг линейных адресов на физические.
Другое дело что эта функция не написана разработчиками ядра (хотя и могла быть написана). А вот почему она не написана -- "Впрочем, это уже совсем другая история" (C) Каневский.
Функция 9 прерывания int 21h не позволяет вывести знак доллара поскольку он является сигналом окончания строки. Можно использовать функцию 2 прерывания int 21h чтобы вывести отдельный символ, который кладётся в регистр DL. Тут ограничений нет, можно вывести любой символ, включая доллар.
К примеру можно в качестве окончания строки использовать нулевой байт как завершаются строки в C и C++ и выводить строку посимвольно. Приблизительно так:
Это для tasm. Для nasm/fasm практически так же, только там вроде как нет директив .model, .code и .data
Ну да, это не совсем тривиально, но вполне возможно. Конечно обычный "программист на C#", а тем более "программист 1C" или того хуже "программист на JavaScript" или "программист на Python" это не сделает, но тот кто хотя бы умеет писать драйвера [для Windows или модули для Linux] вполне это осилит. Это раз уж мы говорим про процессоры x86/x64 и про т.н. "IBM PC Compatible" компьютеры. OS тут вообще никаким боком. Находясь на кольце #0 можно без проблем прочитать все необходимые page registers, все GDT, IDT и прочую кухню. Исходя из этого определить маппинг линейных адресов на физические становится очень даже возможным. Далее запрещаем прерывания, перезагружаем GDT и IDT, перезагружаем всё что относится к табличной адресации, заодно выключая её нафиг, загружаем в сегментные регистры корректные дескрипторы для real mode, сбрасываем младший бит в регистре CR0 для выключение protected mode и включения real mode, делаем длинный jmp для сброса кеша инструкций, разрешаем прерывания и вуаля, мы в обычно реальном режиме как после сброса.
Во времена 286 сбрасывать бит PE было невозможно -- регистра CR0 не существовало, а через lmsw/smsw это бит можно было только взвести для перехода из реального в защищённый, но сбросить никак. Поэтому приходилось делать аппаратный сброс процессора записью 0xFE в порт 0x64, предварительно записав в BDA (BIOS Data Area) по адресу 0x40:0x67 адрес куда процессор должен перейти после сброса вместо обычного для него цикла POST. А начиная с 386 у CPU появился CR0 в котором запросто можно было сбросить бит PE.
Как тут уже заметили DOS4GW это делал. И Phar Lap DOS Extender это делал. Даже досовский драйвер HIMEM.SYS это прекрасно умел делать.
Я со всем этим столкнулся впервые ещё на 286 (real mode/protected mode) в конце 80-х прошлого века, после уже на 386 и 486 (real mode/protected mode/v86 mode). Вот начиная с пентиумов у меня появилась другая работа и другие интересы и необходимость в подобном отпала. Поэтому с режимом SMM не сталкивался и знаю про него только понаслышке.
Не знаю как сейчас, но раньше перевести процессор из защищённого режима обратно в реальный была задача более чем тривиальная.
Отучаемся говорить за всех ;-) К примеру я настолько параноик, что у меня пароли и пины на всё что только можно. И все пароли у меня разные. И не "12345", и не дата рождения, и не подобная банальщина, а примерно такие, какие генерирует pwgen из Linux. И это у меня началось не недавно, а с конца 80-х прошлого века -- у меня на домашнем (SIC!) компе, куда по идее кроме меня вообще никто доступ не имеет, помимо пароля на вход в OS обязательно ещё надо предварительно ввести и пароль на BIOS. И ничего, не жужжу, как говорится.
Если кто уверен что это просто прикол такой, то смею разуверить -- нет, это, увы, реальность. И хвалёный ИИ тут недалеко ушёл от "нового поколения".
"Is a mouse a device to point an Xterm to type in?" (C) откуда-то из интернетов. И я полностью согласен с таким определением мыши.
На ATARI я Shamus ни разу не видел, я и сам ATARI ни разу в жизни не видел. И да, в версии для IBM PC никакого синтезированного голоса не было. А Монтезуму я впервые увидел (и играл) на Apple ][e, уже много позже увидел на IBM PC.
Я про вот этот Shamus и про вот такого Монтезуму. Начала 80-х годов прошлого века, ещё CGA, ещё однофайловые и размером не более 64 килобайта чтобы в .COM умещаться.
Я из поколения "динозавров". Поэтому то, что на КДПВ, у меня вызывает приятные воспоминания, а вот скриншоты далее уже не то, нет той атмосферы... Порой, кстати, люблю тряхнуть стариной и запустить Монтезуму, ЛодРаннер, Шамуса, Диггера или ещё чего подобное. Как говорится
кто на что училсякто с чего начинал в своё время ;-) Мне даже Larry и Space Quest самые первые, CGA'шные ещё, гораздо больше нравятся чем их более поздние версии на VGA (но по нынешним временам эти более поздние уже галимое старьё, "кринж" для зумеров).Вообще-то 2025 год через четыре месяца уже закончится, а тут речь про то как расширится в первом квартале (январь-март).
symdeb в отличии от debug не входил в DOS, но входил в поставку MASM и в Windows SDK для Windows 3.x Умел делать абсолютно то же самое что и debug но чуть больше и чуть дружелюбнее в некоторых командах (если подобный интерфейс вообще можно назвать дружелюбным). Плюс AFAIR умел показывать символы в одном из первых форматов CodeView.
https://www.pcjs.org/blog/2018/02/25/
symdeb.exe наше всё! По интерфейсу как debug.exe, но чуть-чуть пофункциональнее.
Данный вопрос почему-то напомнил мне вот это: https://www.youtube.com/watch?v=aBhKhOMSj5Y
Такая кодировка была на ДВК и на терминалах VAX на лабораторных в МИРЭА. Ностальгия...
Ещё в далёкое время когда я пользовался OS/2 (в начале 90х прошлого века) и был подписан на все фидошные эхи из серии SU.OS2.* там всегда говорилось именно "МежДелМаш". А если кто-то "IBM" произносил как "АйБиЭм", то тот считался нубом и "ламером криворуким" и подвергался общественному порицанию :-)
Вижу только одно возможное объяснение этому. В те времена "один вэ эм рсат" были не особо распространены, а принтеры тем более. Поэтому тексты дикторам радио, ЦТ и прочего выдавались напечатанными на обычной пишущей машике. А на пишущих машинках тех врёмен естественно можно было печатать или кириллицей, или латинницей. Поэтому для "двухязычного письма" отсутствующие в кириллице буквы латинского алфавита заменяли похожими по начертанию буквами кириллицы или какими-нибудь похожими символами, в частности вместо буквы 'I' (ай) часто использовали '1' (цифра "ОДИН"). Так "IBM PC/AT" превращалась в "1ВМ РС/АТ". Поэтому дикторша на радио, которую я слышал, честно прочитала с выданной ей бумажки текст: "Один Вэ Эм РСАТ" (напечатанный знак деления вместо богоугодного слэша между "РС" и "АТ" она уже не стала озвучивать, а прочитала слитно -- "РСАТ")
В магазине "Пятёрочка" что возле моего дома таки бегают. Именно с ключём.