СП - ЛР 6 (1075961)
Текст из файла
Согласовано: Гапанюк Ю.Е. "__"_____________2010 г. | Утверждаю: Большаков С.А. "__"_____________2010 г. |
Лабораторная работа №6 по курсу
Системное программирование
"Ввод и распечатка параметров командной строки"
8
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-41 | ________________ |
Сидякин А.А. | "28" марта 2010 г. |
Москва - 2010
__________________________________________________________
Цель лабораторной работы:
Разработать и отладить программу на языке Ассемблер для ввода анализа и распечатки параметров командной строки при запуске программы (параметры в области PSP со смещением 081h)
Исходный текст программы:
; Лабораторная работа №6
;===============================================================================
prgr segment
assume CS:prgr,DS:data ; соответствие сегментных регистров
begin: mov AX,data ; сначала ES будет
mov ES,AX ; соответствовать сегменту data
; копируем параметры запуска
mov SI,80h ; а DS указывает на PSP, и берём 80h от PSP
mov DI,offset dest ; помещаем строку-приёмник dest в ES:DI
mov CL,[SI] ; получаем длину строки параметров
cmp CL,0 ; проверяем, есть ли они вообще
je nope ; если нету, то пойдём в метку nope
mov CH,0 ; на всякий случай запилим ноль в старший AX
push CX ; схоронили AX
inc SI ; перешагнули с длины строки на пробел (81h)
inc SI ; перешагнули с пробела на первый символ (82h)
cld ; направление - восток
rep movsb ; копировать из DS:SI в ES:DI, побайтово CL раз
push ES ; скинули ES
pop DS ; подняли DS, теперь они оба указывают на data
jmp yeap ; попрыгали дальше
nope: mov AX,data ; тут надо перенести DS с начала PSP
mov DS,AX ; на начало data, иначе строку не найдёт
mov AH,09h ; функция вывода на экран строки
mov DX,offset oblom ; обломахтунг
int 21h ; вызвали DOS
jmp fin ; попрыгали в конец, параметров нет
yeap:
; --------------------------
; проверяем первый параметр
mov SI,offset dest ; копируем из dest, там сейчас строка параметров
mov DI,offset tmp1 ; в tmp1, нам надо получить первый параметр,
mov CL,4 ; поэтому берём 4 символа (он фиксированный)
rep movsb ; копировать побайтово CL раз
mov DI,offset par11 ; теперша в DI кладём эталон
mov SI,offset tmp1 ; а в SI - полученный параметр
mov CL,4 ; устанавливаем CL на 4 символа
repe cmpsb ; и сравниваем их посимвольно, до расхождения
jne frst2 ; если не совпадают, то пошли ещё проверим
mov p1[1],1 ; если совпало, то ништяк, переменная в 01
jmp next2 ; попрыгали дальше
frst2: mov DI,offset par12 ; тут всё то же самое, просто проверяем вариации,
mov SI,offset tmp1 ; потому что надо учесть заглавные и обычные,
mov CL,4 ; поэтому вместо двух, /C=y и /C=n мы проверяем
repe cmpsb ; ещё и /C=Y и /C=N, а вообще,
jne frst3 ; надо ещё и C/c проверять, но тут организм
mov p1[1],1 ; резко воспротивился и забил на это дело,
jmp next2 ; потому что тупо рутина, ничего критичного нет
frst3: mov DI,offset par13
mov SI,offset tmp1
mov CL,4
repe cmpsb
jne frst4
jmp next2
frst4: mov DI,offset par14
mov SI,offset tmp1
mov CL,4
repe cmpsb
jne err1
jmp noer2
err1: mov AH,09h ; ахтунг, ошибка
mov DX,offset error1 ; вывели сообщение
int 21h
jmp fin ; и на выход
noer2:
; проверяем второй параметр
next2: mov SI,offset dest ; вся та же кутерьма
add SI,5 ; но - параметр может быть пропущен,
mov DI,offset tmp2 ; а на его месте быть третий, и это
mov CL,2 ; мы учитываем следующим образом:
rep movsb ; проверка третьего параметра будет
mov DI,offset par21 ; в двух вариантах: первый - это то что
mov SI,offset tmp2 ; он начинается с шестого символа (при
mov CL,2 ; отсутствии второго параметра) и
repe cmpsb ; второй - это что он будет начинаться
jne scn2 ; с девятого символа (если второй есть)
mov p2[1],1 ; вот тут запоминается, что второй - есть
jmp thrd2 ; и прыгается во второй вариант проверки
scn2: mov DI,offset par22 ; второй параметр может быть трёх видов,
mov SI,offset tmp2 ; потому и проверяем его в три этапа
mov CL,2 ; там определены /H, /h и /?
repe cmpsb
jne scn3
mov p2[1],1
jmp thrd2
scn3: mov DI,offset par23
mov SI,offset tmp2
mov CL,2
repe cmpsb
jne next3
mov p2[1],1
jmp thrd2
; проверяем третий параметр
next3: mov SI,offset dest ; вот первый вариант проверки
add SI,5 ; с шестого символа
mov DI,offset tmp3
mov CL,9 ; потому что пароль фиксированный
rep movsb
mov DI,offset pass
mov SI,offset tmp3
mov CL,9
repe cmpsb
jne err3
jmp noer3
thrd2: mov SI,offset dest ; вот второй вариант проверки
add SI,8 ; с девятого символа
mov DI,offset tmp3
mov CL,9 ; меняется в строке pass
rep movsb
mov DI,offset pass
mov SI,offset tmp3
mov CL,9
repe cmpsb
jne err3
jmp noer3
err3: mov AH,09h ; неверный либо не введённый пароль
mov DX,offset error3 ; сообщение об отказе в доступе
int 21h
jmp fin ; и на выход
noer3:
; --------------------------
cmp p1[1],1 ; если параметр очиски экрана
jne clrn ; говорит НИХТ, то не очищаем
mov AX,02h ; иначе очистка экрана
int 10h ; через прерывание BIOS по видеорежиму
clrn:
cmp p2[1],1 ; есть параметр справки?
jne inp2 ; нету - тогда скажем об этом
mov AH,09h ; есть - вываливаем справку
mov DX,offset hlp1
int 21h
CALL CLRF
mov AH,09h
mov DX,offset hlp2
int 21h
CALL CLRF
CALL CLRF
inp: mov AH,09h ; а тут ждём, пока юзверь нажмёт *
mov DX,offset inf
int 21h
mov AH,01h
int 21h
cmp AL,42
je nxt
mov AH,02h
mov DL,8
int 21h
mov AH,02h
mov DL,0
int 21h
mov AH,02h
mov DL,13
int 21h
loop inp ; иначе жать ему на всё остальное вечно
jmp greet
inp2: mov AH,09h
mov DX,offset hlpno
int 21h
mov AH,01h ; а тут ждём, пока юзверь нажмёт ENTER
int 21h
cmp AL,13
je nxt
mov AH,02h
mov DL,8
int 21h
mov AH,02h
mov DL,0
int 21h
mov AH,02h
mov DL,13 ; ENTER по ASCII, ахахахаха, жалкие людишки!
int 21h
loop inp2 ; иначе жать ему на всё остальное вечно
nxt: CALL CLRF
CALL CLRF
greet:
nxt3: mov AH,09h ; фен-шуй в виде небольшой информации
mov DX,offset param
int 21h
mov AH,40h ; функция DOS вывода на экран строки
mov BX,1 ; дескриптор экрана
pop CX
mov DX,offset dest ; адрес строки кладём в DX
int 21h
CALL CLRF
mov AH,40h
mov BX,1
mov CX,23
mov DX,offset def ; фен-шуй из дефисов
int 21h
CALL CLRF
mov AH,09h
mov DX,offset frst
int 21h
mov AH,40h
mov BX,1
mov CX,4
mov DX,offset tmp1
int 21h
CALL CLRF
mov AH,09h
cmp p2[1],1 ; если параметр справки есть,
jne pr2 ; ...а если нету, то вон туда...
mov DX,offset scnd1 ; то выведем одно
int 21h
mov AH,40h
mov BX,1
mov CX,2
mov DX,offset tmp2
jmp nxt2
pr2: mov DX,offset scnd2 ; выведем другое
nxt2: int 21h
CALL CLRF
mov AH,09h
mov DX,offset thrd
int 21h
mov AH,40h
mov BX,1
mov CX,9
mov DX,offset stars ; покажем звёздачке, не пароль же выводить
int 21h
CALL CLRF
CALL CLRF
mov AH,09h
mov DX,offset msg
int 21h
CALL GETCH
mov AH,02h
mov DL,8
int 21h
mov AH,02h
mov DL,0
int 21h
CALL CLRF
cmp p1[1],1 ; тут опять проверка параметра
jne fin ; очистки экрана и всё такое
mov AX,02h
int 10h
fin: mov AX,4C00h
int 21h
; ------------------------------------------------------------------------------
CLRF proc ; процедура переноса строки и возврата каретки
mov AH,02h
mov DL,10 ; символ новой строки
int 21h
mov AH,02h
mov DL,13 ; символ возврата каретки
int 21h
RET
CLRF endp
; ------------------------------------------------------------------------------
GETCH proc ; процедура ввода символа
mov AH,01h
int 21h
RET
GETCH endp
; ------------------------------------------------------------------------------
prgr ends ; конец сегмента команд
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
data segment ; начало сегмента данных
param db 'Line of parameters are: $'
frst db '+ first parameter is: $'
scnd1 db '+ second parameter is: $'
scnd2 db '- there is no second parameter $'
p1 db 2 dup (0)
p2 db 2 dup (0)
thrd db '+ third parameter is: $'
def db 23 dup ('-')
msg db 'Press any key to exit... $'
dest db 20 dup ('#')
oblom db 'There are no paremeters, dude$'
error1 db 'Error of the first parameter$'
error3 db 'Access denied, ololo$'
par11 db '/C=y'
par12 db '/C=Y'
par13 db '/C=n'
par14 db '/C=N'
par21 db '/h'
par22 db '/H'
par23 db '/?'
tmp1 db 4 dup ('1')
tmp2 db 2 dup ('2')
tmp3 db 9 dup ('3')
pass db '/K=ivanov'
hlp1 db 'This program just shows, how to use launch-parameters$'
hlp2 db 'created by Ivanov Ivan, student of IU5-41 group, var.20$'
inf db 'Press * to continue $'
stars db 9 dup ('*')
hlpno db 'There is no spoon... Press ENTER $'
data ends ; конец сегмента данных
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
stk segment stack ; начало сегмента стека
db 256 dup (0) ; резервирование 256 байт для стека
stk ends ; конец сегмента стека
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
end begin ; конец текста программы, установка точки входа
;===============================================================================
Листинг программы:
Листинга получилось настолько много и он так сильно съехал по строкам из-за комментариев и табуляций редактора, что приводить его здесь представляется нецелесообразным. Он будет приложен к исполняемому модулю и предъявлен при защите по требованию преподавателя
Результат работы программы:
1) при запуске без параметров на экран выводится соответствующее сообщение и работа программы завершается
2) при неправильном либо отсутствующем первом параметре в любом случае на экран выводится соответствующее сообщение и работа программы завершается
3) при неверном пароле (третий параметр) на экран выводится сообщение об отказе в доступе и работа программы завершается
4) при отсутствующем втором параметре на экран выводится сообщение о том, что отсутствует справка и программа переходит в режим ожидания нажатия клавиши ENTER, после чего программа продолжает выполняться:
There is no spoon... Press ENTER
Line of parameters are: /C=y /K=ivanov
-----------------------
+ first parameter is: /C=y
- there is no second parameter
+ third parameter is: *********
Press any key to exit...
5) при запуске со всеми тремя верными параметрами программа работает следующим образом:
This program just shows, how to use launch-parameters
created by Ivanov Ivan, student of IU5-41 group, var.20
Press * to continue *
Line of parameters are: /C=y /h /K=ivanov
-----------------------
+ first parameter is: /C=y
+ second parameter is: /h
+ third parameter is: *********
Press any key to exit...
6) Первый параметр влияет на очистку экрана до начала выполнения основной части программы и после её завершения
Блок-схема программы:
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.