46975 (588456), страница 2

Файл №588456 46975 (Вивід вмісту каталогу y середовищі MS DOS) 2 страница46975 (588456) страница 22016-07-29СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Наприклад:

c > DR c:\windows\*.sys

Тобто даний ввід має викликати програму DR.exe, яка виведе усі файли із розширенням .sys, які знаходяться за адресою c:\windows. Мова асемблера не дає нам вбудованих механізмів реалізації даної можливості, тому виникає необхідність розробки власного програмного модуля для роботи із командним рядком.

При завантаженні exe-файлу command.com створює в пам'яті PSP блок (256 байт), у якому, серед іншої інформації, містить текст, який йде після імені програми (хвіст команди). Перед початком виконання програми адреса PSP міститься в регістровій парі ds:es. Хвіст команди починається зі зміщення 80h (до FFh) і займає 128 байт, при чому перший символ знаходиться за зміщенням 81h, а в 80h міститься кількість символів хвоста команди [4, 6].

Ідея модуля PARAMS.asm в тому, що створюється власний 128-ми байтовий буфер, в який (за допомогою функції GetParams) копіюється хвіст команди, а потім виконується обробка отриманих даних за допомогою функції GetOneParam (отримання адреси параметра за номером) і ParamCount (отримання кількості параметрів).

Параметри в хвості команди розділені пробілами, останній символ – символ повернення каретки.

На основі сказаного було розроблено наступний програмний модуль:

IDEAL

MODEL small

TailLen EQU 0080h ; зміщення байта із довжиною рядка

; параметрів

CommandTail EQU 0081h ; зміщення першого символу рядка

; параметрів

DATASEG

numParams DW ? ; кількість параметрів

params DB 128 DUP (?) ; буфер на 128 байт для хвоста команди

CODESEG

PUBLIC ParamCount, GetParams, GetOneParam

; -------------------------------------------------------------------------------------------

; Separators внутрішня процедура для перевірки на пробіли, табуляцію,

; повернення каретки

; ------------------------------------------------------------------------------------------

; Вхід ds:si адреса символу, що перевіряється

; Вихід ZF=1 символ є пробілом, табуляцією чи поверненням каретки

ZF=1 символ не є роздільником

; Регістри не змінюються

; -------------------------------------------------------------------------------------------

PROC Separators

push ax ; збереження у стеку ax

mov al, [si] ; в al поміщується символ із ds:si

cmp al, 020h ; порівняння al із пробілом

je @@10 ; якщо так, то перехід

cmp al, 009h ; порівняння al із табуляцією

je @@10 ; якщо так, то перехід

cmp al, 00Dh ; порівняння al із символом повернення

; каретки

@@10:

pop ax ; відновлення ax

ret ; повернення до викликаючої програми

ENDP Separators

; -------------------------------------------------------------------------------------------

; ParamCount повертає кількість параметрів у хвості команди

; -------------------------------------------------------------------------------------------

; Вхід не має

; Вихід CX кількість параметрів командного рядка

; Регістри CX

; -------------------------------------------------------------------------------------------

PROC ParamCount

mov cx, [numParams] ; отримати значення змінної numParams

ret ; повернення до викликаючої програми

ENDP ParamCount

; -------------------------------------------------------------------------------------------

; GetParams занесення параметрів командного рядка DOS у буфер

; -------------------------------------------------------------------------------------------

; Вхід ds префікс сегмента програми (PSP) (адресує PSP, якщо його

; не змінювали)

; es сегмент даних програми

; Вихід [params] початок буфера заповненого даними

; [numParams] кількість параметрів

; ds сегмент даних програми

; Регістри al, bx, dx, si, di, ds

; -------------------------------------------------------------------------------------------

PROC GetParams

;------Ініціалізація cx і індексних регістрів si і di

push ax ; збереження регістрів

push bx

push dx

push si

push di

xor ch, ch ; обнуління верхньої половини cx

mov cl, [ds:TailLen] ; в cx довжина параметрів

inc cx ; включити символ повернення каретки

mov si, CommandTail ; адреса параметрів поміщується в si

mov di, offset params ; адреса призначення поміщується в di

; ------Пропуск початкових пробілів і табуляції

@@10:

call Separators ; пропуск пробілів і табуляції

jne @@20 ; перехід, якщо пробілів і табуляції не має

inc si ; пропуск символу

loop @@10 ; цикл, доки не скінчиться обробка, або cx=0

; ------Копіювання параметрів рядка в буфер params

@@20:

push cx ; збереження cx у стеку

jcxz @@30 ; пропуск копіювання, якщо cx=0

cld ; збільшення на 1 si і di

rep movsb ; копіювання cx байтів із ds:si в es:di

; ------Перетворення пробілів в 0 і встановлення numParams

@@30:

push es

pop ds ; ds = es

pop cx ; відновлення cx (довжину)

xor bx, bx ; обнуління bx, лічильник параметрів

jcxz @@60 ; пропуск циклу якщо cx=0 (довжина)

mov si, offset params ; поміщення адреси параметрів в si

@@40:

call Separators ; перевірка на пробіли, табуляцію,

; повернення каретки

jne @@50 ; перехід, якщо не знайдено роздільник

mov [byte ptr si], 0 ; заміна роздільника на 0

inc bx ; збільшення лічильника кількості

; параметрів

@@50:

inc si ; переміщення указника на наступний

; символ

loop @@40 ; виконувати в циклі, доки cx ≠ 0

@@60:

mov [numParams], bx ; збереження в numParams кількість

; параметрів

pop ax ; відновлення регістрів

pop bx

pop dx

pop si

pop di

ret ; повернення до батьківської програми

ENDP GetParams

; -------------------------------------------------------------------------------------------

; GetOneParam отримати адресу параметра за номером

; -------------------------------------------------------------------------------------------

; Вхід cx номер параметра (має бути менше значення в numParams)

; Вихід di зміщення ASCII рядка із потрібним параметром

; Регістри di

; -------------------------------------------------------------------------------------------

PROC GetOneParam

push ax ; збереження регістрів ax і cx

push cx

xor al, al ; обнуління al (ініціалізація шуканого

; значення 0)

mov di, offset params ; адреса параметрів рядка

jcxz @@99 ; якщо номер параметра (cx) дорівнює 0,

; то вихід

cmp cx, [numParams] ; порівняння cx із кількістю параметрів

jae @@99 ; вихід, якщо передано неіснуючого

; параметру

cld ; автоматичне збільшення di

@@10:

scasb ; пошук нульового обмежувача

jnz @@10 ; повтор, доки не знайдено 0

loop @@10 ; повтор, доки в cx не буде 0

@@99:

pop cx ; відновлення регістрів cx, ax

pop ax

ret ; повернення до викликаючої програми

ENDP GetOneParam

END

Таким чином, програмний модуль PARAMS.asm є зручним інструментом для реалізації роботи із командним рядком і буде використаний в основній програмі.

3.1.2. Модуль STRIO.asm

Оскільки важливою частиною основної програми, згідно із завданням, буде вивід текстових рядків на екран, то є необхідність у створенні спеціального програмного модуля, який би містив процедури для обробки і виводу ASCII рядків на екран. Пряме використання функцій DOS в основній програмі є незручним, оскільки є потреба у спрощенні коду для його сприйняття.

З цих міркувань було розроблено програмний модуль STRIO.asm, в якому міститься п’ять спеціальних функцій: StrLength (визначає кількість символів, записаних в ASCII рядку), дві функції виводу ASCII-рядків на екран – StrWrite і StrWrite2, а також функцію NewLine (перехід на новий рядок) та WriteSimv (виводить на екран заданий символ необхідну кількість разів).

Слід зазначити, що даний програмний модуль не містить функцій читання із консолі в рядок, однак основна програма отримує дані із PSP DOS-а і опрацьовує вже створені дані, а тому не потребує якихось додаткових вказівок через консоль від користувача, всі необхідні специфічні дані (наприклад, маска файлів) користувач може задати в командному рядку при визові основної програми.

Код програмного модуля STRIO.ASM приведений нижче:

IDEAL

MODEL small

ASCnull EQU 0 ; ASCII нуль

ASCcr EQU 13 ; ASCII символ повернення каретки

ASClf EQU 10 ; ASCII символ вертикальної табуляції

; (прогону рядка)

CODESEG

PUBLIC StrLength, StrWrite, StrWrite2, NewLine, WriteSimv

; ------------------------------------------------------------------------------------------

; StrLength підраховує кількість ненульових символів в рядку

; -------------------------------------------------------------------------------------------

; Вхід di адреса ASCII рядка

; Вихід cx кількість ненульових символів в рядку

; Регістри cx

; -------------------------------------------------------------------------------------------

PROC StrLength

push ax ; зберегти у стеку змінювані

push di ; регістри ax, di

xor al, al ; в al поміщується шуканий символ 0

mov cx, 0ffffh ; в cx максимальна глибина пошуку

cld ; автоматичне збільшення di

repnz scasb ; шукати al, доки [di] або cx не стане 0

not cx ; логічне заперечення cx

dec cx ; зменшення cx на 1 – довжина рядка

pop di ; відновлення регістрів

pop ax

ret ; повернення до викликаючої програми

ENDP StrLength

; -------------------------------------------------------------------------------------------

; StrWrite вивід рядка на стандартний пристрій виводу

; StrWrite2 вивід заданої кількості символів рядка на консоль

; -------------------------------------------------------------------------------------------

; Вхід di адреса ASCII рядка

; cx кількість записуваних символів (для StrWrite2)

; Вихід символьний рядок виводиться на стандартний пристрій

; виводу

Регістри cx (для StrWrite)

; -------------------------------------------------------------------------------------------

PROC StrWrite

call StrLength ; встановити в cx довжину рядка

PROC StrWrite2 ; друга змінна точка входу

push ax ; збереження змінюваних регістрів

push bx

push dx

mov bx, 1 ; задання стандартного пристрою виводу

mov dx, di ; адресація ASCII рядка в ds:dx

mov ah, 40h ; в ax номер функції, що виконує запис

; в файл або на пристрій виводу

int 21h ; виклик 21 переривання DOS

pop dx ; відновлення збережених регістрів

pop bx ; із стеку

pop ax

ret ; повернення до визиваючої програми

ENDP StrWrite2

ENDP StrWrite

; -------------------------------------------------------------------------------------------

; NewLine перейти на новий рядок на стандартному пристрої виводу

; -------------------------------------------------------------------------------------------

; Вхід не має

; Вихід на пристрій виводу посилаються символи повернення

; каретки і прогону рядка

; Регістри не має

; -------------------------------------------------------------------------------------------

PROC NewLine

push ax ; збереження регістрів у стек

push dx

mov ah, 2 ; в ah номер функції виводу символу у DOS

mov dl, ASCcr ; в dl символ повернення каретки

int 21h ; вивести символ повернення каретки

mov dl, ASClf ; в dl символ прогону рядку

int 21h ; вивести символ прогону рядку

pop dx ; відновлення регістрів із стеку

pop ax

ret ; повернення до викликаючої програми

ENDP NewLine

; -------------------------------------------------------------------------------------------

; WriteSimv вивід на стандартний пристрій виводу заданий символ

; визначену кількість разів

; -------------------------------------------------------------------------------------------

; Вхід dl код символу

; cx кількість виводів символу

; Вихід на пристрій виводу задану кількість разів посилається

; переданий символ

;Регістри не має

; -------------------------------------------------------------------------------------------

PROC WriteSimv

push ax ; збереження регістрів

push cx

@@01:

mov ah,02 ; в ah номер функції DOS запису символу

int 21h ; вивести заданий символ

loop @@01 ; повторювати доки cx≠0

pop cx ; відновлення регістрів

pop ax

ret ; повернення до викликаючої програми

ENDP WriteSimv

END

Функції, надані програмним модулем STRIO.asm, є зручними і простими інструментами виводу інформації на стандартний пристрій виводу і будуть використані в основній програмі.

Характеристики

Тип файла
Документ
Размер
2,2 Mb
Учебное заведение
Неизвестно

Список файлов ВКР

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6814
Авторов
на СтудИзбе
276
Средний доход
с одного платного файла
Обучение Подробнее