Pull to refresh

Comments 77

Мсье знает толк…
Осталось сетевой стек запрограммировать (конечно, тоже в опкодах), и вуаля — идеальный компьютер для написания постов на Хабр, имунный к любым обновлениям ОС.

PS. Жена определённо права.

Думаю, сначала всё-таки драйвер swap на опкодах и, а потом уже и TCP/IP, а то в 640 килобайт даже хромовый тирекс не влезет


/конец ночному пятничному сарказму

Думаю, сначала всё-таки драйвер swap на опкодах и, а потом уже и TCP/IP, а то в 640 килобайт даже хромовый тирекс не влезет
Действительно, стек от МС занимает около 350 КБ, оставляя памяти только на «Hello Habr».
Но необязательно. Есть расширители DOS, переводящие процессор в защищённый режим, Open Watcom, например, поддерживает парочку (правда, +700К Б к исполнимому файлу). Есть стеки экономичные, в Watcom поддерживается wattcp. smb толстоват, но можно и его впихнуть, зато самый маленький ftp сервер, который удалось найти добавляет всего 27 КБ.
Для пуристов есть Unreal mode процессора, предоставляющий 4 ГБ ОЗУ. 4 ГБ опкодов, ага. Программа unreal.com, переводящая процессор в этот замечательный режим весит 2,5 КБ ЕМНИП.
При работе с Unreal надо учитывать, что читать/писать в 4Гб можно, а вот выполнять код… Уж проще в flat protected перейти с одним сегментом. Правда прийдется написать кучу драйверов, т.к. биосных прерываний больше не будет.
Биос и весь первый мегабайт вызывается в V8086 когда надо.
Это конечно можно (и Windows 95/98 это даже делали штатно, когда отсутствовали драйвера для некоторых железок(контроллера жесткого диска например)), но это дикая трата процессорного времени.
Всё уже придумано до нас, у ASUS была Express Gate на десктопных материнках и ноутбуках (в бюджетных моделях ставилась прямо на системный накопитель, а в топовых — на распаянный 16-гиговый SSD). Как раз для того, чтобы фоточки посмотреть, в скайпе пообщаться и интернет посерфить без необходимости грузиться в основную ОС.

Да что уж там, на ноуте RoverBook в 2006-м было нечто подобное. Но, насколько помню, там был сверхподрезанный Линукс с какой-то по-дизайнерски изысканной оболочкой

Еще встречался встроенный CD плеер.

Причем аппаратный, и прямо в CD-ROM

Не спится, зашёл на Хабр — как же приятно увидеть эталонно оформленный пост! Тема поста не моя, но всё равно лайк :)

Боюсь, Докер и хостовая система не вынесут такого насилия и ссыпятся с какой-нибудь страшной ошибкой типа Segmentation Fault

Видел QEMU в контейнере, но смысл не понял
А чем, в понимании автора, собственно, отличаются опкоды от (языка) «ассемблеров»?

Ассемблер требует трансляции в опкоды (т. е. в машинные коды).
Опкоды мы можем скормить процессору на исполнение.


Ну и сложностью добывания и написания, конечно же :)

Ещё опкоды проще вводить наощупь, с помощью тумблеров.

Очень порадовала статья, давно не видел подобных статей аж ностальгия пробирает.
Автору огромный респект!!!

Какой же груз legacy тянут современные x86 компьютеры. Поискал, оказывается, даже современные видео карты умеют CGA/EGA режимы — с разной степенью успеха, народ на зеленоватый оттенок палитры жалуется, но умеют. Если честно, поражен…
А ещё время реакции системы было на уровне долей микросекунды, а не пятисот, как сейчас.
Тянуть тянут, но вот не очень честно (хотя надо будет для интереса глянуть на обработчик invalid opcode в современном UEFI с CSM режимом) — новые инструкции потребовали несколько испортить совместимость со всякой древностью какраз в опкодах и их префиксах.
А не с них ли начинается инициализация видео? Текстовый режим 80×25 — это ж CGA…

Вот целую рабочую неделю думал об этом и придумал: может оно и к лучшему? ©


Всё-таки, если бы не такое адовое легаси это потенциально породило бы кучу проблем:


  • В смысле, больше четырех разделов на диске? Наш софт это не поддерживает! (Нет, расширенный раздел мы никогда и не поддерживали, ох уж мне эти проделки дьявола.)
  • Что значит «Boot-сектор нельзя забэкапить на дискету»?! (Недавно показывал 3.5’’-дискету 18-летней знакомой, сказал, что это девайс для наблюдения затмений.)
  • Алло, я подключил любимый NEC Multisync FP950Plus, у меня нет картинки… Алло?.. Ал...
  • Возможно и не было этой заметки, потому что пришлось разбираться с 64-битными машкодами и исполняемым кодом для UEFI, а я слишком ленив, да и числа больше F считаю с трудом.

Да не омрачит карантин и изоляция сегодняшний день!

Хотелось бы предостеречь автора поста. То, чем Вы занялись — очень опасная вещь! Страшно заразная и ничем не лечится. Прошло более сорока лет, а я иногда ловлю себя на том, что где-нибудь на совещании или просто, когда есть чем писать и на чем писать машинально вывожу на бумаге что нибудь этакое — 31 FF 01 CD 03 F8 4F CD 09 F8 C3 03 00…
Берегите себя! Хочется еще что-нибудь почитать вашего авторства.
Я так в юности «мультики» рисовал, записывая в память последовательность нажатий кнопок и перемежая кадры очисткой экрана 1F, чуть более сложной программой. Даже не сохранял ее, быстрее на память ввести было. До сих пор коды помню.
Ваша правда. Но есть средство — CD 19.
FA EB FE в качестве лечения :)
F0 0F C7 C8 — тоже вспоминается.
Тааакс, у вас скорее всего там нет обращений ко всяким eax и прочим 32битным регистрам. А вот что за 0300 после retn?
Наверное огорчу Вас, но это опкоды I8080… Я же пишу, что прошло более 40 лет.
LXI SP,01FFH
CALL F803 (ввод с клавиатуры)
MOV C,A
CALL F809 (вывод на экран)
JMP 0003
Еще бы, живые динозавры ведь не каждый день встречаются.
С вероятностью 50% встретился :)
i8080-то больше 40 лет, но судя по адресам, это Радио-86РК, то есть не больше 34 лет. Или адреса от чего-то более раннего, с чем он был совместим?
Ну как Вам сказать, посмотрите мой профиль и публикации…
Не ожидал пересечься с Вами… мой первый компьютер рк-86 собранный по публикациям в журнале радио. Клавиатура — герконовые кнопки от калькульторов и наборы «штрих-м», корпус из двух доноров для клавиатуры и бессонные ночи в процессе оживления :-) я тогда ещё в школе учился из источников знаний журнал радио, советы отца. Скорее всего именно эта разработка определила род моих занятий по сей день. Спасибо Вам!
Я и коллеги просто поделились полученным удовольствием…
Я думаю, что я был далеко не единственным, кто получил сравнимое удовольствие, повторяя Вашу разработку. Ещё раз Огромное Спасибо!
31 FF 01 CD 03 F8 4F CD 09 F8 C3 03 00…


Дайте угадаю:
LXI SP,01FF
CALL F803
MOV C,A
CALL F809
JMP ..03

Судя по обращению к подпрограммам системного монитора — Микроша.
Если дизассемблировали по памяти, то приветствую товарища по несчастью… Эти HEX-коды так приживаются в нейронной сети, как будто они ее родные дети. А что касается таблицы системных вызовов, то ее первая инкарнация была еще в Intel MDS-800 (The Intellec Microcomputer Development Systems).
Да, по памяти. Но не «через годы», а просто увлекаюсь ретрокомпьютерами, и, в общем, постоянно поддерживаю «знание».
… приветствую товарища по несчастью...

Я Вас тоже приветствую, однако не считаю это несчастьем. Я пишу и под AVR и под STM32, и, бывает, под 8086, и все на ассемблере. При переходе между проектами и платформами некоторое время путаюсь в синтаксисе, но ненадолго.
Ну не воспринимайте «несчастье» так буквально. Немного иронии и самоиронии даже в двоичном коде не помешают…
А еще вирусы любили MBR. В стародавние времена, подхватишь такой и никакое форматирование винта не помагало, пока не очистишь MBR))
Даже лет 20 назад во многих биосах была функция защиты MBR от записи.

Но, кстати, на моих престарелых ноутбуках такой штуки нет — затирай сколько угодно

Какая прелесть, этот полуночный бред (см. время публикации)!
Просто замечательно, что есть люди, стремящиеся понять: а как командовать железом? Вместо всех этих слоёв шелухи.
Как раз на днях возникла идея загрузить BeagleBone своей простой программой прямо с карточки SD, чтобы поморгать лампочкой без всяких там линуксов… Не хватило усидчивости.
Видел где-то для распберри примеры, а вот для BB не нашел. Может, кто подскажет?
Вам надо лезть глубоко и далеко в доку на Texasовский ARM, который там стоит.

В универе как-то было несколько лабораторных работ, в которых требовалось написать несложные программы для эмулятора PDP-11, и делать это предлагалось сразу в опкодах. Но для себя в итоге решил что, проще будет написать корявенький компилятор ассемблерного кода под этот эмулятор, чем так страдать, набирая программы в опкодах.

Я посчитал, что полезно (после Python) немного пострадать, тем более больно почти не было.


Но самодельный транслятор — это идея...

UFO just landed and posted this here

Всегда можно поморгать светодиодом харда и попищать спикером!

Автору — респект. Вспомнил, как писал школьную выпускную программу на ассемблере… Ну и прочие штучки прямо в кодах на уроках…
Как перестать залипать в эту штуку?


r/m16/32 — сперва мозг ломается от такого описания операндов. Но со временем привыкаешь. И почему то легче всего воспринимаются MMX и SSE из всего остального в спецификации по ссылке.
r/m16/32 — сперва мозг ломается

Тут, как в 1С: мозг ломается только первые две недели, потом втягиваешься

Можно было бы и не тревожить BIOS понапрасну. Начиная с B800:0000 нечётные код символа, четные атрибут. Если подойти к вопросу с особым цинизмом, можно весь массив трансфернуть через DMA пересылкой MEM2MEM. ;-)
Если уж совсем заморочиться, можно закинуть в x0f регистр RTC x05, по адресу 0040:0067 записать адрес своего обработчика и наслаждаться недоумением пользователя «Почему кнопка reset не работает?» :-) (но в обработчике придется восстановить режим работы видеоадаптера и помнить что жизнь началась заново и регистрах ничего полезного и не забыть в x0f положить x05 и восстановить адрес обработчика в 0040:0067)
Кнопка reset увы ничем (кроме ME/AMT/BMC и прочих уже около-серверных механизмов) не блокируется.
Это не блокировка, это «трюк» с POST и особенностями «входа/выхода» в защищённый режим интеллового процессора, начиная с 286. значения x05 и x0A сообщают о том что сброс был по смене режима. Штатно сброс программный, периферия не сбрасывается. По кнопке сбрасывается ещё и периферия, но RAM не очищается, «восстановить» видеоадаптер не самая сложная задачка. Когда-то давно я этот трюк использовал для снятия дампа памяти. :-)

Так, я решительно требую ответной статьи со всем вышеописанным :)

Это ж было 25 лет назад :-) Вчера в бесплодных попытках вспомнить, что куда и зачем смог найти единственный источник «ISA system bus architecture». За прошедшие 25 лет в памяти остались только воспоминания о принципе :-( Хотя в те времена было много подобных извращений, начиная от хранения данных в GAP между секторами на флоппе, затирания кода в памяти для защиты от дебагеров и прочего. Все кануло в Лету.
Были даже специально прожженные нечитаемые сектора на дискете…
Флоповод со сдвоенным шпинделем, данные просто аналогом, а дырки — оптопара и игла от швейной машинки + электромагнит… :-) Автору поста огромнейший респект за напоминание давно забытого старого!
Не угадали. Это была чья-то фирменная защита от копирования — установщик читал определенный сектор, если дисковод выдавал ошибку — значит, дискета подлинная, если читается нормально — пиратская копия…
Не угадывал, то что выше, это способ, которым я как раз тиражировал дискеточки с такой защитой ;-) «вырезать» защиту программно в моем случае сходу не удалось. А вообще там было чуть более сложнее, чем просто нечитаемый сектор. Там была проверка на каком бите возникала ошибка. Потом от этого ушли и стали считать длину post gap, там уже до полубита была точность. Но аналоговое копирование спасало и от этого. :-)
Один из вариантов защиты — инсталлятор устанавливал свой обработчик на прерывание по ошибке чтения с дискеты, обработчик сверял номер сбойного сектора с записанным в файле, при совпадении установка продолжалась дальше.
Автоматизация прожига дискеты необязательна — можно просто прокалывать иголкой дискету по бумажному шаблону — в сектор попасть таким образом не получится, но в несколько дорожек — вполне, тогда проверять номер дорожки с нечитабельным сектором.
Был такой вариант — его проще обойти своим резидентом в цепочке. Чтение сектора и определение в каком именно бите «дырка» делается прямым доступом к контроллеру флопа, обходить этот вариант существенно сложнее. Гораздо проще поступить как я писал выше — два флоповода бутербродом с механической связью шпинделей, синхронизация нулевой позиции диска вручную ну а копирование информации аналоговым способом( аля двух кассетный магнитофон :-) ) в принципе можно и не заморачиваться с дырками (при аналоговом копировании сбойный сектор копируется as is но некоторые производители ещё и контроль именно дырки делали. Инсталляция, в процессе нашли дырку в нужном месте, убедились что дискета «родная» перезаписали сектор, вычислили новое смещение, проапдейтили код защиты (там тоже «развлекались» как могли от банального XOR до перестановок с использованием ПСЧ). а когда надо из оригинала сделать более одной копии, без автоматизации никак ;-)
Тогда для каждой легальной копии нужно писать «карту» битых секторов, что увеличивает время тиражирования. Да и баги потом отлавливать — угадывай, у какого клиента какой битый сектор был…
Нет же :-) сектор всегда один (2,3, n это не важно) далее простая задача — найти смещение в битах от начала сектора и использовать это число, как условный ключ. Который можно проверять при каждом запуске или использовать для кодирования какой либо части инсталляшки или бинарника. На заводе набили дырок и за два прохода записали софт. На первом проходе нашли смещения дырок, сделали XOR (просто для примера) части кода. На втором записали на дискету. При запуске инсталляции опять нашли смещения и восстановили ранее закодированное. Или (как в большинстве случаев и делали) запустились прям с дискеты и на лету восстановили что надо. Все остальное — попытки усложнить жизнь потенциальному злоумышленнику — проверить действительно дырка или просто «провал» намагниченности (надо записать сектор по новой, но при этом битовое смещение дырки изменится, надо учесть и переписать кодированные сектора с учётом изменений) полученное число использовать как «мегаважную» константу, указывающую на смещение джампа в коде, для обхода ловушки на использование пошаговой отладки как это использовать, было очень много вариантов, а с учётом того что «взять нормальный дебаггер» или «запустить в виртуалке» в те времена было невозможным, такая защита работала и была адекватной. Да IDA в те времена уже была и можно было ей ковырять чужой код с вполне хорошей «производительностью» но все же тупое повторение дискеты было проще и быстрее.
Начиная с B800:0000 нечётные код символа, четные атрибут.


bits 16
org 7C00h

mov ax, 3
int 10h

mov ah, 07h
mov si, msg
xor di, di

push es
mov bx, 0B800h
mov es, bx

print:
lodsb
test al, al
jz exit
stosw
jmp print
exit:
pop es

msg: db "Hello habr", 0
times 510-($-$$) db 0
dw 0xaa55


Подозреваю что то такое в итоге получиться должно.
Добавить цикл, добавить inc ah и получится версия топикстартера, только без насилования биоса
UFO just landed and posted this here
Хорошая статья! А как все это в двоичных кодах написать? :)

Хм. Так в статье же вроде написано всё:


  • xxd -r -p высыпет файлик с hex-ами в бинарь (который можно сразу подсунуть эмулятору),
  • который dd сможет нарезать на живой диск.

Или я не понял вопрос?

Sign up to leave a comment.

Articles