All streams
Search
Write a publication
Pull to refresh

Comments 55

Есть ли корректная эмуляция портов программируемого контроллера прерываний и прочей периферии которую можно было программировать через порты?

Я думаю, что dosbox вполне корректно эмулирует базовую переферию. Такую, как контроллер прерываний и т.п.

Чёрт, сразу вспомнился тот резидентный справочник по прерываниям... э-э-э, забыл уже название: hhelp или типа того. Там, понятно, не только про прерывания было, штука была незаменимая. Интерфейс ещё такой зелёный.
Стоп, нет: сама программа была просто для демонстрации справки по горячей клавише, а к ней уже у меня была прикручена справка по прерываниям.

Не "Tech! Help" случайно? Он мог быть резидентным, а мог просто запускаться как обычная программа.

Точно! Он самый!

Да уж. Прямо детство. Не пионерское, постарше. Но детство. debug.com, правда, не сильно любили. Скорее Turbo Debuger, а потом и более интересные варианты. Буквально следом должен идти перевод Криса Касперски о том, как взломать хиты времен MsDOS.

Надо ли только это хоть кому-то? Уже и в ассемблер для контроллеров мало кто заглядывает, что тут про специфичную археологию времен DOS да еще с "$"-терминированными строками. Хотя, безусловно, там было очень много интересного.

Кому-то, может быть, надо. Штуки вроде DOSBox весьма интересны с точки зрения изучения принципа построения машинного кода и отладки на низком уровне.

Может быть. Мне, как человеку заставшему код на 80186 без всяких MSDOS и в последствии занятым как раз низкоуровневым для ПК (в основном для Linux), да контроллерами, включая незабвенные 8051 с очень похожим ассемблером, уже начинает казаться что это нечто типа набившего оскомину Cobol'а у импортных финансистов.

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

Эх, статья интересная конечно, особенно лет 30 так тому назад. Жаль что винда отказывается нативно запускать com-файлы.

Сейчас было бы любопытно почитать про 64 бита от нажатия копки питания, до запуска ОС. Тот же 64 ABI для виндов и линукса.

debug.com, правда, не сильно любили.

symdeb наше фсё! По сравнению с debug гораздо более продвинутый, хотя внешне весьма похож. Ну а Turbo Debugger гораздо позже, мой любимый отладчик был. А особено TD386, который умел делать аж хардварные брекпойнты. Но это уже совсем много позже когда мне на работе выдали компутер с 80386.

Эх, сколько игр было пройдено путём делания себе неубивамости при помощи TD!

А вот отладчик от Microsoft под названием CodeView я ненавидел всеми фибрами, мне он был жутко неудобен после истиной юзабилити от Borland. Как, впрочем, и всё от Microsoft. Тот же Visual C даже сравниться не мог с Turbo C по удобству.

Немного смущает то, что обещали 8086, а фактически рассказали про IBM PC XT, с ее особенностями по раскладке памяти, использованию именно 8259A в качестве контроллера прерываний и т.п.

Когнитивное искажение автора. Я видел системные контроллеры для ТОС ЭЛКОС (телефонная станция производства Борисоглебского завода) на базе 8086. И софт для них, вроде бы, на Турбо Си делался. Но доступа к этой технике у меня, к сожалению, нет.

Я делал такие контроллеры (ну не прям телефонная станция, но тоже на 8086. Вернее, на 80186, но там очень маленькая разница).

И тоже программировал их на Turbo C 2.0, с самодельным стартап-кодом, чтобы он там по MS-DOS не скучал :)

Существовал ещё неплохой компилятор Paradigm C++, поддерживавший 80186.

UFO landed and left these words here

ну, кто-то любит попадью, кто-то свинной хрящик. Чтобы понастольгировать 8086 подходит, если кто его застал в эпоху бурной молодости, приятно вспомнить былые навыки. Чтобы донести ассемблер до молодого поколения лучше конечно что-то посовременнее взять, без нафталина, и подавать лучше не таким способом, более общим чтоли, с сопоставлением архитектур и их отличительных особенностей - расказать про endianess, выравнивание, наличие конвеера итд.. А если хочется чего-то совсем уж простого, можно например архитектуру 8051 предложить, для неё есть mcu8051ide - отличный IDE с эмулятором, очень наглядно даёт потрогать все азы микропроцессорной техники

8051 всего на пару лет моложе 8086, но вполне жив. Тут нужно найти компромисс: чтобы был одновременно и прикладной смысл и не требовалось какого-то специального оборудования для экспериментов in vivo. Думаю про Atmel и платки Arduino, но в контексте ассемблера. Пока не знаю, что было бы актуально И интересно читателям.

AVR ассембелер действительно неплох, писал на нём лет десять назад, когда начинал в embedded. Но там такая проблемка: эта архитектура так хорошо заточена под C, что в какой-то момент понимаешь что писать на ассембелре особо-то и нет необходимости, только чтобы познакомиться. В плане дидактики самого низкого уровня на мой взгляд 8051 реально лучше, она создавалась еще для ассемблерных программистов.

У Silicon Labs есть отличная серия EFM8, и девборды на неё не дороже ардуинок, рекомендую. И шустрые они, 25MHz и конвеер, по 1-2 такта на инструкцию, в отличии от старого.

Под C идеально заточен 1801ВМ1, там даже *(++p0) = *(p1--) в одну инструкцию ассемблера можно уложить если мне не изменяет моя старческая память (p0 и p1 указатели на примитивные типы конечно, а не на структуры, там уже одной инструкцией не обойтись).

так это PDP11 архитектура, её особенность. У DEC Alpha говорят тоже ассемблер хорош был

Ну да, оно и есть. 1801ВМ1 с PDP и срисовывали. Как КР580ИК80 срисовали с i8080.

MOV -(PC), -(PC)

кто трогал, тот поймёт :)

Система команд DEC PDP-11 была хороша, в СССР выпустили, ЕМНИП, три модели CPU: К1801ВМ1, ВМ2, ВМ3. Мой первый ассемблер был на ВМ2.

Система команд DEC PDP-11 была хороша, в СССР выпустили, ЕМНИП, три модели CPU: К1801ВМ1, ВМ2, ВМ3. Мой первый ассемблер был на ВМ2.

Еще были и микропроцессорные комплекты: 1811 и 1831 (аналоги комплектов DEC).

Я тогда в школе учился, ассемблер PDP-11, да под ОС RT11 по бледно-коричневым мануалам осваивал на машинках УКНЦ.

А я ассемблер PDP осваивал на КУВТ-86, состоявшего из центрального ДВК-2, к которому подключено много БК-0010.

А после занятий ходил в гости к приятелю, у которого дома (!!!) в то время (!!!) был настоящий комп Base-64 производства ФРГ, являвшийся клоном Apple ][e. И там я уже осваивал ассемблер 6502.

Я в универе на эту ерунду насмотрелся!

Мне в универе было интересно на ассемблере лабать, исключительно тёплые воспоминания. Правда, приходилось самому себе придумывать усложнения заданий ;)

Что за ностальгия по 90ым?!

Что за странный вопрос? Мы тогда были на 30 лет моложе.

Почему не используются современные инструменты для разработки в современных ОС, в long mode, с нормальным отладчиком, с постепенным переходом от создания простейших GUI-приложений на макросах FASMa к NTAPI, сисколлам, драйверам и более низкоуровневому коду?

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

В DOSBox работа с прерываниями поддерживается не полностью, он может зависнуть или аварийно закрыться. Лучше всё-таки работать на живом "железе".

Лучше, когда зависает DOSBox, чем когда зависает вся живая железяка.
Система с NTVDM — в самый раз. Забыл уже, в какой версии NT он последний раз из коробки шёл, в 32-битной Windows XP?

в наше время 30 лет назад архитектура x86 была практически единственная, мы с этим выросли, и это накладывает отпечаток. Хотя еще в 80х это было опять не так, тогда еще был зоопарк, но к нашим 90м он почти вымер, и нам казалось что вот это вот всё и только так и всегда. А сейчас умирает Intel и с ним уходит та эпоха, ничего не поделаешь, Arm и RISC-V сейчас важнее понимать, хотя бы в общих чертах. Такие дела.

UFO landed and left these words here

Ntvdm есть и в win10 32-bit.

Вообше лучшей по совместимости была в OS/2. Ну или в Qemu грузить DOS.

Автор написал то, что ему было интересно.

Почему вы полагаете, что

не используются современные инструменты для разработки в современных ОС

? Для разработки в современных ОС используются (мной, в том числе) разные инструменты, вплоть до LLM & Cursor IDE.

Тут же либо олдскул, с соответствующими инструментами, либо то, что вы хотите. И тут два пути: вы можете написать такую публикацию сами, либо это сделает кто-то другой, возможно, что я :)

Если мне сегодня старый фотограф начнет промывать уши техникой печати фотоснимков, химической обработкой с фотоматериалами и т.д. и т.п., я вспомню эту публикацию.
Портирование же на уровне GUI с применением FSM это то, что сегодня актуально с применением x86
На все пр все, освоение за 20 минут без тяжелого низкоуровневого фундамента.

Спасибо, вспомнил школу, как писал дипломную работу на Ассемблере. Под MS-DOS, ага. Выежнулся, согласен. На «Турбо-Паскале» с «Турбо-Виженом» было бы проще и быстрее... :-)

Это был кирпичик в фундаменте профессионального опыта.

DOS это еще что.... вот монитор (это по сути дебагер только без ассемблера/дизассемблера - все в HEX и ввод и вывод), который был в Специалисте (был такой довольно оригинальный комп с графическим дисплеем). Комп был собран (пайка) на макетке проводом МГТФ из деталей, что мне достал и купил папа.
Там из команд ввода вывода была только запись/чтение на/с магнитофона, а из подпрограмм (как прерывания в DOS) была только для вывода на экран символов на основе знакогенератора, который лежал в той же ROM где и сам монитор.
Там были набиты в HEX и ассемблер и еще несколько программ. А уже на ассме написана змейка (в графике).
И вот тогда.... (спаяв комп, набив в HEX ассемблер и написав в нем игру) я наконец смог поиграть :)

Слова "папа достал" заиграли новым смыслом. Но да, доставать приходилось и таки удавалось. В частности РУшки, микросхемы ОЗУ, в большинстве хоть и отбраковка, были цельнотянутыми с почтовых ящиков.

Да рушки (РУ3) как и еще пара микросхем были в золоте. Но тут надо большей половине читателей пояснить, что это значит: это такое исполнение микросхем в керамическом корпусе и позолоченными контактами, в таком исполнении микросхемы делались преимущественно для вояк, а в 90 был целый бизнес на извлечении этого золота из микросхем.
Хотя вот той же части читателей нужно еще пояснять, что такое почтовый ящик (который был источником таких микросхем, макетной платы и даже проводов и припоя, и где работал мой папа). Это военное производство начиная от проектных институтов и заканчивая заводами и полигонами - все имели гражданское название, например какие-нибудь Ленинец, Рубин или Малахит, но вся корреспонденция между ними ходила только как на ПЯ № 1234567890192010 (номер выдуман). Типа что бы шпиёны не догадались. Да только западные разведки знали о связи номеров ПЯ и предприятий больше, чем подавляющее большинство жителей СССР.

Кстати трансформатор в блоке питания для моего следующего (тоже спаянного собственными руками) ZX Spectrum был тороидальный (самый высокий КПД, но требует дюже специального оборудования для намотки) - тоже намотали папе по знакомству в ящике.

Начав читать, испугался и проверил год на календаре. Потом испугался за автора, что его держали взаперти 35 лет, успокоился дочитав до Ubuntu 24.04.
Блин, при чтении этой статьи я прям запах магазина "Технической книги" в Екатеринбурге на ул. К. Либкнехта почувствовал!

Сегодня гораздо больше поводов для страха, чем какая-то там публикация на Хабре. Считайте, что автор впал в маразм и живёт в ранней юности :)

Почему маразм, это хорошая мозговая терапия для тех, кому за 70. Одни кроссворды разгадывают, другие в шахматах зависают, вполне достойное занятие для клуба ветеранов IT, турниры, квесты...

[Примите и меня в кружок выделывающихся] В студенчестве однажды пришлось провести часов 8 в месте, где не было ни интернета, ни игр, а из книг под рукой только учебник Зубкова по ассемблеру. В итоге стала "самой умной" по курсу ассемблера в группе (консультировала однокурсников, писала им лабы for fun). Работали с Borland Turbo Assembler (TASM)

Сразу хотел минус нажать. Изначально думал что всё что уже написано решили ещё раз повторить. Но нет, полезное что-то есть, не совсем стандартный подход по использованию основ.

Но я бы не советовал писать то, что уже не один раз написано и пройдено. Для этого, по моему мнению, надо просто указать где и что почитать. И считая что человек ознакомился с информацией, предоставлять информацию дополнительную (ту о чём мало писали или которую мало где найдёшь).

Ссылок, на информацию, думаю мало. Особенно нужна информация по использованию DosBox. Для тех кто не знает, в комплекте со стандартным DosBox всегда шла документация и примеры по использованию. А вот в расширенных версиях, я не уверен (все форки DosBox).

При аппаратном/программном прерывании в стек сохраняется CS,IP, FLAGS. А как гарантируется, что не будут испорчены (обработчиком прерывания) все остальные регистры?

Никак. Если обработчик прерывания не связан с текущей задачей, то он первым делом убирает в стэк все регистры, перед выходом из себя — достает обратно. А вообще некоторые прерывания просто обязаны поменять регистры. Например, MS-DOS API работает через прерывание 21H, перед вызовом в регистры заносятся данные и команды, после выхода из прерывания в некоторых регистрах будет результат выполнения.

Спасибо за пояснение! С программно вызываемым прерыванием действительно выглядит логично, это по сути осознанный вызов подпрограммы/функции. А вот с аппаратными прерываниями выглядит странно (возможно по моей неопытности), ибо прерваться может абсолютно любой пользовательский код, логика которого может подразумевать сохранность каких угодно регистров между выполнением своих команд, и получается все отдается на откуп аккуратности кода обработчиков аппаратных прерываний, гипотетически было бы логичней, чтобы аппаратное прерывание сохраняло/восстанавливало значения всех регистров, но это не более чем мысли вслух.

Сделали так потому, что логически 8086/88 умел обрабатывать 256 прерываний, адреса обработчиков хранились в памяти по зарезервированному адресу. А аппаратных было 8, они генерировались специальной микросхемой по запросу устройства. Эти 8 аппаратных прерываний отображались на 8 специально выбранных программных — надо было как-то совместить обработку.

А еще была такая штука, как переопределение прерываний. Например, русификатор клавиатуры ставил свой адрес в таблицу прерываний и запоминал старый адрес. Если язык был переключен на русский, то русификатор сам обрабатывал запрос от устройства и выходил из прерывания. Если английский — то русификатор просто переходил по старому адресу. Примерно так же работала и знаменитая программа «800.com».

При этом не всегда помогает PUSHA + сохранение всех прочих регистров. Может, что-то не учитывал.

Хорошее описание, для тех кто не понимает тем более. Спасибо. А как вывести знак доллара использую int 21 с 09h или это сразу отбрасывается при таком вызове?

Функция 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

Спасибо. Ожидаемо, но думал вдруг кто то нашёл лазейку, может в каком то коде или с маскировкой сделать. Но в целом понятно, такой вывод значит использовать строго проверяя, чтоб не где этот символ не появился.

Ещё интересно было, читал, что если этот символ не указать, он будет до предела выделенной памяти выводить всё что там есть. Но не проверял, потом ради интереса допущу такую ошибку.

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

Не до предела выделенной памяти, а до первого появления этого символа. И дальше выводить уже не будет.

Sign up to leave a comment.

Articles