Dos fn 38h датьустановить информацию о стране


Содержание

Dos fn 38h: дать/установить информацию о стране

, Fn+ё, — там изображена кнопка play/pause] — функциональная клавиша мультимедийного софта. Запускает и приостанавливает воспроизведение медиаплеера (если поддерживается ОС и если корректно настроено) Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F1 — включение/отключение тачпада. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F2 — включение/отключение основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F3 — выключить звук в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F4 — регулировка подсветки клавиатуры (6 уровней яркости клавиш + полное отключение подсветки, каждое нажатие комбинации Fn+F4 выполняет переключение яркости на следующий режим). Работает нативно, в т.ч. под DOS.
Fn+F5 — уменьшить громкость в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F6 — увеличить громкость в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F7 — переключить вывод с основного экрана ноутбука на HDMI (возможны затыки — мною не проверялось, т.к. не на чём пока проверить)
Fn+F8 — уменьшение яркости основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (требуется только установка драйверов от производителя, в случае с Linux — см. ниже по шапке темы в разделе про поддерживаемые ОС)
Fn+F9 — увеличение яркости основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (требуется только установка драйверов от производителя, в случае с Linux — см. ниже по шапке темы в разделе про поддерживаемые ОС)
Fn+F10 — включение/выключение (аппаратное) встроенной веб-камеры Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует). В Windows7 камера пропадает в диспетчере устройств, в Ubuntu — перестает обнаруживаться в системе, будто выдернули из USB-порта
Fn+F11 — режим «полет» Нет эффекта от нажатия в Windows 7 и в Ubuntu 16.04 (требуется «допиливание», установка софта от производителя)
Fn+F12 — режим гибернации (ноутбук уходит в спящий режим). Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+Ins = ScrollLock (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК) Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+PgUp= Pause (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК). Архаизм. В некоторых играх — постановка на паузу игрового процесса. Работает нативно. Pause+[windows_logo]=диалог свойств о системе в Windows, к примеру. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+PgDn = Break (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК). Архаизм. Полезна для консольных приложений — посылает прерывание текущему процессу. Реагировать или нет — зависит уже от процесса. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
По поводу хоткеев в Windows 7. Порылся на просторах интернета, и нарыл софтину стороннего производителя (305,7 МБ!), которая привела к работоспособности всех комбинаций с Fn и даже к их корректной индикации.

Fn 00H: завершить программу

Вход

  • AH = 00H
  • CS = сегмент PSP завершающегося процесса

Выход

Описание:

передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20H Terminate. регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22H-24H (завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых буферов. файлы должны быть предварительно закрыты, если их длина изменилась.

Замечание:

Проще и более аккуратно — использовать функцию DOS Fn 4cH Exit.

Fn 01H: ввод с клавиатуры

Вход

Выход

  • AL = символ, полученный из стандартного ввода

Описание:

Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). при распознавании Ctrl-Break выполняется INT 23H.

Замечание:

ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и т.п.) требует двух обращений к этой функции. первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.

Fn 09H: Выдать строку на дисплей

Вход

  • AH = 09H
  • DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H)

Выход

Описание:

строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. символы Backspace обрабатываются как в функции 02H Display Char. обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH). строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).

Fn 06H: Консольный ввод-вывод

Вход

  • AH = 06H
  • DL = символ (от 0 до 0feH), посылаемый на стандартный вывод
  • = 0ffH запрос ввода со стандартного ввода

Выход

  • ZF = Сброшен (NZ), если символ готов ҐҐЈҐ при запросе ввода

Описание:

при DL = 0ffH выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. если DL не равен 0ffH, то DL направляется на стандартный вывод.

Замечание:

Не проверяет Ctrl-Break. вызывайте дважды для расширенного ASCII.

Fn 0aH: ввод строки в буфер

Вход

  • AH = 0aH
  • DS:DX = адрес входного буфера (смотри ниже)

Выход

  • нет = буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)

Описание:

при входе буфер по адресу DS:DX должен быть оформлен так:

¦max¦ ? ¦ ? ? ? ? ? MAX — максимально допустимая

при выходе буфер заполнен данными следующим образом:

¦max¦len¦ T E X T 0dH LEN — действительная длина данных

символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или до достижения длины MAX-1. если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. последний символ в буфере — всегда CR (который не засчитан в байте длины). символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редакти рования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. большинство расширенных кодов ASCII игнорируются. при распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

Fn 25H: установить вектор прерывания

Вход

  • AH = 25H
  • AL = номер прерывания
  • DS:DX = вектор прерывания: адрес программы обработки прерывания

Выход

Описание:

устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы.

Предупреждение:

Не забудьте восстановить DS (если необходимо) после этого вызова.

Fn 35H: дать вектор прерывания

Вход

  • AH = 35H
  • AL = номер прерывания (00H до 0ffH)

Выход

  • ES:BX = адрес обработчика прерывания

Описание:

возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2].

Предупреждение:

Эта функция изменяет сегментный регистр ES.

Fn 27H: читать произвольный блок файла

Вход

  • AH = 27H
  • DS:DX = адрес открытого FCB
  • CX = число считываемых записей

Выход

  • AL = 0 если чтение успешно и DTA заполнена данными
  • AL = 1 если достигнут конец файла (EOF) и данные не считаны
  • AL = 2 если DTA + FCB (RecSize * CX) выходит за границу сегмента
  • AL = 3 если EOF и считана усеченная порция (дополнена нулями)
  • CX = действительное число считанных записей

Описание:

Читает несколько записей из файла, начиная с файлового адреса, специфицированного полем RandomRec в FCB. Помещает данные в память, начиная с адреса DTA. число считанных байт = FCB RecSize*CX. Поля RandomRec, CurBlk и CurRec корректируются, чтобы указывать на следующую запись (первую запись за прочитанными).

Fn 31H: завершиться и остаться резидентным — KEEP

Вход

  • AH = 31H
  • AL = код выхода
  • DX = объем памяти, оставляемой резидентной, в параграфах

Выход

Описание:

выходит в родительский процесс, сохраняя код выхода в AL. код выхода можно получить через функцию 4dH Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX * 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.

Программирование в среде однозадачной операционной системы

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

Е.В. Грачева


Системное программное обеспечение

Персональных ЭВМ

доктор технических наук, пофессор

зав.кафедрой «Вычислительные машины и системы»

доктор технических наук, пофессор

кафедры «Информационно-вычислительные системы»

Пензенского государственного университета

Грачева Е.В.

Системное программное обеспечение персональных ЭВМ:

Учебнле пособие /Е.В. Грачева – Пенза

Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»

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

Программирование в операционной среде

Операционной средой называется набор функций ОС, сервисов и правила обращения к ним. Поскольку каждая операционная система имеет свой набор функций и правил обращения к ним, программирование в операционной среде каждой ОС должно рассматриваться отдельно [1].

Программирование в среде однозадачной операционной системы

Программы для MS DOS могут быть одного из двух форматов: COM или EXE.

Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.

Размер программы типа EXE может превышать 64 кб.

В современных операционных средах приложения пользуются системными вызовами, число которых превышает 2000, в то время как в MS-DOS подобных функций гораздо меньше.

Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.

Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:

+00h: слово – CDh 20h – команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду.

+02h: слово – сегментный адрес первого байта после области памяти, выделенной для программы

+04h: байт – не используется DOS

+05h: 5 байт – 9Ah F0h FEh 1Dh F0h – команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.

+0Ah: 4 байта – адрес обработчика INT 22h (выход из программы)

+0Eh: 4 байта – адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).

+12h: 4 байта – адрес обработчика INT 24h (обработчик критических ошибок)

+16h: слово – сегментный адрес PSP процесса, из которого был запущен текущий.

+18h: 20 байт – JFT – список открытых идентификаторов, один байт на идентификатор, FFh – конец списка.

+2Ch: слово – сегментный адрес копии окружения для процесса.

+2Eh: 2 слова – SS:SP процесса при последнем вызове INT 21h.

+32h: слово – число элементов JFT (по умолчанию 20).

+34h: 4 байта – дальний адрес JFT (по умолчанию PSP:0018).

+38h: 4 байта – дальний адрес предыдущего PSP.

+3Ch: байт – флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.

+3Dh: байт – флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).

+3Eh: слово – не используется в DOS.

+40h: слово – версия DOS, которую вернет функция DOS 30h (DOS 5.0+).

+42h: 12 байт – не используется в DOS.

+50h: 2 байта – CDh 21h – команда INT 21h.

+54h: 7 байт – область для расширения первого FCB (FCB, FileControlBlok — это метод работы с файлами, являющийся рудиментом от ранних версий DOS’а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия «каталог» в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).

+5Ch: 16 байт – первый FCB, заполняемый из первого аргумента командной строки.

+6Ch: 16 байт – второй FCB, заполняемый из второго аргумента командной строки.

+7Ch: 4 байта – не используется в DOS.

+80h: 128 байт – командная строка и область DTA по умолчанию.

Затем DOS записывает программу в память, начиная с адреса PSP:0100h.

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

При запуске СОМ-программы регистры устанавливаются следующим образом:

AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе – 00h.

АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.

CS = DS = ES = SS = сегментный адрес PSP.

SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).

При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).

Все эти действия выполняет одна функция DOS – DOS 4Bh – загрузить и выполнить программу. В качестве параметров этой функции передаются:

AL = 00h – загрузить и выполнить;

AL = 01h – загрузить и не выполнять;

DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров ЕРВ:

+00h: слово – сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта – адрес командной строки для нового процесса
+06h: 4 байта – адрес первого FCB для нового процесса
+0Ah: 4 байта – адрес второго FCB для нового процесса
+0Eh: 4 байта – здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта – здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)

AL = 03h – загрузить как оверлей;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров:

+00h: слово – сегментный адрес для загрузки оверлея
+02h: слово – число, которое будет использовано в командах, использующих непосредственные сегментные адреса, – обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов

AL = 05h – подготовиться к выполнению (используется в ОС MS DOS начиная с версии 5.0 и выше)
DS:DX – адрес следующей структуры:

+00h: слово – 00h
+02h: слово:

бит 0 – программа – ЕХЕ
бит 1 – программа – оверлей

+04h: 4 байта – адрес ASCIZ-строки с именем новой программы
+08h: слово – сегментный адрес PSP новой программы
+0Ah: 4 байта – точка входа новой программы
+0Eh: 4 байта – размер программы, включая PSP

CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 – файл не найден, 5 – доступ к файлу запрещен, 8 – не хватает памяти, 0Ah – неправильное окружение, 0Bh – неправильный формат).

Как уже отмечалось, прерывание INT 21h (сервис DOS) служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.

В таблице 1 приведены функции прерывания INT 21h.

Таблица 1 -Функции прерывания INT21h

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: На стипендию можно купить что-нибудь, но не больше. 8987 — | 7235 — или читать все.

Dos fn 38h: дать/установить информацию о стране

Останов в загрузке на post 38h опрос USB контроллера. Перепрошивка BIOS. Сброс CMOS. Все остальное. Проблема в дефектной планке памяти. Ни разу не сталкивался. Странно.

  • Блог пользователя ИгорьК
  • Добавить комментарий
  • 22 просмотра

Asus P5G41T-M LX3 не работают USB

На материнской плате ASUS P5G41T-M LX3 не работают все USB разъемы. Напряжения питания присутствуют все , не просаживаются. 5 вольт на USB есть (предохранители целые). Сопротивление в USB, D+ и D- относительно земли 514 mV. SPEAKER пикает при включении, готовность (один короткий). Останавливается на POST коде 38, на мониторе пишет: «Initializing USB Controllers. » Прошивки БИОСа менял, результат тот же код-38. Подозрение на Южный мост, но ведь сопротивление 514(относительно земли). Прошу помощи, так как застрял.

  • 1 комментарий
  • 72 просмотра

Не включается Asus P5W DH Deluxe

Кто подскажет ,что может быть с платой .Asus P5W DH Deluxe .История такова .После перепада напряжения перестала работать .Визуально все в идеальном состоянии .Если снять процессор плата включается и выключается .При установке любого процессора блок питания не включается.Питания северного и южного моста в норме.Все транзисторы в питании процессора целые звонятся правильно .При принудительном запуске .Включается но питание на процессор не подается .Кто сталкивался с такой проблемой.Или подскажите куда копать ?
Да грелись сетевые были аккуратно сняты .Блок питания рабочий и проверенный на других

  • 17 комментариев
  • Подробнее

  • 239 просмотров

ASRock G31M-VS2 ошибка 38 на посткарте

Не включается при старте. Не стартует. При подключении посткарты на индикаторе ошибка 38. На мониторе высвечивается логотип платы и внизу подсказка типа нажмите F2 для входа. F6 для . и так далее, но клава не работает.. Что это за хрень и где искать..

Dos fn 38h: дать/установить информацию о стране

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

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

Список команд

Наверное самое первое чему нужно научиться, так это переходить по различным каталогам и дискам. По умолчанию у Вас будет мигать курсор на черном экране с надписью: C: Documents and Settings User> Это означает что Вы работаете с диском C, а Вам к примеру нужно перейти на диск D. Для этого пишите в командной строке D: и жмите клавишу Enter

В результате у Вас должно получиться следующее:

Узнать содержимое директории поможет команда DIR, вводите её и клавишу Enter

Теперь можно выбрать нужный каталог и перейти в него, для этого нужно ввести команду CD и название папки. К примеру на диске D есть папка contact, значит для её открытия нужно ввести:

cd contact Enter

Если Вам необходима справочная информация по определенной команде, то Вы можете написать:

HELP ИМЯ_КОМАНДЫ

Либо ещё проще, ввести команду и набрать слешь с вопросительным знаком ( /? )

Dos fn 38h: дать/установить информацию о стране

Нужен дам или подробное описание пост кода 38,39 для AMIBIOS

  • 3 комментария
  • 410 просмотров

ASUS P5QL Pro работает, но после перезагрузки зависает на D4

Всем привет. поступила на ремонт данная матплата с диагнозом стартует но не грузится. Все напряжении в норме, пост карта показала, что виснет на 38. Прошил, новая прошивка дал результат, матплата стала загружаться, работает стабильно. Но, потом столкнулся с проблемой, когда матплату отправляешь в перезагрузку (кнопкой резет, или программно) и на обратной загрузке зависает на пост коде D4. Повторная перезагрузка пост встает на 00. не отключая БП держа контакты повер-св выключаю, жду 10-15 секунд и снова включаю, матплата грузится как положено.

  • 1 комментарий
  • Подробнее
  • 1077 просмотров

ASUS M2N-MX SE висит на коде 38H

Добрый день! Подскажите пожалуйста, есть материнская плата ASUS M2N-MX SE, зависает на POST коде 38H, как уточнить на каком именно устройстве останавливается — USB, сетевая карта или ещё на чём? Грешу на сетевую карту, т.к. при подключенном сетевом кабеле и когда матринка в стенд-бай моргает индикатор Link сетевой карты. Флешки опрашиваются, если прошить BIOS с версии платы без встроенной сетевухи то пропустит мать код 38H или всё равно нужно снимать чип сетевой карты attansic f2 b6357?

  • Добавить комментарий
  • 995 просмотров

Intel D845GBV (РЕШЕНО)

Добрый день. Очень хороший сайт. Но как то сложно для меня устроен, потому, Сори, если не то или не туда пишу. Есть мат. плата Intel D845GBV. До этого она останавливалась с кодом D3. С неё сняли БИОС и потеряли (не я). Кто нибудь может дать дамп, что бы залить через программатор? Микросхему найду, программатор есть. Весь инет перевернул уже, неделю сижу. Все предлагают с сайта Intel, но там только восстановление с дискеты. Если у кого есть рабочий дамп, киньте на почту пожалуйста или выложите здесь. Только не умничать, пожалуйста, типа, читать надо и т.п.

  • 9 комментариев
  • Подробнее
  • 1068 просмотров

Asus P5KPL-AM EPU (Rev 1.02G)

Останавливается на коде 38h. Ничего не греется, на клавиатуру не реагирует, FullScreenLogo = Enable. BIOS 0406
С помощью другой мамки от Asus прошил DOS-утилитой (amiflash.com) до версии 0501 (универсальная для обеих ревизий, имеется ввиду 1.01G).
При загрузке заставка теперь не отображается, тест останавливается на сообщении Initializing USB Controllers .
Проблема выяснена — USB порты.
Вопрос — ТОЛЬКО отжиг, или есть ещё варианты?

  • 8 комментариев
  • 1765 просмотров

AsRock G31M-VS

Всем доброго времени суток!
Имеется данная плата + несколько почти аналогичных.
У всех одна и та же беда — стартуют, доходят до POST 38, на экране появляется логотип и все. Ни на что не реагируем, висим.
Судя по форуму — типовая беда плат на G31
rom.by/forum/P5KPL-C_zavisaet_POST_38

Есть плата Асрок уже на Am2+ N68. дале буквы не помню, та тоже подвисает на 38 коде, ругается на несовпадение Mac адреса сетки. нажимаем F1 и далее плата работает как ни в чем не бывало.

Из вариантов — снять сетевую?

  • 6 комментариев
  • 2444 просмотра

Asrock Wolfdale 1333-D667

Здравствуйте форумчаны! Есть такая проблема. Комп включается монитор включается но при показа сведение он проста так зависает. Экране такие надписи
================================
AMIBIOS(C) 2005 American Megatrends, Inc.
Wolfdale1333-D667 BIOS P1.50
CPU: Intel(R) Celeron(R) D CPU 3.06 GHz
Speed: 3.06 GHz

Press F11 for Boot Menu
Dual Channel Memory Mode
================================

Сам процессор менял, ОЗУ тоже менял, Шлейфы от других устройств не подключал. Клавиатура загорается но не работает. Ни в бут меню ни в сетап не зайти. Проста так завис и всё. Есть пост карта.

Уходим под DOS!

ДОС. Черной пеленой экран заполнил чистый ДОС.

Мышь. Стала вдруг квадратной, потеряла форму мышь.

Я разбил окно. «Виндовс»… Ненавистное, проклятое окно.

Я поставил ДОС и тогда увидел — это счастье, вот оно!

Песня неизвестного автора эпохи Windows

Современные операционные системы требуют всё больше и больше ресурсов: оперативной памяти, дискового пространства, быстродействия центрального процессора… Старые компьютеры приходится попросту выбрасывать, и даже блоки с процессорами Pentium или Pentium II с мониторами 14-15” сегодня практически ничего не стоят. Особенно жалко расставаться с ноутбуками на процессорах i386 и i486, которые ничем не хуже современных КПК, однако вряд ли удастся добавить им памяти, чтобы запустить более или менее современную операционную систему семейства Windows.

А так ли уж нужны все эти сногсшибательные вычислительные мощности обычному пользователю, который, по сути, хочет лишь выходить в Интернет, отправлять электронную почту, редактировать тексты, слушать музыку и играть в несложные компьютерные игры время от времени? И стоит ли переходить на новые технологии, где быстродействие и надежность компьютера во многом зависят от мощности блока питания и от эффективности системы охлаждения, а разница между старыми и новыми версиями программ зачастую понятна только специалистам?

Дисковая Операционная Система (DOS)

Вопрос: Сколько сотрудников Microsoft нужно для смены перегоревшей лампы?

Ответ: Ни одного, так как Microsoft в таких случаях стандартизирует темноту!

Совсем недавно, как это порой кажется, то есть буквально каких-нибудь 10-15 лет назад на персональных компьютерах у большинства пользователей стояла операционная система MS-DOS. Эта система была довольно простой и вполне подходящей для многих целей, а для некоторых приложений и вообще оптимальной! Кстати, многие специализированные программы от перехода к новым операционным системам и возросшим мощностям ничего принципиально не выиграли, а, напротив, потеряли в удобстве интерфейса (который пришлось стандартизировать) и в простоте освоения.

Главное достоинство DOS (впрочем, как и главный недостаток) — тесное взаимодействие с аппаратурой. Операционные системы семейства Windows, как и различные вариации UNIX-подобных систем, все-таки отгораживаются от аппаратуры целым рядом стандартизованных интерфейсов высокого уровня и возвышаясь над железом, часто осложняют работу с ним, что неудобно, в частности, разработчикам какой-либо нестандартной аппаратуры. DOS же побуждает на взаимодействие с аппаратными средствами напрямую. Например, легкий доступ к железу позволяет работать с дисками на физическом уровне, а значит, можно организовывать копирование разделов независимо от типов их логического форматирования. Однако здесь же таятся и различные подводные камни, которые приводят к коллизиям при работе в этой операционной системе при небрежном программировании. В общем, система DOS требовала от программистов аккуратности, и в этом случае программы работали с максимальной эффективностью. Для DOS были написаны сотни тысяч программ, и аналогов некоторых из них в других ОС нет и, возможно, никогда уже не будет. К тому же требования к аппаратуре для запуска DOS были минимальными.

Однако в середине 90-х Билл Гейтс заявил: «DOS is dead». И действительно, уже после выхода MS Windows 95 и первых версий Linux стало очевидно, что дни DOS как массовой операционной системы сочтены. И хотя теоретически DOS еще долго будет находить применение в дешевых решениях при создании электронных микропроцессорных систем (некоторые варианты DR-DOS и PTS-DOS имеют ROM-версии, а также есть специальные ROM-версии таких систем, как Datalight ROM-DOS и General Software DOS-ROM для технических приложений), эти сферы применения очень узки и вряд ли могут поддержать существование подобных операционных систем в будущем.

Клавиши для редактирования команд в DOS

С началом XXI века последние коммерческие версии DOS прекратили свое существование. Последняя версия IBM PC-DOS датирована 2000 годом (она продавалась по 60 долл.), и тогда же вышла последняя полная версия PTS-DOS (это отечественная разработка фирмы «Физтех-софт»). В версии же PTS-DOS, выпущенной в 2002 году, появилась поддержка FAT32 и работы с большими объемами памяти, но исчезли некоторые полезные утилиты, не приспособленные к упомянутой поддержке. Последняя версия DR-DOS 8.0 (с поддержкой FAT32 и длинных имен файлов) датируется 2004 годом (она продавалась по 40 долл.). Кстати, теперь эта система называется Caldera OpenDOS, распространяется бесплатно в рамках проекта Open Source (то есть доступны исходные тексты этой системы), а скачать ее можно по адресу: http://www.opendos.de/download/.

Наконец, продолжает свое существование бесплатная версия FreeDOS, тоже с открытыми исходниками, но это уже, скорее, общественный проект энтузиастов, разбросанных по всему миру. Последняя версия этой ОС появилась в 2003 году, но поскольку различные части FreeDOS разрабатываются независимо, то она до сих пор больше напоминает Linux, чем DOS в классическом виде (в частности, полная инсталляция этой системы — такая же непростая операция). Впрочем, ни одна из альтернативных систем не имеет 100% совместимости с MS-DOS, а больше всего проблем с совместимостью у FreeDOS. Получается, что лучшей DOS по-прежнему остается «мертвая» MS-DOS. Официально последней версией MS-DOS была версия 6.22 от 1994 года, но MS-DOS версий 7.x существовали вместе с Windows 95/98/Me — их можно было отделять от оболочки Windows и использовать отдельно.

Однако с каждым годом обостряется проблема драйверной поддержки новых аппаратных средств — речь идет в первую очередь о USB-устройствах, приводах DVD-R/RW и т.д. Аналогичная проблема существует и для сетевых протоколов, и для новых форматов данных.

Освобожденный DOS

Хрюкнул жесткий диск, и железо тихо зашуршало под столом.

Загрузилось сразу. Эй, давай-ка мы посмотрим, что почем!

Выходи под ДОС и лучше поработай головой!

Посмотри же сам: ведь ДОС не сказка, это правда, он с тобой!

Песня неизвестного автора эпохи Windows

FreeDOS (http://www.freedos.org/) — довольно современная бесплатная и совместимая с MS-DOS операционная система, поддерживаемая энтузиастами по всему миру. Сегодня FreeDOS, по сути, остается единственной альтернативой для тех, кто хочет использовать версию операционной системы DOS и написанного для нее ПО, ведь современная аппаратура нуждается в драйверной поддержке, а такие коммерческие проекты, как PC-DOS, DR-DOS и PTS-DOS, уже прекратили свое существование. FreeDOS будет работать как на старых аппаратных средствах или в эмуляторах DOS, так и на новой аппаратуре и в различных встроенных системах. FreeDOS — это ценный ресурс для тех людей, которые желают создавать собственную операционную систему, отличную от продукции Microsoft.

Основные возможности FreeDOS:

  • простое изготовление загрузочных мультисистемных дисков для Linux, Windows 2000/XP и других ОС;
  • поддержка FAT32 для больших дисков;
  • поддержка LFN (в командном режиме с 4DOS);
  • собственная реализация LBACACHE (дискового кэширования для ускорения записи/чтения);
  • собственный эффективный менеджер памяти;
  • поддержка любых магнитооптичеких носителей (FDCDEX- и CD-ROM-приводов);
  • драйверы мыши с поддержкой колесиков и многокнопочных возможностей;
  • реализация FDAMP (контроля/информации за системами питания современных компьютеров (APM)), экономичные режимы для резидентных программ (TSR/control), эффективное кэширование обмена данными, управляемая перезагрузка и т.д.;
  • поддержка UDMA (драйвер режимов Ultra DMA для DOS) — поддержка до четырех жестких дисков неограниченного объема.

В последние годы стали свободно распространяться и некоторые превосходные программы для разработчиков под DOS, среди которых компиляторы Watcom C, C++ и Fortran (известные высоким качеством генерируемых кодов); Borland Turbo C; Free Pascal (полностью совместимый с Borland Pascal и частично с Delphi); отличный, быстро развивающийся макроассемблер FASM (качество генерируемых им кодов выше, чем у некоторых известных ныне коммерческих ассемблеров), а также такие Интернет-браузеры, как Arachne и Bobcat. А благодаря системе DJ Delorie, для DOS доступны практически все базовые средства Linux (gcc, g++, gdb, bash, grep и др.).

Работа с USB под DOS

Слезы на очках. Странные очки, а может, это слезы на лице?

ДОС очистил всё! Всё, что было лишним у меня на диске «Ц».

Я нажал «Ф8», и веселый «Нортон» удалял мне всё подряд:

Сорок мегабайт, а может, больше. может, даже шестьдесят.


Песня неизвестного автора эпохи Windows

Использование USB-диска (флэшки) в качестве загрузочного (см. статью «Многоликие USB-флэшки») дает интересную возможность: если распространять какую-то программу на таком диске вместе с DOS, то ее можно использовать на любом компьютере, независимо от установленной операционной системы на жестком диске (для этого, правда, необходимо чтобы BIOS материнской платы поддерживала загрузку с USB-устройств).

Однако далеко не все материнские платы поддерживают загрузку с USB-дисков (а если и поддерживают, то на компьютерах с процессором не ниже Pentium III), а во времена DOS поддержки USB Flash Drive вообще не было. Поэтому даже если вы захотите просто прочитать с флэшки под DOS (например, загрузившись с аварийной дискеты), то вам понадобятся для этого специальные драйверы, которые были написаны гораздо позже периода активного использования DOS.

Существует несколько подобных драйверов для поддержки USB-устройств, написанных различными фирмами для своих целей, поскольку базовых средств поддержки USB-устройств нет ни в одной альтернативной DOS-системе, даже в FreeDOS. Наиболее популярными являются драйверы от японской компании Panasonic (Matsushita), и хотя компания писала их для своих устройств, но драйверы получились универсальными и работают с большинством USB-накопителей, соответствующих спецификациям UHCI- (старые устройства USB 1.x), или OHCI- (устройства USB 1.x следующего поколения, где работа осуществляется не через порты ввода-вывода, как прежде, а через области памяти, что получается быстрее), или, наконец, EHCI-стандарта (USB 2.0). Драйверы компании Panasonic являются 16-разрядными и работают с любой версией DOS.

Для поддержки USB-накопителей прежде всего необходим драйвер ASPI, сохранивший свое название от Advanced SCSI Programming Interface. Основным драйвером является файл USBASPI.SYS (Panasonic v2.06 ASPI Manager for USB mass storage), который вы должны скопировать на системную дискету и вызвать при загрузке DOS из config.sys следующей строкой:

DEVICE=USBAPSI.SYS /v /w /e /noprt /norst

В данном случае параметр /v (Verbose) означает использование режима подробного вывода информации об устройстве, а параметр /w (Wait) будет останавливать загрузку до того момента, пока к USB-разъему не будет подключено устройство и нажата клавиша Enter.

Кроме этих параметров у USBASPI.SYS есть и другие. Общая строка вызова будет выглядеть так:

Однако все остальные параметры, кроме вышеупомянутых /v и /w, малоинтересны, и можно применять их значения по умолчанию. Если же у вас возникнут какие-то проблемы с распознаванием USB-устройства, то можно попробовать использовать другие параметры. Так, иногда помогает ключ /noprt. Отметим, что параметр /l[=n] явно указывает номер логического устройства (LUN), поэтому его задание может ускорить загрузку (по умолчанию n = 0). К тому же иногда бывает полезно явно указать спецификацию USB (/e — это EHCI; /o — OHCI; /u — UHCI).

Таким образом, если драйвер USBASPI.SYS распознает ваше USB-устройство, то он обеспечит ему ASPI-интерфейс. Однако для того, чтобы получить доступ к USB-устройству из DOS, вам понадобится еще и драйвер диска DI1000DD.SYS (ASPI mass storage driver) от компании Novac, который будет назначать этому USB-устройству соответствующую букву в ряду других накопителей (почему-то этот драйвер у производителя называется Motto Hairu USB Driver). В файле config.sys следует прописать его отдельной строкой:

В состав пакета для работы с USB-устройствами от Panasonic входит также файл RAMFD.SYS, который создает RAM-диск, и на него целиком копируется загрузочная дискета, чтобы ускорить работу под DOS.

Кроме того, в пакете есть специальные драйверы USBCD.SYS, которые позволяют подключать внешние CD-приводы с USB-интерфейсом.

Соответствующие строчки в файле config.sys вашей загрузочной дискеты должны выглядеть примерно так:

REM Загрузка универсального USB-драйвера от Panasonic

DEVICEHIGH=USBASPI.SYS /v /w /e /noprt /norst

REM Присвоение устройству буквы

REM Загрузка драйвера CD-ROM

DEVICEHIGH =USBCD.SYS /d:USBCD001

Если же у вас есть CD-привод с интерфейсом USB, то в командном файле autoexec.bat надо добавить следующие строчки:

REM Монтирование USB CD-ROM

Теперь, даже если вы не хотите работать под DOS, а просто собираетесь загрузиться с аварийной дискеты, сделать резервную копию жесткого диска на USB-накопитель при помощи программы Paragon Drive Backup, скопировать системный диск при помощи программы Powerquest Drive Image или воспользоваться средствами Norton Ghost, то вы сможете осуществить это, загрузив соответствующие драйверы поддержки USB Flash Drive под DOS.

Сложности в применении драйверов от Panasonic могут возникнуть при использовании EMM386.EXE (менеджера памяти под DOS). Если у вас возникает ошибка, связанная с размещением (mapped memory), то необходимо отключить загрузку EMM386.EXE или воспользоваться USB-драйверами от других компаний. Кроме того, может случиться, что ваша флэшка может неправильно распознаваться драйвером USBASPI.SYS или что драйвер DI1000DD.SYS выдаст сообщение о неправильных данных в загрузочном секторе USB-накопителя, — в этих случаях можно попробовать подготовить флэш-диск непосредственно в DOS: запустить, например, программу fdisk.exe, создать на флэшке primary DOS partition и отформатировать ее в FAT. Однако некоторые флэшки нельзя форматировать, так как после этого они могут работать некорректно или вообще перестанут распознаваться. Поэтому перед подобной процедурой обязательно узнайте у производителя о возможности форматирования USB-накопителя и поищите специальную фирменную утилиту для этой операции. В любом случае лучше вначале попробовать все возможные драйверы и их настройки для подключения USB-устройства в DOS и только потом, если ни один из методов не сработает, прибегнуть к более рискованным экспериментам.

Помимо драйверов от Panasonic, существуют USB-драйверы производства компании Cypress, которые работают с EMM386.EXE без конфликтов, так что отключать менеджер памяти (если он необходим вам) в этом случае заведомо не понадобится. К тому же у Cypress DUSE есть только драйвер диска DUSE.EXE (ASPI mass storage driver), который назначает USB-устройству соответствующую букву, так что ASPI-менеджер все равно понадобится: можно взять тот же вышеописанный USBASPI.SYS и заменить только драйвер DI1000DD.SYS на DUSE.EXE. Драйвер DUSE.EXE можно прописать в файле config.sys как драйвер устройства (DEVICE), например:

REM Загрузка универсального USB-драйвера

DEVICEHIGH=USBASPI.SYS /v /w /e /noprt /norst

REM Присвоение устройству буквы

А можно просто вызвать DUSE.EXE в командном файле autoexec.bat как программу при помощи специального загрузчика DUSELDR.EXE:

Компания DAT Optic (http://www.datoptic.com/) предлагает свое решение для подключения USB-устройств — это пакет DAT.EXE, который изготавливает загрузочную дискету для MS-DOS. Там содержатся драйвер USBASPI.SYS от компании Medialogic Corp, NJ32DISK.SYS от компании Workbit Corp и даже драйвер SBP2ASPI.SYS от Medialogic Corp для подключения устройств по интерфейсу IEEE-1394 (FireWire). USBASPI.SYS от Medialogic практически идентичен драйверу USBASPI.SYS от Panasonic, но имеет меньше параметров, NJ32DISK.SYS от компании Workbit выполняет те же функции, что и DI1000DD.SYS от Novac. Использование драйвера SBP2ASPI.SYS для FireWire-устройств аналогично ASPI-драйверу для USB.

Основные ключи для загрузки SBP2ASPI.SYS из CONFIG.SYS следующие:

  • /V — информирование при запуске;
  • /H:n, где n — это число от 0 до 9, которое показывает логический номер устройства OHCI-1394;
  • /RES — принудительная загрузка в память и нахождение там (TSR) даже в том случае, если не обнаружены устройства;
  • /RBC — ключ режима работы устройства. Прежде, согласно стандартам команд SCSI-дисков, определялось два режима — полный (SBC) и сокращенный (RBC). По умолчанию SCSI-диски работали в SBC-режиме, поэтому ASPI ожидает от них именно этого и не работает с RBC-устройствами без явного указания.

Если SBP2ASPI.SYS переименовать в SBP2ASPI.EXE и запустить как программу, то она выводит список всех PCI-плат и выдает подробную информацию по найденным контроллерам OHCI-1394.

Собственные универсальные драйверы для работы с USD-устройствами под DOS есть у компании Iomega. ASPI-драйвер USB 2.0 называется ASPIEHCI.SYS (существуют также драйверы для старых USB-устройств — ASPIOHCI.SYS и ASPIUHCI.SYS), а доступ к USB-дискам обеспечивает программа GUEST.EXE, которую надо вызвать в командном файле autoexec.bat.

Таким образом, для инициализации USB-накопителя в файле config.sys вашей загрузочной дискеты должны быть такие строки:

DEVICE= ASPIEHCI.SYS /int /all

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

Имеются подобные DOS-драйверы и для USB-мышей, и для клавиатур. Описанные драйверы, а также другие программы и утилиты для работы с USB под DOS можно скачать, например, на сайте http://www.stefan2000.com/darkehorse/PC/DOS/Drivers/USB/ (некоторые из них имеются на прилагаемом CD-ROM).

В Интернет из DOS

И представил я: город наводнился вдруг разумными людьми,

Вышли все под ДОС, а проклятый Виндовс удаляли, черт возьми!

Позабыв про Ворд, Аксес и прочий настоящий геморрой.

Люди ставят ДОС. Словно в рай заходят в ДОС.

В нормальный, чистый ДОС.

Песня неизвестного автора эпохи Windows

Итак, дисковым пространством в виде USB-накопителей мы обеспечены, теперь пора переходить к запуску приложений. Наиболее полезным, с точки зрения современного пользователя, сегодня является выход в Интернет.

В принципе, в Интернет можно выходить и при самой слабой конфигурации компьютера, если использовать текстовые браузеры, вроде одного из патриархов Интернета — Lynx («рысь»). Сегодня это «животное» изменило цвет и в версии для DOS называется Bobcat («рыжая рысь»), а скачать браузер можно с сайта http://www.fdisk.com/doslynx/bobcat.htm. Скопировав Bobcat на диск (это очень маленькая бесплатная программка — всего в несколько сот килобайт), нужно просто распаковать ее (можно скачать архив ZIP или самораспаковывающийся exe-файл — self-extractor) и запустить newuser.bat (краткая инструкция находится в файле quickbob.doc).

Появится экран с настройками, где надо будет выставить необходимые параметры браузера:

  • указать COM-порт, на котором находится модем. Если он внутренний, то номер порта может конфигурироваться перемычками на плате либо программным конфигуратором (естественно, понадобится полноценный, а не Win-модем);
  • выставить номер прерывания (по умолчанию для внешнего и в соответствии с перемычками на плате внутреннего модема);
  • указать скорость обмена (Baud Rate), а точнее максимальную скорость соединения;
  • изменить, если это необходимо, строку инициализации модема; можно поставить ATZ или оставить по умолчанию;
  • выставить команду с набором телефонного номера для дозвона до провайдера Интернета (Dialer Command). Скорее всего, это будет ATDP с номером телефона;
  • задать имя (логин) и пароль для выхода в Интернет;
  • в явном виде указать используемые DNS-серверы (под DOS они не будут назначаться по умолчанию).

После этого для выхода в Интернет будет использоваться программа bcatdial.bat, которая поднимет трубку, дозвонится и соединится с провайдером, создаст PPP-соединение и запустит резидентную программу, выполняющую роль драйвера, через который данные пойдут по протоколу TCP/IP. Далее запустится текстовый Интернет-браузер Lynx, который, конечно, скромнее современных мультимедийных монстров, но поддерживает как http-, так и ftp-запросы.

Кроме самого браузера, в состав пакета входят Telnet-клиент и простенькая почтовая программа Minuet, которая позволяет отправлять письма по SMTP-протоколу и скачивать почту с POP3-серверов (почтовую программу можно скачать по адресу: http://www.fdisk.com/doslynx/minuet/).

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

Если же текстового браузера недостаточно, то можно поставить мощный графический Web-браузер Arachne («паук»), который запускается из командной строки DOS (http://www.cisnet.com/glennmcc/arachne/). Применять его не намного сложнее, чем Internet Explorer. Для настройки соединения у Arachne есть специальный мастер (PPP Wizard) — почти такой же, как в Windows-программах. «Звонилка» Arachne поддерживает протокол PPP для связи с модемом провайдера и осуществляет автоматическую авторизацию (ввод логина и пароля).

Чтобы подключиться к Интернету при помощи этого мастера, вам нужно выставить следующие параметры:

  • указать COM-порт, на котором находится модем, и выставить номер его прерывания (если вы этого не знаете, то мастер сам может определить, куда подключен модем);
  • указать максимальную скорость соединения (Baud Rate);
  • задать метод набора номера для вашей телефонной линии (тоновый или импульсный). Если у вас тоновый набор, то выберите ATDT, если импульсный, как обычно, то ATDP;
  • набрать номер для дозвона до провайдера Интернета;
  • задать имя (логин) и пароль для выхода в Интернет;
  • в явном виде указать используемые DNS-серверы.

Если вы правильно ответите мастеру подключения на все эти вопросы, то выйти в Интернет вам не составит особого труда, а скорость загрузки страниц на процессоре Pentium будет не ниже, чем под Windows XP на Pentium 4. Единственное неудобство этой программы состоит в том, что она однооконная, то есть одновременно можно посещать только один сайт. Однако сохраняется вся история ваших посещений, а возврат на предыдущую страницу осуществляется очень быстро. Кстати, для ускорения работы в Arachne следует завести RAM-диск и определить на него временную папку (если, конечно, у вас для этого достаточно оперативной памяти):

Графические страницы отображаются вполне корректно (поддерживаются разрешения VESA вплоть до 1024Ѕ768 в полноцветном режиме), загружается графика, поддерживаются таблицы и т.д. Более того, Arachne поддерживает прокрутку страниц колесиком мыши: для этого нужно использовать драйвер мыши CTMOUSE, поставляющийся в комплекте с Arachne (каталог \SYSTEM\DEVDRVRS).

Программа Arachne универсальна, как и Bobcat/Lynx, — в ее комплект входят и «звонилка» PPP, и графический браузер, и почтовая программа, и многое другое. И все это в упакованном виде занимает один мегабайт и помещается на одной дискете. Чтобы русифицировать интерфейс, необходимо скачать специальный модуль (Plug-in) с сайта http://386.by.ru — FULLRUS.APM, а для поддержки русских шрифтов (кодировок) нужны файлы CP1251.APM и KOI8-R.APM. Русифицируются и мастер PPP, и настроечные меню, и полезные советы и т.д. Дополнительные модули устанавливаются из специального инсталлятора Arachne в разделе утилит программы.

По своей сути Arachne является мощной графической оболочкой для DOS и имеет много дополнительных модулей и легко перестраиваемый интерфейс. Короче говоря, несмотря на «смерть» ДОСа, программа Arachne продолжает совершенствоваться!

Радуют и низкие системные требования Arachne: для работы необходим процессор i386, 4 Мбайт памяти, видеосистема CGA/EGA/VGA/SVGA и всего 5 Мбайт на диске. Кроме того, для некоммерческого использования программа распространяется бесплатно (freeware).

Таким образом, Arachne можно настроить на USB-флэшке и получить мобильный выход в Интернет, которым можно пользоваться прямо из DOS. К тому же из-под DOC доступны и другие возможности Интернета, такие как IRC, ICQ и т.д.

Клавиатурные команды управления операциями в DOS

Простым IRC-клиентом под DOS является Trumpet (http://www.trumpet.com.au) — это и newsreader, и IRC-клиент, и самостоятельная «звонилка». Есть и ICQ-клиенты под DOS, причем одна из таких программ реализована компанией LADsoft как специальный модуль для Arachne — Lsicq (http://members.tripod.com/

ladsoft/lsicq/), позволяющий работать с консольной «болталкой» одновременно с просмотром Web-страниц. Конечно, окна браузера и ICQ вызываются по очереди, но в одной программе и с простым переключением между ними.

Развлечения под DOS

Послушать любую музыку под DOS не составляет большого труда — плееров под эту операционную систему написано предостаточно. И среди них выделяется MPxPlay (http://www.geocities.com/mpxplay/) — уникальный проигрыватель практически любых звуковых файлов, который продолжает совершенствоваться до сих пор (последняя версия датирована 16 мая текущего года). Плеер обеспечивает стандартный набор функций, включая управление при помощи мыши и клавиатуры (а также джойстика или устройства, подключаемого в последовательный порт), работу с плейлистами и даже имеет встроенный анализатор спектра.

Особо стоит отметить такую возможность MPxPlay, как подключение ЖК-индикатора к параллельному порту, что позволяет работать даже без видеоадаптера и монитора. MPxPlay дает возможность проигрывать файлы MP3, MP2 (MPG), OGG, CDW, WAV, MPC и AC3. В качестве носителя файлов может выступать загрузочный компакт-диск, что позволяет обойтись без жесткого диска и снижает габариты и энергопотребление устройства, оснащенного MPxPlay. К тому же программа занимает на диске совсем немного места и потребляет ничтожно малого процессорного времени. Программа поддерживает длинные имена файлов (LFN), осуществляет коррекцию звука и конвертирует файлы в различные форматы. MpxPlay является также CD-граббером, то есть позволяет копировать треки с аудиокомпакт-дисков и сохранять их в WAV-формате. В новой версии обеспечена поддержка проигрывания файлов формата MPEGPlus (MPC) и улучшена поддержка OGG-формата.

И что совсем уж удивительно, так это полная поддержка под DOS проигрывания видеодисков (в том числе и просмотр DVD-фильмов). В этой области наиболее популярным считается плеер Quick View Pro (www.multimediaware.com), поражающий своими системными требованиями и количеством поддерживаемых графических и мультимедийных форматов и кодеков. Программа запускается на компьютере с процессором i386, с любой VGA-совместимой видеокартой (желательно VESA-compatible) и с операционной системой DOS 3.0 или выше. При этом желательно иметь SoundBlaster-совместимую звуковую карту.

Эта программа вполне успешно крутит полноэкранные фильмы в формате MPEG-4 даже на процессорах i486, хотя, конечно, для просмотра фильмов лучше использовать процессоры Pentium, а на i486 нужно смотреть фильмы в черно-белом варианте или в половинном разрешении. Кроме фильмов, Quick View позволяет просматривать практически все графические форматы и проигрывать музыку (в том числе и MP3).

О том, как правильно настроить эту программу в зависимости от конфигурации вашего компьютера, можно узнать из очень подробной документации, причем ключей запуска там гораздо больше, чем визуальных настроек. К тому же интерфейс Quick View очень простой и понятный.

Open Library — открытая библиотека учебной информации

Открытая библиотека для школьников и студентов. Лекции, конспекты и учебные материалы по всем научным направлениям.

Категории

Литература DOS Fn 5aH: создать уникальный временный файл

Выход

Вход

DOS Fn 59H: дать расширенную информацию об ошибке

Выход

Вход

DOS Fn 57H: установить/опросить дату/время файла

Выход

Вход

DOS Fn 56H: Переименовать/переместить файл

Выход

Вход

DOS Fn 54H: дать переключатель верификации DOS

Выход

Вход

  • AH = 4fH
  • DS:DX = адрес данных, возвращенных предыдущей 4eH Найти 1-й файл
  • AX = код ошибки если CF установлен
  • DTA = заполнена данными


Описание:

DS:DX указывает на 2bH-байтовый буфер с информацией, возвращенной функцией 4eH Найти 1-й (либо DTA, либо буфер, скопированный из DTA).

Используйте эту функцию после вызова 4eH. следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняемом DOS).

  • AH = 54H
  • AL = 0 если верификация выключена (OFF)
  • AL = 1 если верификация включена (ON)

Описание:

Возвращает текущий статус верификации записи DOS. В случае если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. функция DOS 2eH позволяет установить/изменить режим верификации.

  • AH = 56H
  • DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла)
  • ES:DI = адрес нового ASCIIZ имени (новые путь/имя)
  • AX = код ошибки если CF установлен

Описание:

DS:DX и ES:DI указывают на строки ASCIIZ: «d:путьимяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. диск и путь необязательны (если опущены, они принимаются по умолчанию).

Новое имя ES:DI должно описывать НЕ существующий файл. если указан диск, он должен быть тем же, что и в старом имени. если диск или путь опущены, принимаются текущие умолчания.

В случае если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени.

Замечание:

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

  • AH = 57H
  • AL = 0 чтобы получить дату/время файла
  • = 1 чтобы установить дату/время файла
  • BX = описатель файла (handle)
  • CX = (если AL=1) новая отметка времени в формате время/дата файла
  • DX = (если AL=1) новая отметка даты в формате время/дата файла
  • AX = код ошибки если CF установлен
  • CX = отметка времени файла в формате время/дата файла
  • DX = отметка даты файла в формате время/дата файла

Описание:

BX должен содержать описатель открытого файла (см. 3cH или 3dH ).

Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; к примеру, младшие 8 бит даты находятся в DH.

  • AH = 59H DOS 3.0+
  • BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2)
  • AX = расширенный код ошибки (0, если не было ошибки)
  • BH = класс ошибки
  • BL = предлагаемое действие
  • CH = сфера (где произошла ошибка)

Описание:

используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). вызывайте ее:

  • в обработчике критических ошибок INT 24H
  • после любой функции INT 21H , возвратившей Carry-флаг
  • после вызова FCB-функции, возвратившей AL=0ffH

Версии:

Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.

Читайте также

Выход Вход DOS Fn 59H: дать расширенную информацию об ошибке Выход Вход DOS Fn 57H: установить/опросить дату/время файла Выход Вход DOS Fn 56H: Переименовать/переместить файл Выход Вход DOS Fn 54H: дать переключатель верификации DOS Выход Вход AH =. [читать подробенее]

MS-DOS

Операционные системы MS-DOS, Windows 95, Windows 98 и старое железо компьютера — установка, настройка, использование.

Основные команды MS-DOS . Часть 2.

Команды MS-DOS — минимальный список.

Команды MS-DOS легко запоминаются в случае, если вы владеете хорошо (на школьном уровне) английским языком. Чаще всего команда — это сокращенная фраза.

Эта чистая как снег команда format c: …

Рассмотрим минимальный список команд, которые нам могут понадобиться для работе в DOS. Мы их будем использовать для установки операционных систем на базе DOS или поиска и запуска установленного файлового менеджера.

Команды MS-DOS общесистемного назначения.

При запуске MS-DOS вы увидите приглашение работы в командной строке. По умолчанию оно будет обозначать корневой каталог диска с установленной операционкой. Допустим, операционная система установлена на диск C: , приглашение будет выглядеть:

C:\>

Сменить текущий диск можно набрав новое имя дисковода.

Примеры:
d: — устанавливает текущий диск D:\>
a: — устанавливает текущий диск A:\>

prompt

Изменить вид приглашения (prompt — англ. напоминание, подсказка).

Формат команды:
prompt [текст]

Специальные сочетания символов:
$p — текущий дисковод и каталог;
$n — текущий дисковод;
$d — текущая дата;
$t — текущее время;
$v — версия DOS;
$_ — переход на новую строку;
$s — пробел;
$g — символ «>»;
$h — удаление предыдущего символа.

Примеры:
prompt $p$g — устанавливает приглашение вида c:\mydir\doc>;
prompt $t$h$h$h$h$h$h$g — устанавливает приглашение вида 15:35>

Вывести на экран версию DOS (version — англ. версия).

Формат команды:
ver

Пример:
ver — на экран выводится версия используемой операционной системы. Например: MS-DOS Version 6.22

Команды MS-DOS для работы с каталогами.

Отобразить список файлов и подкаталогов для указанного каталога (directory — англ. директория, каталог)

Формат команды:
dir [дисковод:][путь\][имя-файла] [параметры]

Параметры:
/p — поэкранный вывод;
/w — вывод в широком формате;
/s — оглавление указанного в команде каталога и всех его подкаталогов;
/b — только имена файлов без заголовочных и итоговых сведений;

Сортировки:
/on — по имени;
/oe — по расширению;
/od — по времени;
/og — сначала выводить сведения о подкаталогах;

Примеры:
dir — оглавление текущего каталога
dir *.exe — сведения обо всех файлах .exe текущего каталога

Вывод оглавления в файл или на принтер:
dir > prn — вывести оглавление текущего каталога на принтер;
dir c:\*.txt > txtfiles.txt — создать в файле txtfiles.txt список всех файлов с расширением .txt, находящихся в корневом каталоге диска c:

Изменить текущую рабочую директорию (change directory — англ. изменить каталог, директорию).

Формат команды:
cd [дисковод:][путь]

Примеры:
cd \ — переход в корневой каталог текущего диска;
cd \exe — переход в каталог exe в корневом каталоге;
cd .. — переход в наддиректорию;
cd — сообщает текущий диск и каталог

Создать директорию (make directory — англ. создать каталог, директорию).

Формат команды:
md [дисковод:][путь\]имя-каталога

Примеры:
md abc — создать каталог abc в текущем каталоге;
md c:\users\my — создать каталог my в каталоге users в корневом каталоге диска c:

Переместить файлы в другой каталог. Переименовать директорию (move — англ. переместить).

Формат команды:
move [/y] имя-файла имя-каталога
move [/y] имя-файла [дисковод:][путь]новое-имя-файла

С параметром /y при существовании в каталоге-приемнике файлов с теми же именами, что и пересылаемые, выполняется замещение этих файлов без запроса. Задание нового имени возможно только при пересылке одного файла. Например, команда move *.bac a:\*.old ошибочна.

Примеры:
move *.doc d:\ — переместить файлы с расширением doc из текущего каталога в корневой каталог диска d:;
move f1.txt tmp\f2.txt — переместить файл f1.txt в каталог tmp с переименованием в f2.txt.

Формат команды:
move [дисковод:][путь\]имя-каталога новое-имя-каталога

Примеры:
move a:\temp tmp — переименовать каталог temp корневого каталога диска а: в tmp.

deltree

Удалить каталог со всем содержимым (delete tree — англ. удалить дерево (файлов или директорий)).

Формат команды:
deltree [/y] имя-файла-или-каталога

Команда deltree может удалять как каталоги, так и файлы. В имени файла-или-каталога можно использовать символы * и ?.

Примеры:
deltree temp — удалить каталог или файл с именем temp из текущего каталога;
deltree /y d* — удалить из текущего каталога все каталоги и файлы, имя которых начинается на d, не запрашивая подтверждение.

Команды MS-DOS для работы с файлами.


Вывести (напечатать) содержимое файла на экран (type — англ. напечатать).

Формат команды:
type имя-файла

Примеры:
type t1.doc — вывод на экран файла type t1.doc из текущего каталога.

copy con

Создать текстовый файл (copy console- англ. скопировать консоль (то, что набираем клавиатурой на экране) в файл).

Формат команды:
copy con имя-файла

Ctrl+Z, F6 — признак конца файла.
Enter — признак конца строки.

Примеры:
copy con work.txt — создать в текущем каталоге текстовый файл work.txt.

Копировать файл (copy — англ. скопировать).

Формат команды:
copy имя-файла1 имя-файла2
copy имя файла1 [имя-каталога2]

В именах файлов можно употреблять символы * и ?, а также указывать имя диска и путь.
Команда copy не копирует скрытые файлы и файлы нулевой длины.
Если файл с таким же именем, как у копии, создаваемой командой уже существует, то он замещается.

Примеры:
copy x.txt z.txt — скопировать файл x.txt в текущий каталог с именем z.txt;
copy a:\*.* — cкопировать все файлы из корневого каталога диска а: в текущий каталог текущего диска;
copy \text\*.txt a:*.doc — скопировать из подкаталога text текущего каталога все файлы с расширением txt в текущий каталог диска а:. Файлы получат расширения doc.

Использование устройств:
copy t1.txt prn — копирование файла t1.txt на принтер;
copy t1.txt con — копирование файла t1.txt на экран монитора

Удалить файл (delete- англ. удалить).

Формат команды:
del имя-файла

Примеры:
del *.txt — удалить все файлы с расширением .txt из текущего каталога;
del name.doc — удалить из текущего каталога файл с именем name.doc

Переименовать файл (rename- англ. переименовать).

Формат команды:
ren имя-файла1 имя-файла2

В параметре имя-файла1 можно указывать дисковод и путь, в имя-файла2 — нет.
Команда ren не обрабатывает скрытые файлы.

Примеры:
ren xxx.doc xxx.txt — переименовать файл xxx.doc текущего каталога в xxx.txt;
ren a:*.txt *.doc — переименовать все файлы текущего каталога на диске а: с расширением .txt в файлы с такими же именами и расширениями .doс

Команды MS-DOS для работы с дисками.

format

Форматировать диск (format— англ. форматировать).

Формат команды:
format дисковод: [параметры]

Параметры:
/s — создать системный диск;
/v:метка — задание метки диска;
/u — безусловное форматирование с уничтожением имеющихся данных;
/q — быстрая очистка без контроля наличия сбойных участков.

Если параметры не указаны, то программа проверяет, форматирована ли дискета; оставляет формат таким же, что и имеющийся; стирает информацию обо всех файлах и каталогах из системных областей; тестирует область данных на наличие сбойных участков.

Примеры:
format a: /u — безусловное форматирование дискеты а:;
format a: /q — очистка дискеты;
format a: /s — форматировать дискету и сделать ее системной.

Перенести на диск системные файлы DOS (system- англ. система).

Формат команды:
sys [путь] диск:

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

Примеры:
sys a: — перенести на диск а: системные файлы из корневого каталога текущего диска.

fdisk

Сконфигурировать жесткий диск для использования DOS. Работает в интерактивном режиме. (disk— англ. диск). Работает в интерактивном режиме (вопрос-ответ).

  • создание основного раздела MS-DOS;
  • создание расширенного раздела MS-DOS;
  • установка активного раздела;
  • удаление раздела;
  • вывод данных раздела;
  • выбор следующего жесткого диска для создания разделов (если система имеет несколько жестких дисков).

Формат команды:
fdisk [параметры]

Параметры:
/? или /H — вывести справочный текст.
/d — позволяет удалять разделы, отличные от DOS. Его следует использовать с осторожностью.
/ststus — вывести обзорную информацию о разделах жесткого диска (дисков) вашего компьютера. Если /ststus не обеспечивает достаточно подробной информации о диске, то запустите программу fdisk без параметра /ststus и выберите пункт 4.

Примеры:
fdisk — начать работу с дисками в интерактивном режиме.

label

Задать метку диска, тома (label— англ. метка, этикетка).

Формат команды:
label дисковод:

Метка — обозначение длиной до 11 символов.
Недопустимые символы: * ? / \ | . , ; : + = [ ] ( ) & ^ » .
Чтобы узнать метку диска, можно использовать команду vol. (vol дисковод:)

Примеры:
label a: — сообщить меткe диска а:.

В третьей части цикла статей об основных командах MS-DOS мы рассмотрим применение наших знаний на практике при установке операционной системы на старое железо.

Комментировать Отменить

Для отправки комментария вам необходимо авторизоваться.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Программирование на Ассемблере под DOS

2.1. Проба молотка

#1. Теоретически гвозди можно забивать и голыми руками. Но намного быстрее и безболезненнее делать это с помощью молотка. Пользоваться им, как известно, каждый дурак умеет. Чего там сложного? Взял оный в руки — и молоти: раз по гвоздю, два раза по пальцам (понимание приходит с опытом). Молотки бывают разные: большие и маленькие, с длинной ручкой и с короткой ручкой, железные и деревянные, приспособленные для забивания гвоздей и приспособленные для пробивания черепов. Да и гвоздей разнообразие еще то! И разной длины, и разной толщины, и со шляпками разной формы, из разного материала сделанные. есть даже специализированные для прибивания рук к кресту! :(.
Так вот: виды молотков и особенности их использования мы пока что оставим в покое. Для начала просто возьмем гвоздь, который уже не раз забивали голыми руками (больно было?) и забьем его при помощи молотка! Помните, как мы программу, выводящую окошки, без компилятора одними мнемониками писали?
А теперь ее же, дуру, «под компилятор» перелопатим. В общем, настало время, братья, тайну нервную и страшную узнать. Сегодня мы познакомимся с компилятором.

#2. Нижеследующий текст набираем в текстовом редакторе:

Сохраняем получившуюся дуру под именем proga_1.asm.
Далее запускаем файл tasm.exe и в качестве параметра передаем ему имя файла с исходным текстом программы. То есть командная строка у вас (в том же Windows Commander’е) вот какая должна быть:

Если вы правильно набрали текст программы, то TASM должен выплюнуть вам вот что:

Самое тут главное — это чтоб «Error messages» был «None». Это значит, что ошибок в программе нет.
Поехали дальше. Если ошибок у вас действительно никаких не было, то в том же каталоге, что и proga_1.asm ищите файл proga_1.OBJ. Можете даже по F3 попробовать просмотреть его содержимое. Что-нибудь поняли? Если нет — отсылаю вас к «Введению в машинный код».
А теперь запускаем хорошую программу TLINK следующим образом:

Обратите внимание: линкуем мы именно файл с типом OBJ, а не ASM.
Что получилось? А получился файл proga_1.COM!! И этот .COM работает!
Посмотрите на его содержимое в DZEBUG’е :). Отличется ли оно чем от той проги, что мы делали ранее?
Нет, не отличается!
Медитируем.

#3. А теперь несколько слов о том, почему не стоит писать программы так, как мы это делали раньше:
1. Эти проклятые адреса! Пойди рассчитай на какой адрес прыгнуть нужно, с какого смещения подпрограмма начинается, с какого блок данных. В принципе, как мы уже убедились, в этом нет ничего сложного. просто занятие это очень уж муторное и неинтересное.
Как абсолютно верно заметил некто Евгений Олейников в RTFM_Helpers: «Когда я пишу программу, я не знаю точного адреса начала будущей подпрограммы».
2. Очень сложно было в том случае, когда возникала необходимость ВСТАВИТЬ ту или иную команду в середину кода. Приходилось перебивать код по новой. по новой пересчитывать адреса. ужас, в общем!
Так вот: основная и самая главная функция «ассемблерного компилятора» — это как раз и есть «просчитывание адресов»!
Смотрите, как хорошо и приятно: Мы готовим исходный текст в обыкновенном текстовом редакторе :). Просто набиваем строчка за строчкой — нам не важны адреса (мы их вообще не видим!), не важны «точки входа» в процедуру. Спокойненько вставляем какую надо команду, спокойненько удаляем. Без лишнего напряга!
Да вы посмотрите на блок 3 программы :). Там все те же хорошо знакомые команды :).
Особое внимание обратите на команду CALL, которая у нас, как известно, вызывает процедуру. После нее идет не привычный адрес начала процедуры, а всего лишь ее «имя собственное»! А сама процедура находится между строчками WINDOW proс (начало процедуры) и WINDOW endp (конец процедуры).
«WINDOW» — понятно, это «имя собственное». «Proc» — потому что процедура. «Endp» — потому что конец процедуры.
Тут еще один момент. подобные «словеса» КОМАНДАМИ АССЕМБЛЕРА НЕ ЯВЛЯЮТСЯ. Они называются инече — «директивами». Это не ПРИКАЗ делать то-то и то-то, а ЦЕННОЕ УКАЗАНИЕ компилятору (не процессору!), что и как ему делать с данным куском кода.
Процедуры — вещь хорошая! Все процедуры хороши, и в большой программе их чертовски много! Это вам не языки высокого уровня, где можно длиннющие простыни кода лабать и все будет работать! («Дельфи-компилятор не даст вам выстрелить себе в ногу, но будет так удивлен попыткой сделать это, что через некоторое время сделает это сам.» (С) DZ WhiteUnicorn).
Это ASM! Тут запутаться легче простого! Исходники неимоверно длинны и сложны! Все делается ручками (хоть и с помощью компилятора), а ошибки довольно трудно отслеживаются (для не-дZенствующих это вообще занятие безнадежное)! Вот и выкручиваются низкоуровневые программеры таким вот образом: всю программу (даже в тех случаях, когда это не обоснованно!) делят на меленькие кусочки-процедурки. Напишут процедурку, протестируют ее так и сяк. если работает — за следующую берутся.
Сии «методы проектирования» мы еще с вами еще не раз рассмотрим :). Пока что знайте вот что: любую прогу можно/нужно рассматривать как КУЧУ ПРОЦЕДУР, которые все между собой повязаны.
Но есть среди этих процедур САМАЯ ГЛАВНАЯ! Это та, С КОТОРОЙ НАЧИНАЕТСЯ ВЫПОЛЕНИЕ ПРОГРАММЫ! Ее никто не вызывает. Она — босс! Она всеми командует, все гребет под себя. Описывают ее те же самые директивы, что и прочие «подчиненные процедуры». Но есть у нас еще одна директивка, которая указывает, КАКАЯ ИМЕННО процедура ИЗ ВСЕХ вроде бы «равноправных» является ГЛАВНОЙ.
Видите строчку end MAIN в конце исходного текста программы? Именно она и указывает ГЛАВНУЮ ПРОЦЕДУРУ («MAIN» — ее имя собственное). Если бы мы написали end WINDOW, то выполнение программы у нас началось бы с первой строчки процедуры WINDOW, и ни одна строчка из MAIN выполнена не была бы.
Уф. в общем долго и упорно медитируйте.

#4. Наличие многочисленных директив — это своего рода плата за то, что компилятор избавляет нас от необходимости просчитывать адреса. Как говорит дZенская программерская мудрость «любишь кататься, люби и саночки возить».
Как и в DZEBUG’е, «в TASM’e» мы также должны четко инструктировать компилятор (дабы он в свою очередь также четко проинструктировал процессор) что у нас является кодом, а что — данными.
Посмотрите на исходник. Весь текст программы у нас хранится между директивами CODESG segment и CODESG ends. Где CODESG — это «имя собственное», «segment» — потому что «CODESG» он, собственно, и есть сегмент :), и «ends» — потому что конец сегмента. (сравните с процедурными директивами).
Но тут такой вопрос:
Директива ASSUME производит связывание сегментного решистра CS с «именем собственным».
Далее у нас следует директива org 100h. Нужна она нам для того, чтобы компилятор понял, что мы хотим получить именно COM-файл, который, как известно, помещается в сегмент памяти начиная со смещения 100 (в общем-то, это необходимое, но вовсе не достаточное условие для получения COM-файл). Директивка очень интересная, о ней мы, надеюсь, еще поговорим подробнее, когда коснемся вирмейкерства.

#5. Ладно. с директивами более-менее разобрались, исходник приготовили, пора разбираться че там дальше происходит.
Дальше происходит так называемое «ассемблирование», т.е. перевод команд в соответствующие машинные коды. При этом просчитываются адреса меток, адреса начала подпрограмм, адреса начала/конца сегментов. и многое другое.
Причем ассемблирование происходит как минимум в два приема. Посудите сами: откуда компилятору знать, с какого адреса начнется процедура WINDOW, если не известно, какая еще простыня команд ПОСЛЕ этого CALL’а будет? В DZEBUG’е мы это «в уме на листике» считали.
TASM это тоже аналогичным образом делает :).
При первом проходе он подсчитывает, сколько какая команда занимает места, с каких адресов начинаются процедуры и т. д. и только при втором проходе подставляет в call’ы КОНКРЕТНЫЕ АДРЕСА начала этих процедур. всего лишь. ну еще и ваши «d» и «b» в машинные «h» (которые на самом деле «b») переводит. (во завернул!).
А вообще TASM много еще чего делает. программеры народ ленивый.
В результате ассемблирования мы получаем так называемый «объектный файл».
«И что это за дрянь?» — спросте вы и правильно спросите.
А вы сравните шестнадцатеричное содержимое OBJ и COM файлов. В OBJ присутствует та же последовательность байтов, что и в OBJ. Но помимо этого и еще какая-то шестнадцатеричная ерунда присутствует: имя сассемблированного файла, версия ассемблера, «имя собственное» сегмента и т. д.
Это своего рода «служебная» информация, предназначенная для тех случаев, когда ваш исполнимый файл вы хотите собрать из нескольких. При разработке больших приложений исходный текст, как правило, хранится в нескольких файлах в каждом из них прописаны свои сегменты кода/данных/стека. А исполнимый получить нам нужно только один — с единым сегментом кода/данных/стека. Именно это TLINK и делает: завершает определение адресных ссылок и объединяет, если это требуется, несколько программных модулей в один.
И этот один у нас и является исполнимым. УРА!

#6. Итак, первую прогу с использованием компилятора мы написали. Теперь напишем вторую. Набиваем ее исходный текст, и компилим:

Итак, в этой программе мы использовали функцию 13h прерывания 10h (INT 10h, AH=13h).
Вот ее описание:

[INT 10h, ФУНКЦИЯ 13h] — записывает на экран символьную строку, начиная от указанной позиции.
ВХОДНЫЕ ПАРАМЕТРЫ:
AH = 13h;
AL — код формата(0-3):
AL=0, формат строки <симв., симв. симв.>и курсор не перемещается,
AL=1, формат строки <симв., симв. симв.>и курсор перемещается,
AL=2, формат строки <симв., атр. симв., атр.>и курсор не перемещается,
AL=3, формат строки <симв., атр. симв., атр.>и курсор перемещается;
BH — страница дисплея;
BL — атрибут (для режимов AL=0, AL=1);
CX — длина строки;
DX — позиция курсора для записи строки;
ES:BP — указатель строки.
ВЫХОДНЫЕ ПАРАМЕТРЫ: отсутствуют.

А еще мы использовали команду LEA, которая загружает в регистр адрес (смещение), с которого у нас начинается блок данных.

2.2. Несколько «тупых» процедурок

#1. Дабы сходу «обломать» нездоровую критику, сразу предупреждаем, что нами сознательно допущена некоторая излишняя «процедуризация» исходного кода. А по сему, прежде чем взяться за изучение нижеследующего материала, твердо уясните: в данном случае (как есть сейчас) дробление кода на процедуры — дурь полная. А обосновываем мы эту дурь только тем, что впоследствии будем совершенствовать эти процедуры до уровня, когда, собственно, сие «дробление» и будет обосновано.
И еще. Подобный модульный подход (это понятие немножко шире, чем просто «использование процедур») в некоторых случаях снижает быстродействие и увеличивает размер исполнимого файла, однако он же и значительно увеличивает «читабельность» исходника, что вполне обоснованно с точки зрения обучения. И с точки зрения «командной» разработки программ — тоже. (В общем, критика по этому поводу не принимается!).
Итак, для начала набиваем вот какой текст (исходник это!):

Здесь вам все должно быть понятно. INT 20h вынесен в отдельную процедуру и только. Плюс еще какие-то нездоровые заголовки добавлены, которые и весят-то больше, чем сам код. Это нормально. После точки с запятой в исходнике вы можете писать все, что угодно. Все равно при компиляции это будет проигнорированно и, следовательно, на размер исполнимого файла не повлияет. (Точно так, как и длина «имен собственных» процедур и меток).
Мы предлагаем использовать именно такую «шапку» комментария к каждой из ваших процедур. Все очень просто. Первая строчка — это «что делает процедура». Вторая — какие ей необходимо передать параметры. Третья — какие она возвращает параметры. Четвертая и пятая, соответственно, — какие в процедуре использовались прерывания и хм. ранее написанные процедуры :). Это намного облегчит понимание вашего исходника как вами самими, так и теми, кому вы его предоставите на поругание.
Для тех, кто в танке: последующие процедуры вставляйте между процедурами TESTING и EXIT_COM — не ошибетесь :-p.

#2. Следующая процедура также основана на одном-единственном прерывании. Все, что она делает — это возвращает текущие координаты курсора.

Прежде всего обратите внимание на цепочку push’ей и pop’ов (далее — просто «поп»), на очередность записи в стек (AX, BX, CX) и извлечения (CX, BX, AX — обратное то есть). Все регистры, которые мы собираемся изменять внутри процедуры, должны обязательно сохраняться в ее начале и восстанавливаться в ее конце. В важности соблюдения этого правила вы еще не раз убедитесь на своем горьком опыте. Те, кто медитировал над заданием из главы 1.10 #4, уже знают, о чем тут идет речь (а кто не пытался — самое время!).
Давайте посмотрим на нашу процедуру с точки зрения пушей и поп. AH мы изменяли для указания функции прерывания, которую мы хотим использовать. BH обнуляли для указания видеостраницы (пока будем только одну-единственную, нулевую, юзать). «А CX зачем» — спросите. — «Вроде мы его не трогали. «. И точно, мы — не трогали. А посмотрите в описании, что в этот регистр нам засунуло прерывание в «результате» своего выполнения. Посмотрели? Оно вам надо?? То, что нам надо — координаты — засунуты в DX (DH, DL), поэтому их значения мы не сохраняем. Если бы нам нужно было получить информацию о типе курсора — мы бы запушили DX, а CX бы оставили в покое.
Что? Без пива не разобраться?
Так в чем, черт подери, дело? Разбирайтесь под пиво!!
Вот вам еще одна аналогичная процедура, которая не определяет, а УСТАНАВЛИВАЕТ курсор в заданные коодинаты.

Если кто чего не понимает — смотрите комментарии к предыдущей процедуре (+ описание прерываний и команд! это обязательно!). Если кто не понял и предыдущую — снова отсылаю к главе 1.10

#3. На основе двух предыдущих процедур мы напишем третью «курсорную» :), которая будет сдвигать курсор на одну позицию вправо.

А здесь очень простая идеология :)). Из двух процедур мы собрали третью :)). Вызвали CURSOR_READ, получили в DX текущие координаты курсора. Ту координату, что столбец (DL, младшая часть DX), увеличили на единицу. А потом вызвали процедуру CURSOR_SET, которая у нас устанавливает координаты курсора. Новые координаты в нее передаются опять таки через тот же DX. Улавливаете?
Естественно, мы запросто можем отказаться от процедур CURSOR_SET и CURSOR_READ и решить данную задачу внутри одной процедуры. В общем, свой выбор вы сделаете сами. Страшна Сцилла оптимизации по быстродействию, еще страшнее — Харибда оптимизации по размеру, но тварь самая страшная — это Программер, который оптимизирует свой код по собственной «удобноваримости». (Хм. интересно, что бы сказали по этому поводу программеры Мелкософта. )
Обратите также внимание, на push/pop DX внутри процедуры. Мы просто сдвигаем курсор вправо. ПРОСТО СДВИГАЕМ на одну позицию. То, что в DX нам надо? Сто лет оно нам не надо. херим. А остальные регистры — еще процедурами CURSOR_SET и CURSOR_READ неоднократно «похерены». В каком смысле «похерены»?? А в таком, что состояние регистров ПОСЛЕ вызова CURSOR_RIGHT в точности такое же, как и было ДО. Хотя сами помните, что всю четверку регистров мы еще как юзали.
Вот теперь можно сделать паузу и (это мериканцы пускай свой пластмассовый твикс кушают) ПОМЕДИТИРОВАТЬ.

#4. Следующая процедура ну вааще элементарна:

Она символ на монитор выводит. Через 9-ю функцию 10-го прерывания. А потом (после вывода) курсор на позицию вправо перемещает. Догадайтесь сами, «путем вызова» какой процедуры. Ага, правильно :)), CURSOR_RIGHT.
Посмотрите на описание этого прерывания. Код символа должен быть в AL. А у нас в комментариях он в DL прописан. А перед INT 10h mov AL,DL нездоровый стоит. Нахрена он тут?? И правильно!! Этот mov можно удалить, и передавать значение через AL. Но я тварь вредная. Привык я, понимаете-ли, через DX передавать. привычка — сила страшная!! Лень с ней бороться. Лень, а поэтому и не буду. Кто-то в подобном мове может и более глубокий смысл найдет — наверняка найдет!! В общем — ищите сами. На блюдечке с голубой каемочкой вам это не преподнесу :)). Вредный.
mov BL,00000111b (не 07h) написано специально. Это чтоб вы посмотрели, как кодируется атрибут (фон, цвет) энтого символа. В одном из предыдущих номеров даже табличка есть, из справочника содранная.

#5. В языке «командного интерпретатора DOS» есть хорошая команда — CLS (то бишь очистка дисплея). Хорошая команда! Кто не поленится заглянуть, внутрь command.com’а, увидят приблизительно следующее (на самом деле все чуть-чуть навороченнее, но прерывание то же):

Короче, элементарный скроллинг, только заданы максимально возможные координаты скроллируемого окошка и CX=0. в общем, окошки рисовали, помните.

#6. Тестируем, штоль?? Дописываем процедуру TESTING:

Компилим. CLS тож тестируем. Все работает??

А теперь самое интересное :)) и благоприятно влияющее на нервную систему :). Прелесть модульного подхода вот в чем: написали процедуру, протестировали успешно — и МОЖЕТЕ ЗАБЫТЬ нафиг, как она у вас работает, какие функции там используются, какие хитроПОПые алгоритмы там применены.
Просто смотрите на заголовок, че она делает, чего ей надобно на входе, чего возвращает. а ее «внутренности» вам глубоко фиолетовы. Работает — и ладно. Ааааaaa?? Круто?
Уф. медитируйте!!

2.3. Печать «шестнадцатеричных циферек»

#1. Мы уже неоднократно юзали хорошую мнемоническую (aka ассемблерную) команду ADD :). Напомню, что в результате выполнения команд

в регистр AX у нас помещалась сумма (AX=AX+BX).

Мы смотрели на это дело под отладчиком, и, к своей неописуемой радости, убеждались в том, что эта дрянь действительно работает. Но толку нам знать, что она работает?? Программа ведь не только работать должна, но еще и диалог какой-нить между юзверем и компутером обеспечивать! Например, спрашивать у него эти два числа и выплевавать на монитор результат их сложения.
Вот именно — выводить на монитор, а не заносить в какой-то абстрактный регистр.
С клавиатурным вводом пока обождем, а вот с выводом (на монитор) разберемся прямо сейчас.

Как мы это сделаем? Вы уже неоднократно слышали, что «в ассемблере» все делается «ручками» :). Сейчас вы лишний раз убедитесь в том (некоторые замрут в ужасе), что это утверждение истинно. Для вывода значения регистра мы вовсе не «познакомимся с новым прерыванием». Даже такая простейшая операция, как «вывод на дисплей значения регистра (переменной)» — это целая процедура. И не одна, как вы скоро в этом убедитесь. Страшно?

#2.Задача: вывести на монитор значение регистра DL.
Народ! Давайте сразу расставим границы между КОДОМ СИМВОЛА и его НАЧЕРТАНИЕМ.
Например, у нас F3h в DL. Как мы хотим это вывести? Как символы ‘F3’ или же как ASCII символ, соответствующий коду F3h? Определяемся. Если в DL у нас F3h — то надо чтоб именно ‘F3’ у нас на монитор и выводилась. Не ‘э перевернутое’, не ’46 33′, а именно ‘F3’. Помедитируйте. Уловите разницу между ‘э’, ’46 33′ и ‘F3’.

Эту задачу мы немножко упростим :). Для начала напишем процедуру, которая выводит только младшую тетраду регистра DL (цифру «3» в нашем примере). Для этого мы обратимся к процедуре WRITE_CHAR из прошлого номера. Именно она печатает нам на монитор символ, ASCII-код которого находится в DL.
Но тут загвоздка: в DL-код, а печатается-то символ :). А нам, собственно, именно две циферки шестнадцатеричного кода, как два символа, и нужно напечатать. Ну, или хотя бы младшую циферку этого кода.
Решается эта задача элементарно :). Главное — это правильно ее сформулировать!
Вот что я тут «нарисовал»:

Только во второй колонке вместо вопросительных знаков должны быть соответствующие всякие символы (посмотрите в ASCII-таблице, какие они на вид страшные!).

Процедурка наша вот что должна делать — Всего-навсего перевести (конвертировать) тетраду в код соответствующего ей символа. Завернуто? Если разобраться, то не очень-то и завернуто.
Смотрите: в DL у нас 03h. Хотим мы эту ‘3’ на монитор вывести. Если вызовем WRITE_CHAR, то у нас символ «сердечко» выплюнется. А надо, чтоб символ ‘3’ вывелся, код которого 33h.
Соответственно и для остальных смотри по табличке.

А теперь обратите внимание, насколько «шестнадцатеричная циферка» (тетрада) отличается от ASCII-кода, этой «циферке» соответствующего. Сам скажу: на 30h для цифр от ‘1’ до ‘9’, и на 37h для цифр от ‘A’ до ‘F’. То есть «переконвертацию» мы запросто можем сделать командами add DL,30h (если тетрада в диапазоне 0. 9) и add DL,37h (если тетрада в диапазоне A. F).

Короче, вот код (пропиваю!):

Сначала, ессно, изменяемые регистры сохраняем (мы ж их изменяем!). (Ну, и восстанавливаем в конце процедуры (PUSH и POP соответственно)).
Потом у нас логическое ветвление организовано. Сравниваем значение DL с «общей границей» наших двух диапазонов (команда — CMP, «граница» — 0Ah). Если это значение больше или равно 0Ah, то прыжок на метку HEX_LETTER, прибавление к DL 37h и печать цифры (WRITE_CHAR). Иначе добавляем 30h и безо всяких условий перепрыгиваем на вызов WRITE_CHAR (минуя add DL,37h то бишь).
Все. Тестируем.

#3. Про тестирование — базар отдельный. В данном случае мы можем запросто проверить нашу процедуру на абсолютно всех возможных значениях этой тетрады (всего-то ничего 16 вариантов). Но намного правильнее, проанализировав алгоритм, установить своего рода «критические» значения, на которых целесообразно проводить проверку. Плюс, естественно, минимальное и максимальное значения.

Если сия «тестовая» (она же — главная) процедура выведет на монитор

значит мы с высокой долей вероятности можем быть уверенными, что процедура WRITE_HEX_DIGIT работает правильно на всех значениях младшей тетрады DL.
Кто не просто скопировал процедуру из буфера обмена, а действительно разобрался с тем, как она работает — сами знают, что значение старшей тетрады нашей процедуре НЕбезразлично. Оно должно быть равным 0.

#4. Что мы имеем? Процедуру для вывода на дисплей одной шестнадцатеричной циферки — младшей тетрады (в DL). Но нам-то нужно две вывести! Сначала старшую циферку-тетраду, и только потом — младшую!
Таким образом очередная задача разбивается на две части: печать старшей тетрады DL и печать младшей тетрады DL.
Первая «подзадача» решается легко: нужно просто старшую тетраду переместить на место младшей и вызывать процедуру (основательно протестированную и 99,9%-но работающую) WRITE_HEX_DIGIT.
А вторая подзадача — хм. заключается в восстановлении предыдущего (мы ж тетраду перенесли) значения DL и снова — вызове WRITE_HEX_DIGIT.
(Хе! Вот теперь-то вы уж точно почувствуете всю прелесть «дробления кода на процедуры»!)

Перенос тетрады мы осуществим при помощи команды SHR, которую в умных книжках обзывают как «логический сдвига разрядов операнда вправо». Объясню.
Представьте себе деревянную доску, длинной в 8 бутылок пива и шириной в одну. (В принципе, доску эту можно и в два раза длиннее представить, но тогда на ней надо «DX» написать, мы же пока только «DL» напишем). А еще дурня, у которого на лбу SHR написано. Так вот, если этому придурку стукнуть по хребту, то он слева от доски поставит ПУСТУЮ бутылку, а остальные сдвинет на одну позицию вправо, в результате чего самая правая бутылка, ессно, с доски упадет.
Бутылки, которые сразу стояли, могут быть пустыми или полными, а вот дурень SHR — только пустые ставит. И только слева.

Ну тут и ежу все понятно. Четыре раза дурню по хребту надо дать, чтоб старшая тетрада на место младшей переместилась.
(На самом деле самая правая бутылка перед тем как об землю разбиться, на некоторое время в воздухе зависает, но вы пока этим голову не забивайте).
Реализовывается этот сдвиг вот как:

В DL — наша цепочка битов. (11110011b = F3h, естественно).
В CL заносим «на сколько позиций» нам нашу цепочку сдвинуть.
Ну и SHR — это дурень, который сдвигает вправо, а слева нули дописывает.

#5. Думаете, это все?? Разогнались!! Не все так просто :).
WRITE_HEX_DIGIT у нас требует, чтобы первой тетрадой были только одни нули. Я заострял на этом ваше внимание.
При печати первой тетрады это условие соблюдается. SHR слева нули дописывает.
А вот при печати второй цифры нужно вот что: ничего никуда не сдвигая, обнулить старшую тетраду, а младшую (которая, собственно, и есть «цифра») оставить в покое.
Решим мы эту команду при помощи логической операции «и» (and по-аглицкому).

А теперь и для особо одаренных:

Смотрите, интересно как получается:
Если мы AND чего-либо (нуля или единички) с 0 делаем, то у нас в результате 0 и только 0 получается.
А если AND с единичкой — то ЧТО БЫЛО, ТО И ОСТАЕТСЯ.
(Это и есть потаенный дZенский смысл команды AND)

Решение нашей проблемы (обнулить старшую тетраду, а младшую оставить без изменений) таким образом сводится к тому, что старшую тетраду нужно «AND 0», а младшую — «AND 1».
То есть значению DL с 00001111b (оно же — 0Fh) «AND» сделать.

На ассемблере это вот как выглядеть будет:

Естественно, 00001111b = 0Fh

#6. Уфф. Вот что получиться в итоге должно:

Ну че тут объяснять?? Я уже объяснил все!! Единственное, что могу добавить — это про mov DH,DL. Этой командой мы значение регистра копируем перед тем как биты «ему» сдвинуть. А потом статус-кво mov DL,DH восстанавливаем, чтоб и младшую цифру напечатать.
Все. Тестируем. Вроде должно работать.

#7. Так сказать «к вопросу о шаблонах мышления».
Мы тут доооолго трахались с тетрадами. Вроде успешно.
Когда при тестировании понимаемости материала мы предложили пяти «подопытным» самостоятельно написать процедуру для вывода на монитор «большого» регистра (DX), они все как один начали сдвигать байты. :(
Народ!! Это не есть правильно!!

Команды xchg DL,DH и xchg DH,DL, кстати, работают абсолютно одинаково. Операнды просто меняются между собой значениями. В качестве одного из операндов может выступать память.

#8. Ну, и напоследок, — информация к размышлению:

Команду shr можно использовать для деления целочисленных операндов без знака на степени 2 :)).

Думаете эти «фокусники» который в уме офигенны уравнения считать умеют, шибко умные?? Нифига!! Они просто люди ЗНАЮЩИЕ. А делить на десять и вы умеете.
Над этим я настоятельно рекомендую дооооолго помедитировать. А еще над тем, что девушки весьма и весьма любят, когда им фокусы показывают. Впрочем, это (вычисления в уме) — тема отдельная. Мы ее тоже когда-нить коснемся :). MATRIX MUST DIE!!

2.4. Печать десятичных циферек

#1. Для тех, кто медитировал над главой 1.1 алгоритм должен быть понятен как 2+2=(вписать желаемое). Кто не въедит в алгоритм WRITE_DECIMAL — научитесь сначала переводить числа между радиксами на листике в клеточку.
Итак, ставим новую задачу. В DX у нас шестнадцатеричное число. Нам нужно напечатать его на монитор в «десятичном формате». Еще раз обращаю ваше внимание на то, что существует множество способов ее решения. Мы же выбрали способ, который:
а). Вам легче всего будет понять.
б). Требует минимального количества «новых» команд.
Кто скажет, что мы не правы — пусть первый кинет камень в эхо-конференцию RTFM_Helpers.

#2. Прежде всего посмотрите на процедуру WRITE_HEX_DIGIT и вспомните, какой алгоритм положен в основу ее работы. Вспомнили? Рад за вас!!
А теперь мы познакомимся к командой деления. Что будем делить?? Ну естественно, «регистры» :).

Новая команда называется «деление беззнаковое» (DIVide unsigned).
Что такое делимое/делитель/частное, я вас грузить не буду, это в учебнике арифметики для младших классов более чем понятно расжевано. Ну во всяком случае детишки это понимают.
(Кто скажет, что 10/3=3 а остаток 333 в периоде — тот дурак. Кто скажет, что остаток будет равен 1, скажет правильно.)

Следующий кусок кода демонстрирует деление значения регистра AX на значение регистра BL.

Обратите внимание: ДЕЛИМОЕ у нас может располагаться только в регистре AX (другими словами, делимое задается неявно), а ДЕЛИТЕЛЬ — в любом регистре.
Кто не верит — посмотрите под отладчиком.

1. Если делитель размером в байт, то после операции частное помещается в AL, а остаток — в AH.
2. Если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX (младшая часть делимого в AX). После операции частное помещается в AX, а остаток — в DX.
2. Если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX (младшая часть делимого находится в EAX.) После операции частное помещается в EAX, а остаток — в EDX.

Внимание, подводный камень! В следующем примере:

у вас вовсе не AX на BX делиться будет, а парочка DX:AX на BX.
Помедитируйте над этим :))

#3. А теперь, собственно, пропиваю саму процедуру вместа с традиционным расжевыванием оной:

Алгоритм простой: пока частное не равно 0, делим его, делим и еще раз делим на 10d, запихивая остатки в стек. Потом — извлекаем из стека. Вот и вся «конвертация» из HEX в BIN :). Это если в двух словах.
А если подробно, то вот что получается:
Бряк 1 — подготавливаем делимое. Как уже говорилось, оно у нас задается неявно — обязательно через AX. А параметр у нас — через DX процедуре передается. Вот и перемещаем.
Бряк 2 — это, собственно, делитель.
Бряк 3 — очищаем CX. Он у нас будет в качестве счетчика. О нем мы еще поговорим.
Бряк 4 — очищаем DX. Если не очистим, то мы не 1234h какое-нить на 10 делить будем, а 12341234h. Первое 1234 нам надо? Вот и я говорю — очищаем!
Бряк 5 — делим! Частное — в AX, остаток — в DX.
Бряк 6 — заносим остаток (DX) в стек ;).
Бряк 7 — CX=CX+1. Это мы считаем сколько раз «щемили остаток», который «щемится», по кругу (прыжок на метку non_zero), пока AX не равно 0 (бряк 8). То есть делим, делим AX, пока он не окажется, что делить, собственно, нечего.
Так-с. Деление закончено, число раз, которое мы поделили AX до его полного обнуления, хранится в CX.
Дальше все просто. Нам нужно такое же количество раз (CX) извлечь значение (DX) из стека. И это будет «HEX», переведенный в DEC. (Оно же: число в двоично коде, разобранное на последовательность десятичных цифр).
Помните, как у нас организуется цикл? Через loop и CX?
Если бы в качестве счетчика мы использовали какой-нибудь другой регистр, то пришлось бы извращаться со всякими метками и прыжками. а так все просто, все продуманно :). Цикл, в теле которого ИЗВЛЕЧЬ ЦИФЕРКУ (бряк 9) и НАПЕЧАТАТЬ ЦИФЕРКУ (бряк 10). Столько же раз, сколько мы и делили наше исходное шестнадцатеричное число.

Для тех, кто не понял: бряк — это брекпоинт. Для тех, кто еще не знает, что такое брекпоинт — ищите объяснение в ‘DZebug. Руководство юZверя’

Двое из десяти «подопытных» чайников (есть такие) возмутились:
В DX же только четыре циферки влазят!
Ага! Аж два раза четыре!

Как видите, туда еще и две буковки «влазят» ;)
А то и все четыре, если кавычки считать.

2.5. Hello, world! или Изврат-2

#1. Мы уже писали программу «Hello, World!» с использованием 13-й функции 10 прерывания. Посмотрите на ее исходник.
Сегодня мы слабаем еще одно «Hello, World!», но уже несолько другим способом. Какой из этих способов более дZенский — решайте сами ;).
Для начала мы создадим блок данных после всех-всех-всех процедур но между директивами начала и конца сегмента.
Блок данных будет выглядеть следующим образом:

Вы должны спросить «А почему мы хотим напечатать Hello, World-2, а в конце строки у нас 2$? $ — это что? World за баксы продавать, штоль?? Да ну вас.
Эту строчку мы будем выводить на монитор особым дZенским способом — посимвольно. То есть: возьмем первый символ из блока данных, выведем, потом второй и т. д. аналогично пока не встретим символ ‘$’.

Опять-таки, это если в двух словах. Но ведь наверняка вам этого покажется мало ;).

«Щемить» символы мы будем двумя способами. (Тут я хотел было написать «неправильным» и «правильным», но потом передумал и решил обозвать их «первым» и «вторым»).
В алгоритм первого способа вы и сами без труда въедете (я только «рабочую часть» приведу, пуши с попами сами проставляйте):

#2. А вот второй способ немножко навороченнее :). Чтобы в нем разобраться, мы сначала познакомимся со следующей группой команд: LODSB, LODSW, LODSD
Их назначение — это загрузка элемента из последовательности (строки, цепочки) в регистр-аккумулятор al/ax/eax.
Для тех, кто не понял — наша строчка «Hello, World-2$» как раз и является «последовательностью/строкой/цепочкой» из элементов размером в байт.
Адрес цепочки передается через ds:esi/si, сами «элементы» (фиксированной ширины) возвращаются в al (байт, команда LODSB), ax (слово, команда LODSW) или eax (двойное слово, команда LODSD). В общем, последние буковки команд как раз и указывают на размерность элемента: [B]yte, [W]ord, [D]ouble word. Т. е. размер мы определяем неявно.
После выполнения одной из этих команд значение регистра si изменяется на величину, равную длине элемента, но. хм.

Пришло время еще одну большую тайну познать, братья. В справочнике Юрова написано, «знак этой величины зависит от состояния флага df:
df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.»
Обидно, да? Флаги-то мы с вами еще не расколупали. Чего-ж дальше-то делать, а?

Как что? «Пропивать» стандартную процедуру и колупать ее, колупать, колупать, ногами ее, ногами, и по морде, по морде, по морде.

Итак, что делает команда lodsb, вы уже поняли. А вот с df=0/df=1 пока что непонятки.
Будем разбираться.

Нам нужно, чтобы «просмотр цепочки» осуществлялся командой lodsb слева направа, для этого нужно установить значение df=0. Делаем мы это при помощи команды cld (бряк 2).
Если нам нужно, чтобы «просмотр цепочки» осуществлялся справа налево, мы используем команду std. (Можете попробовать. Ерунда получится.)

А теперь вспомним «золотое правило». Все регистры, которые мы изменяли ВНУТРИ процедуры, «на выходе» должны восстанавливать свои ПРЕДЫДУЩИЕ значения (кроме тех регистров, через которые мы возвращаем РЕЗУЛЬТАТ).
Так вот: то же самое касается и флагов, которые мы изменяем.
Для регистров мы использовали команды PUSH и POP. Для регистра флагов (изменять у которого мы можем только БИТЫ) используются команды pushf (записать в стек значения флагов, бряк 1) и popf (извлечь из стека, бряк 10).

ПРИМЕЧАНИЕ: Это несколько вольное положение (хотя, вобщем-то, верное). Видимо, здесь следует хотя бы добавить, что сохранять/восстанавливать флаги нужно при изменении специальных флагов (if, df). (С) Хемуль

Теперь колупаем дальше. (С) Serrgio

Бряк 3. Мне удобнее передавать данные «в процедуру» через регистр DX, о чем и написано в заголовке. А lodsb (бряк 4) хотит, чтоб адрес ему в SI подавали. Удовлетворим его желание :)
Бряк 4. После выполнения этой команды ASCII-код первого символа «цепочки» «Hello, World-2$» помещается в AL, а значение регистра SI увеличивается на 1 и указывает теперь на второй элемент цепочки (символ ‘e’).
Бряк 7. Удовлетворяем «пожелания» процедуры write_char. Из AL переносим в DL и печатаем (бряк 9), write_char’ом.

Тэкс. Мы пропустили бряки 5 и 6-й.
Смотрите: на бряке 9 мы «безусловно» зацикливаем «извлечение» и печать элементов цепочки. Безусловно — это значит до потери пульса. Чтоб этого не произошло, каждый из элементов цепочки мы сравниваем с символом-конца-цепочки (в нашем случае это ‘$’, но можно использовать и любой другой). Если текущий символ равен символу-конца-цепочки, то выпрыгиваем (бряк 6) из этого безусловного цикла, восстанавливаем статус-кво (бряк 10) и все на этом.

Напечаталось то, что надо?
Если true — читайте дальше.
Если false — расколупывайте и медитируйте до полного просветления.

Илон Маск рекомендует:  Что такое код swab
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Номер функции Название Входные данные Выходные данные Описание
Функции ввода/вывода данных
01H Ввод с клавиатуры AH = 01H AL = символ, полученный из стандартного ввода Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При распознавании Ctrl-Break выполняется INT 23H. Замечание: Ввод расширенных клавиш ASCII (F1-F12, pgup, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
02H Вывод на дисплей AH = 02H DL = символ, выводимый на стандартный вывод Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23H.
03H Вспомогательный ввод AH = 03H AL = символ, полученный со стандартного вспомогательного устр-ва Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL. Замечание: Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.
04H Вспомогательный вывод AH = 04H DL = символ, записываемый на стандартное вспомогательное устр-во Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05H Вывод на принтер AH = 05H DL = символ, записываемый на стандартный принтер Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Замечание: Команда DOS «MODE» может перенаправить этот вывод в последовательный порт.
06H Консольн. ввод-вывод AH = 06H DL = символ (от 0 до 0feh), посылаемый на стандартный вывод DL = 0ffh запрос ввода со стандартного ввода ZF = Сброшен (NZ), если символ готов при запросе ввода При DL = 0ffh выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод. Замечание: Не проверяет Ctrl-Break. Вызывайте дважды для расширенного ASCII.
07H Нефильтрующий консольный ввод без эха AH = 07H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break, backspace и т.п. Замечания Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).
08H Консольный ввод без эха AH = 08H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23H. Замечание: Вызывайте дважды для ввода расширенного символа ASCII.
09H Выдать строку на дисплей AH = 09H DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H) Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02H Display Char. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 0dh и ASCII 0ah). Строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).
0ah Ввод строки в буфер AH = 0ah DS:DX = адрес входного буфера (смотри ниже) Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh) При входе буфер по адресу DS:DX должен быть оформлен так:
Max * * * *

Где max – максимальная допустимая длина ввода (от 1 до 254)

При выходе буфер заполнен следующим образом:

Max Len T E X T 0dh

Где len– действительная длина данных без завершающего CR (здесь — 04H). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (который не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

0bh Проверить статус ввода AH = 0bh AL = 0ffh, если символ доступен со стандартного ввода Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23H. Замечание: используйте перед функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши. Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет вам снимать счет по нажатию Ctrl-Break.
0ch Ввод с очисткой AH = 0ch AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0ah) Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H ввод с клавиатуры 06H ввод с консоли 07H Нефильтрующий без эха 08H ввод без эха 0ah буферизованный ввод
Операции с файлами
3ch Создать файл через описатель (дескриптор) AH = 3ch DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибки нет DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) оглавлении Файл открывается в режиме доступа чтение/запись Вы должны сохранить описатель (дескриптор, handle) для последующих операций. Если файл уже существует: При открытии файл усекается до нулевой длины Если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут) CONFIG.SYS специфицирует число доступных описателей в системе Используйте функцию 5bh создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
3dh Открыть описатель файла AH = 3dh DS:DX = адрес строки ASCIIZ с именем файла AL = режим открытия AX = код ошибки если CF установлен и описатель файла если нет ошибки. DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл должен существовать. См. Функцию 3ch (создать файл). Файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте: AL = 0 чтобы открыть для чтения AL = 1 чтобы открыть для записи AL = 2 чтобы открыть для чтения и записи Указатель чтения/записи устанавливается в 0. См. 42H (LSEEK) Вы должны сохранить описатель (handle) для последующих операций Разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения. CONFIG.SYS специфицирует число доступных описателей файлов.
3eh Закрыть описатель файла AH = 3eh BX = описатель файла AX = код ошибки если CF установлен BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой. Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3fh Читать файл через описатель AH = 3fh BX = описатель файла DS:DX = адрес буфера для чтения данных CX = число считываемых байт AX = код ошибки если CF установлен или число действительно прочитанных байт CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): Если AX = CX, (и CF сброшен) — чтение было корректным без ошибок Если AX = 0, достигнут конец файла (EOF) Если AX При чтении с устройства — входная строка имеет длину AX байт При чтении из файла — в процессе чтения достигнут EOF Замечания: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dh).
40H Писать в файл через описатель AH = 40H BX = описатель файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок) CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи). Если AX = CX, запись была успешной Если AX Замечание: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю осуществлять собственное блокирование. Удобно использовать эту функцию для вывода на умалчиваемые устройства, такие как стандартный вывод, взамен использования различных функций вывода текста.
42H Установить указатель файла – LSEEK AH = 42H BX = описатель файла CX:DX = на сколько передвинуть указатель: (CX 65536) + DX AL = 0 переместить к началу файла + CX:DX AL = 1 переместить к текущей позиции + CX:DX AL = 2 переместить к концу файла + CX:DX AX = код ошибки если CF установлен DX:AX = новая позиция указателя файла (если нет ошибки) Перемещает логический указатель чтения/записи к нужному адресу. Очередная операция чтения или записи начнется с этого адреса. Замечание: Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX 65536) + AX.
Операции с файловой системой
0dh Сброс диска AH = 0dh Сбрасывает (пишет на диск) все файловые буфера. Если размер файла изменился, такой файл должен быть предварительно закрыт (при помощи функций 10H или 3eh).
0eh Установить текущий диск DOS AH = 0eh DL = номер диска (0=A, 1=B и т.д.), который становится текущим AL = общее число дисководов в системе Диск, указанный в DL, становится текущим (умалчиваемым) в DOS. Проверка: используйте функцию 19H «дать текущий» для проверки. В регистре AL возвращается число дисководов всех типов, включая твердые диски и «логические» диски (как B: в 1-floppy системе).
19H Дать текущий диск DOS AH = 19H AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.) Возвращает номер дисковода текущего умалчиваемого диска DOS.
1bh Дать информацию FAT (текущий диск) AH = 1bh DS:BX = адрес байта FAT > Возвращает информацию о размере и типе умалчиваемого диска. Размер диска в байтах = (DX*AL*CX). Ищите свободную память функциями 36h Disk Free или 32h Disk Info. Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь порцию всей FAT. Предупреждение: Эта функция изменяет содержимое регистра DS.
1ch Дать информацию FAT (любой диск) AH = 1ch DL = номер диска (0=текущий, 1=A, и т.д.) DS:BX = адрес байта FAT > Аналогична функции 1bh Get FAT Cur, с той разницей, что регистр DL указывает диск, для которого вы хотите получить информацию. Версии: Недоступна для DOS 1.x.
32H Дать информацию DOS о диске AH = 32H DL = номер диска (0=текущий, 1=A, и т.д.) AL = 0 если DL задавал корректный диск FF = 0ffh если диск задан неверно DS:BX = адрес блока информации диска для запрошенного устройства Возвращает блок информации, представляющей интерес для приложений и утилит, выполняющих доступ к диску, поддерживаемый драйверами устройств, на уровне секторов. Некоторые дисководы (особенно незагружаемые) функционируют исключительно через свои драйверы устройств. Такие диски могут содержать неверную информацию в корневой записи и таблице разделов, что делает очень трудным определение, например, размера корневого оглавления, числа таблиц FAT, и т.п. Блок информации диска содержит все данные такого рода в хорошо форматированной структуре. Это может быть единственным способом определить адрес драйвера устройства. Предупреждение: Изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.
36H Дать свободную память диска AH = 36H DL = номер диска (0=текущий, 1=A, и т.д.) AX = 0ffffh, если AL содержал неверный номер диска или число секторов на кластер, если нет ошибок. BX = доступных кластеров. CX = байт на сектор. DX = всего кластеров на диске. Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX*BX*CX) всего памяти в байтах = (AX*CX*DX)
39H Создать новое оглавление — MKDIR AH = 39H DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0 если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.
3ah Удалить оглавление – RMDIR AH = 3ah DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление удаляется из структуры оглавления. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется. Замечание: Оглавление не должно содержать файлов и подоглавлений и не должно быть связано возможными ограничениями DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).
3bh Установить умалчиваемое оглавление DOS – CHDIR AH = 3bh DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Указанное подоглавление для указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.
41H Удалить файл AH = 41H DS:DX = адрес строки ASCIIZ с именем файла AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы (‘?’ и ‘*’). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.
43H Установить/опросить атрибут файла – CHMOD AH = 43H DS:DX = адрес строки ASCIIZ с именем файла AL — код подфункции: = 0 — извлечь текущий атрибут файла AL = 1 — установить атрибут файла CX = новый атрибут файла (для подфункции 01H) AX = код ошибки если CF установлен CX = текущий атрибут файла (для подфункции 00H) DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Атрибут файла извлекается или устанавливается, согласно коду в AL. Замечание: Чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы, возможно, ожидали, см. описание файловой системы FAT, аттрибуты файлов).
45H Дублировать описатель файла – DUP AH = 45H BX = существующий описатель файла AX = новый описатель файла, дублирующий оригинал или код ошибки если CF установлен. Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя чтения/записи для одного описателя действует на его дубликат — включая любые операции чтения, записи или перемещения указателя посредством функции 42H LSEEK. Новый описатель наследует ограничения режима открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть описатель, заставляя DOS записать файловые буфера. Такой способ DUP/CLOSE — быстрее, чем закрытие и повторное открытие файла. Оставить комментарий – для сохранения файла без его закрытия – CTRL+S
46H Переназначить описатель – FORCDUP AH = 46H BX = целевой описатель файла (должен уже существовать) CX = исходный описатель файла (должен уже существовать) AX = код ошибки если CF установлен Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Описатель в CX (источник) закрывается, если он открыт, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного в/в. Пример: Откроем файл «C:\STDOUT.TXT» через функцию 3dh Open File и получим описатель (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 — это предопределенный описатель «стандартного выходного устройства»). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через описатель 01. Стало быть, дисковый файл «C:\STDOUT.TXT» будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01 через функцию DOS 40H. Когда вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на обычные устройства (например, описатель 01 устанавливается на «CON»).
47H Дать умалчиваемое оглавление DOS AH = 47H DS:SI = адрес локального буфера для результирующего пути (64 байта) DL = номер диска (0=текущий, 1=A, и т.д.) AX = код ошибка если CF установлен В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Не подставляется впереди буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет вам пустую строку (DS:[SI] = 0).
4eh Найти 1-й совпадающий файл AH = 4fh DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? И *) CX = атрибут файла для сравнения AX = код ошибки если CF установлен DTA = заполнена данными (если не было ошибки) DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы и ? Допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже: Замечания: Атрибут файла обычно используется во «включающем» поиске. Если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (т.е. Attr | 10H). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: Используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H) Уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя Вызовите функцию 4eh (Найти 1-й) Если флаг CF указывает ошибку, вы закончили (нет совпадений) Уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh) Повторять Обработать имя файла и данные по адресу DS:DX Вызвать функцию 4fh (Найти следующий) Пока CF=1 не покажет, что совпадений больше нет
4fh Найти следующий совпадающий файл AH = 4fh DS:DX = адрес данных, возвращенных предыдущей 4eh Найти 1-й файл AX = код ошибки если CF установлен DTA = заполнена данными DS:DX указывает на 2bh-байтовый буфер с информацией, возвращенной функцией 4eh Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. Функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
56H Переименовать/переместить файл AH = 56H DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла) ES:DI = адрес нового ASCIIZ имени (новые путь/имя) AX = код ошибки если CF установлен DS:DX и ES:DI указывают на строки ASCIIZ: «d:\путь\имяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие умолчания. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени. Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.
57H Установить/опросить дату/время файла AH = 57H AL = 0 чтобы получить дату/время файла = 1 чтобы установить дату/время файла BX = описатель файла (handle) CX = (если AL=1) новая отметка времени в формате время/дата файла DX = (если AL=1) новая отметка даты в формате время/дата файла AX = код ошибки если CF установлен CX = отметка времени файла в формате время/дата файла DX = отметка даты файла в формате время/дата файла BX должен содержать описатель открытого файла (см. 3ch или 3dh ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
5ah Создать уникальный временный файл AH = 5ah DOS 3.0+ DS:DX = адрес строки ASCIIZ с диском и путем (заканчивается \) CX = атрибут файла AX = код ошибки если CF установлен и описатель файла (если нет ошибки) DS:DX = (не изменяется) становится полным ASCIIZ-именем нового файла Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к присоединению в его конец имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «d:\путь\»,0 (указаны диск и путь) ИЛИ «d:»,0 (умалчиваемое оглавление диска) ИЛИ «d:\»,0 (корневое оглавление диска) ИЛИ «»,0 (умалчиваемые диск и оглавление) После возврата строка DS:DX будет дополнена именем файла. Замечания: DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Создаваемые таким способом файлы — по существу НЕ ВРЕМЕННЫЕ, и их следует удалять посредством функции DOS 41H , когда они не нужны. Версии: Доступна, начиная с DOS 3.0
5bh Создать новый файл AH = 5bh DOS 3.0+ DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибок нет DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом режиме доступа
5ch Блокировать/разблокировать доступ к файлу AH = 5ch DOS 3.0+ AL = подфункция: 0 = заблокировать область файла = 1 = разблокировать ранее захваченную область BX = описатель файла (handle) CX:DX = смещение ((CX 65536) + DX) от начала файла SI:DI = длина блокируемой области ((SI 65536) + DI) байт AX = код ошибки если CF установлен Блокирует или освобождает доступ к участку файла, идентифицируемого описателем в BX. Область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательны. Разделение файлов ДОЛЖНО быть активизировано (командой SHARE), иначе функция вернет код ошибки «неверный номер функции.» Блокировка действует на операции чтения, записи и открытия со стороны порожденного или конкурирующего процесса. При попытке такого доступа (и режиме доступа , определенном при OPEN как «режим разделения», который запрещает такой доступ), DOS отвергает операцию через вызов INT 24H (обработчик критических ошибок) после трех попыток. DOS при этом выдает сообщение «Abort, Retry, Ignore». Рекомендуемое действие — НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. Это позволяет избежать довольно неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0, DX=0, SI=0ffffh, DI=0ffffh и AL=0. При освобождении, смещение и длина участка должны точно совпадать со смещением и длиной захваченного участка. Замечания: Дублирование описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN выбран режим доступа Inherit, механизм блокировки не даст никаких привилегий доступа порожденным процессам, созданным функцией 4bh EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были сняты до завершения программы. Если вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы снять блокировки до действительного завершения программы. Рекомендуется освобождать блокировки как можно скорее. Всегда блокируйте, обрабатывайте файл и освобождайте блокировку одной операцией. Версии: Доступна, начиная с DOS 3.0
Операции с системой прерываний
25H Установить вектор прерывания AH = 25H AL = номер прерывания DS:DX = вектор прерывания: адрес программы обработки прерывания Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы. Предупреждение: Не забудьте восстановить DS (если необходимо) после этого вызова.
26H Построить PSP AH = 26H DX = адрес сегмента (параграфа) для нового PSP CS = сегмент PSP, используемого как шаблон для нового PSP Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100H байт, начиная с CS:0), копируется в DX:0 Поле memtop соответственно корректируется Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете загрузить программу с диска и передать ей управление посредством FAR JMP. Замечание: Если вы перехватываете INT 21H, позаботьтесь о помещении в стек корректного CS:IP. Еще лучше использовать функцию 4ch (EXEC).
2ah Дать системную дату AH = 2ah AL = день недели (0=Вск, 1=Пнд. 6=Суб) DOS 3.0+ CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) Возвращает текущую дату, как она известна системе. Версии: DOS 2.x не гарантирует возврата в AL значения дня; все версии 1.0+ возвращают правильный день недели. Версии до 2.1 имеют проблемы с переходом даты.
2bh Установить системную дату AH = 2bh CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) AL = 0 если дата корректна Устанавливает системную дату DOS.
2ch Дать время DOS AH = 2ch CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) Возвращает текущее время, как оно известно системе. Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2dh Установить время DOS AH = 2dh CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) AL = 0 если время корректно Устанавливает системное время DOS.
2eh Установить/сбросить переключатель верификации AH = 2eh AL = 0 отключить верификацию = 1 включить верификацию Устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но гарантирует максимальную надежность записи. Функция 56H Get Verify возвращает текущий статус верификации DOS.
2fh Дать адрес текущей DTA AH = 2fh ES:BX = адрес начала текущей DTA Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Уст. DTA». Замечание: Эта функция изменяет сегментный регистр ES.
30H Дать номер версии DOS AH = 30H AL = старший номер версии AH = младший номер версии BX,CX = 0000H DOS 3.0+ Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в AH — 2. Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0. Версии: DOS 2.x не гарантирует очистки регистров CX и BX.
31H Завершиться и остаться резидентным – KEEP AH = 31H AL = код выхода DX = объем памяти, оставляемой резидентной, в параграфах Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.
33H Установить/опросить статус Ctrl-Break AH = 33H AL = 0 чтобы опросить текущий статус контроля Ctrl-Break AL = 1 чтобы установить статус контроля Ctrl-Break DL = требуемый статус (0=OFF, 1=ON) (только при AL=1) DL = текущий статус (0=OFF, 1=ON) Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). При обнаружении, выполняется INT 23H (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.
35H Дать вектор прерывания AH = 35H AL = номер прерывания (00H до 0ffh) ES:BX = адрес обработчика прерывания Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2]. Предупреждение: Эта функция изменяет сегментный регистр ES.
44H Управление устройством в/в – IOCTL AH = 43H AL = код подфункции: AL = 0ch — (зарезервировано) Прочие = (в зависимости от подфункции) AX = код ошибки если CF установлен или иное значение (в зависимости от подфункции) IOCTL предоставляет метод взаимодействия с устройствами и получения информации о файлах. Входные параметры и выходные значения варьируются в зависимости от кода подфункции в регистре AL. Версии: Подфункции 0-7 . DOS 2.1+ Подфункции 8,0bh . DOS 3.0+ Подфункции 9,0ah . DOS 3.1+ Подфункции 0dh,0eh,0fh . DOS 3.2+ ———————————— Подфункция 00H: Запросить флаги информации об устройстве Вход: BX= описатель файла (устройство или дисковый файл) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 01H: установить флаги информации об устройстве Вход: BX = описатель файла (устройство или дисковый файл) DX = IOCTL Инф об устр (DH должен быть нулевым) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 02-03: читать (AL=02H) или писать (AL=03H) строку IOCTL на СИМВОЛЬНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX= число передаваемых байт BX= описатель файла (только устройство — не файл!) Выход: AX= код ошибки если CF установлен ———————————— Подфункция 04-05: читать (AL=04H) или писать (AL=05H) строку IOCTL на БЛОЧНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX = число передаваемых байт BL = : Вход: CL = код действия 40H = установить параметры устройства 60H = дать параметры устройства 41H = писать дорожку логического устройства 61H = читать дорожку логического устройства 42H = форматировать дорожку с верификацией 62H = Верифицировать дорожку логического устройства DS:DX=> адрес пакета данных IOCTL Выход: AX= код ошибки если CF установлен DS:DX=> пакет данных может содержать информацию возврата. ———————————— Подфункция 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству. [DOS 3.2+] Вход: BL= . Эта функция позволяет вам сообщать DOS, что диск с указанным >
48H Распределить память (дать размер памяти) AH = 48H BX = запрошенное количество памяти в 16-байтовых параграфах AX = код ошибки если CF установлен BX = размер доступной памяти в параграфах (если памяти не хватает) AX = сегментный адрес распределенного блока (если нет ошибок) Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный кусок, общепринято устанавливать BX=0ffffh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX. Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
49H Освободить распределенный блок памяти AH = 49H ES = сегментный адрес (параграф) освобождаемого блока памяти AX = код ошибки если CF установлен Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
4ah Сжать или расширить блок памяти AH = 4ah ES = сегмент распределенного блока памяти BX = желаемый размер блока в 16-байтовых параграфах AX = код ошибки если CF установлен BX = наибольший доступный блок (если расширение неудачно) Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать. Замечание: Функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
4bh Выполнить или загрузить программу – EXEC AH = 4bh DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC) AL = 0 = загрузить и выполнить AL = 3 = загрузить программный оверлей AX = код ошибки если CF установлен Предоставляет средства одной программе (родителю) вызвать другую программу (ребенка), которая по завершению возвратит управление родителю. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL. AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность: 1. Вызовите функцию 4ah с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах). 2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки. 3. Подготовьте блок параметров EXEC со всеми необходимыми полями. 4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка). 5. Выдайте вызов EXEC с AL=0. 6. Восстановите локальные значения SS и SP. 7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC. 8. Восстановите DS, ES и локальную DTA, если необходимо. 9. Проверьте код выхода через функцию 4dh WAIT (если надо). Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. Режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. Функцию 5ch. После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения. AL=3 LOAD: Эта подфункция используется для загрузки «оверлея». DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE. Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную строку COMSPEC= в окружении перед вызовом этой функции. Вместо разбора собственных FCB (как требуется для EPB), вы можете найти удобным загрузить и выполнить вторичную копию файла COMMAND.COM, используя опцию /C. Например, чтобы выполнить программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ: «\command.com»,0 и установите EPB+2 на сегмент и смещение следующей строки команд: 0eh,»/c format a:/s/4″,0dh такой вторичный интерпретатор команд использует очень мало памяти (около 4K). Вы можете поискать в окружении DOS строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
4ch Завершить программу – EXIT AH = 4ch AL = код выхода Возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP. Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.
4dh Дать код выхода программы – WAIT AH = 4dh AL = код выхода последнего завершившегося процесса AH = 0 — нормальное завершение AH = 1 — завершение через Ctrl-Break AH = 2 — завершение по критической ошибке устройства AH = 3 — завершение через функцию 31H KEEP Возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
54H Дать переключатель верификации DOS AH = 54H AL = 0 если верификация выключена (OFF) AL = 1 если верификация включена (ON) Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
59H Дать расширенную информацию об ошибке AH = 59H DOS 3.0+ BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2) AX = расширенный код ошибки (0, если не было ошибки) BH = класс ошибки BL = предлагаемое действие CH = сфера (где произошла ошибка) Используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). Вызывайте ее: В обработчике критических ошибок INT 24H После любой функции INT 21H , возвратившей Carry-флаг После вызова FCB-функции, возвратившей AL=0ffh Версии: Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.
5eh Разные сетевые функции AH = 5eh DOS 3.1+ AL = подф.: 0=дать имя машины (узла) в сети AL = 2=установить стартовую строку сетевого принтера AL = 3=извлечь стартовую строку сетевого принтера Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Прочие = (зависят от подфункции) Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 00H: Извлекает имя машины (узла), как оно известно в сети. Вход: DS:DX=> буфер пользователя для ASCIIZ сетевого имени Выход: DS:DX=> буфер, содержащий сетевое имя CH= 0=имя не определено; иначе=имя определено CL= номер имени NETBIOS (если CH ненулевой) AX= код ошибки если CF установлен Замечание: Сетевое имя — 15-симв. (дополненная пробелами) строка ASCIIZ ———————————— Подф. 02H: Задает настроечную строку, посылаемую на принтер каждый раз, когда эта машина выдает результаты на сетевой принтер. Вход: DS:SI=> буфер, содержащий настроечную строку (до 64 байт) CX= длина настроечной строки BX= индекс в списке назначений, отвечающий принтеру Выход: AX= код ошибки если CF установлен ———————————— Подф. 03H: Извлекает настроечную строку принтера, заданную ранее посредством DOS Fn 5eh подф. 02H. Вход: DS:DI=> 64-байтовый буфер пользователя для результата bx= индекс принтера в списке назначений Выход: ES:DI=> буфер, заполненный настроечной строкой CX= длина настроечной строки AX= код ошибки если CF установлен Замечание: Поскольку индекс в списке назначений может измениться в любой момент, используйте функцию 5fh подф. 02H, чтобы получить индекс непосредственно перед вызовом этой функции.
5fh Переназначение устройств в сети AH = 5fh DOS 3.1+ AL = подф.: 2=получить элемент списка переназначений устройств = 3=переназначить сетевое устройство = 4=отменить переназначение сетевого устройства Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 02H: Извлекает элемент из списка переназначений сетевых устройств. Вход: DS:DI=> 128-байтовое ASCIIZ локальное имя устр. («LPT1»,0) ES:DI=> 128-байтовый буфер с ASCIIZ сетевым именем BX= индекс в списке назначений Выход: DS:DI=> ASCIIZ локальное имя устройства (напр., «LPT1»,0) ES:DI=> ASCIIZ сетевое имя BL= тип устр: 3=принтер; 04=файл ‘устройство’ BH= статус устр: бит 0=1 -неверное устр.; 0=верное CX= сохраненный параметр (при NETBIOS, всегда 0) AX= код ошибки если CF установлен DX,BP = (изменены) Замечание: обычно эту функцию вызывают с BX=0, затем повторяют вызовы, увеличивая значение BX, пока DOS не вернет ошибку 12H (больше нет файлов). ———————————— Подф. 03H: этот вызов определяет имена оглавлений для сети и перенаправляет доступ на сетевые принтеры. Замеч: доступ к принтеру переназначается на уровне ROM-BIOS INT 17H. Вход: DS:SI = ASCIIZ имя исходного устройства ES:DI = ASCIIZ назначение (сетевой путь с паролем) BL= тип устр: 03=принтер; 04=файл ‘устройство’ CX= параметр для вызывающего (задавайте 0 для NETBIOS) Выход: AX= код ошибки если CF установлен Замеч: если BL=03, то источник задает ASCIIZ-имя принтера (например, «LPT1»,0). Назначение кодируется в форме: [\\computername\],0,[password],0. Если пароль начинается с 00, считается, что пароля нет. Если BL=04, то источник задает ASCIIZ-имя диска (например, «F:»,0), а назначение — ASCIIZ-имя пути. После вызова этой функции, локальные обращения к этому диску переназначаются на выбранные имя компьютера и путь. ———————————— Подф. 04H: Отменить сетевое переназначение для указанного устройства. Вход: DS:SI=> ASCIIZ-имя устройства или ,0), то переназначение этого диска прекращается, и ID диска восстанавливает свое предыдущее значение.