Системне програмування та операційні системи

Автор: Пользователь скрыл имя, 25 Мая 2013 в 14:53, контрольная работа

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

1. Робота в операційній системі Linux. Програмування в оболонці shell.
2. Операційна система Windows. Системне програмування в MASM.
3. Операційна система Windows. Системне програмування в MASM32 з використанням функцій API.

Файлы: 1 файл

Системне програмування та операційні системи.docx

— 43.78 Кб (Скачать)

Зміст:

1. Робота в операційній  системі Linux. Програмування в оболонці shell.

2. Операційна система  Windows. Системне програмування в MASM.

3. Операційна система  Windows. Системне програмування в MASM32 з використанням функцій API.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Робота в операційній  системі Linux. Програмування в оболонці shell.

Найпростіші засоби SHELL

Командний мова shell (у перекладі - раковина, шкаралупа) фактично є мовою програмування дуже високого рівня. На цій мові користувач здійснює управління комп'ютером. Зазвичай, після входу в систему ви починаєте взаємодіяти з командною оболонкою. Ознакою того, що оболонка (shell) готова до прийому команд служить видається нею на екран промптер. У найпростішому випадку це один долар ("$").

shell - це одна з багатьох  команд UNIX. Тобто в набір команд  оболонки "shell" входить команда  "sh" - виклик інтерпретатора "shell". Перший "shell" викликається автоматично  при вашому вході в систему  і видає на екран промтері. Після цього ви можете викликати  на виконання будь-які команди,  в тому числі і знову сам  "shell", який вам створить нову  оболонку всередині колишньої. 
    Так наприклад, якщо ви підготуєте в редакторі файл "file_1": 
echo Hello! 
то це буде звичайний текстовий файл, що містить команду "echo", яка при виконанні видає все написане правіше від неї на екран.

    Оскільки UNIX - система  розрахована на багато користувачів, ви можете навіть на персональному  комп'ютері працювати паралельно, скажімо, на 12-ти екранах), маючи  на кожному екрані нового (або  одного і того ж) користувача  зі своєю командною оболонкою.  Можете і в графічному режимі X-Window також відкрити велике число  вікон, а в кожному вікні  може бути свій користувач  зі своєю командною оболонкою. 
   Стрижневим елементом мови shell є команда.

 

Структура команд

Команди в shell зазвичай мають  наступний формат: 
<Ім'я команди> <прапори> <аргумент (и)> 
Наприклад: 
ls-ls / usr / bin 
Де ls - ім'я команди видачі вмісту директорія, 
-Ls - прапори ("-" - ознака прапорів, l - довгий формат, s - об'ем файлів в блоках), 
/ Usr / bin - директорій, для якого виконується команда. 
Ця команда видасть на екран у довгому форматі вміст директорії / usr / bin, при цьому додасть інформацію про розмір кожного файлу в блоках. 
На жаль, така структура команди витримується далеко не завжди. Не завжди перед прапорами ставиться мінус, не завжди прапори йдуть одним словом. Є різноманітність і в поданні аргументів. До числа команд, які мають екзотичні формати, відносяться і такі "ходові" команди, як сс - виклик компілятора мови С, tar - робота з архівами, dd - копіювання файлу з перетворенням, find - пошук файлів і ряд інших. 
Як правило, перше слово shell сприймає, як команду. Тому в командному рядку 
cat cat 
перше слово буде розшифровано shell, як команда (конкатенації), яка видасть на екран файл з ім'ям "cat" (друге слово), що знаходиться в поточному директорії.

Shell-змінні

Ім'я shell-змінної - послідовність, що розпочинається з букви, та вміщує цифри, знак підкреслювання.

Значення shell-змінної - рядок символів.

У shell всього два типи даних: рядок  символів та текстовий файл.

Ім'я  змінної аналогічно традиційному представленню  про ідентифікатор, тобто ім'ям може бути послідовність букв, цифр та підкреслювань, розпочинається з букви або підкреслення.

Для присвоювання значення змінним може використовуватися оператор присвоювання "=".

         var_1=13

var_2="OS Unix"

Змінна  та її значення повинні бути записані без пробілів відносно символа "=".

Можливі й інші способи присвоювання значення shell-змінним. Так, наприклад: DAT=`date` приводить до того, що спочатку виконується команда "date" а результат її виконання, замість видачі на стандартний вихід, прописується у якості значення змінної, у даному випадку "DAT".

Можна надати значення змінної за допомогою  команди "read", яка забезпечує прийом значення з клавіатури: read x.

Одна  команда "read" може прочитати значення відразу для декількох змінних, по черзі. Якщо змінних більше, чим  їх введено, то тим що залишилися змінним  присвоюється порожній рядок, якщо введено  більше, то зайві значення ігноруються.

Під час звернення до shell-змінної необхідно  перед ім'ям ставити символ "\$", так відповідно команда echo $var_2; виведе на екран "OS Unix".

 Екранування

Як  засоби екранування використовуються подвійні лапки (""), одинарні лапки (' ') та бек-слеш (\).

Можна в одному рядку записувати декілька присвоювань.

            x=22 y=33 z=$x

            A="$x" B='$x' C=\$x

            D="$x + $y + $z"  E='$x + $y + $z'  F=$x\ +\ $y\ +\ $z

Тоді 

            echo A = $A   B = $B   C = $C

            echo D = $D   E = $E   F = $F

            eval echo evaluated A = $A

            eval echo evaluated B = $B

            eval echo evaluated C = $C

виведуть на екран 

            A = 22 B = $x C = $x

            D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22

            evaluated A = 22

            evaluated B = 22

            evaluated C = 22

"eval" - команда, що  виконує означення змінних в  рядку, що є аргументом.

Бек-слеш не тільки екранує наступний за ним  символ, що дозволяє використовувати  спеціальні символи просто як символи, що представляють самих себе, він  може екранувати сам себе. Цей символ також може створювати ефект продовження  рядка. Ефект продовження командного рядка забезпечує також символ конвеєра - "|".

Програмні структури

Як і в будь-якій мові програмування  у тексті мовою shell можуть бути коментарі. Для цього використовується символ "#". Усе, що знаходиться в рядку  лівіше від даного символу, сприймається інтерпретатором як коментар.

Як і в будь-якій процедурній  мові програмування, в мові shell є  оператори. Ряд операторів дозволяє керувати послідовністю виконання  команд. У таких операторах часто  необхідна перевірка умови, яка  визначає напрямок продовження обчислень.

Умовний оператор ("IF").

У загальному випадку оператор "if" має структуру:

            if умова

                then список

                    [elif умова

                        then список]

                [else список]

            fi

Оператор вибору ("CASE").

Оператор вибору "case" має структуру:

 

            case рядок in

                шаблон) список команд;;

                шаблон) список команд;;

                    ...

            esac

"Рядок" (це може бути  і один символ), що порівнюється  із шаблоном. Потім "список  команд" вибраного рядка.

Приклад:

            echo -n " А какую оценку получил  на экзамене?: "

            read z

            case $z in

                5) echo Молодец !            ;;

                4) echo Все равно молодец !  ;;

                3) echo Все равно !          ;;

                2) echo Все !                ;;

                *) echo  !                   ;;

            esac

Оператор циклу із перерахуванням ("FOR").

Оператор циклу "for" має структуру:

            for ім'я [in список значень]

                do

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

                done

де "for" - це службове слово, що визначає тип циклу, "do" та "done" - це службові слова, що виділяють тіло циклу. Фрагмент "in список значень" може бути відсутнім.

Оператор циклу з істиною  умовою ("WHILE").

Оператор циклу "'while' має структуру:

            while умова

                do

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

                done

де "while" - службове слово, що визначає тип циклу з істиною  умовою. Список команд у тілі циклу  повторюється до тих пір, доки зберігається істинність умови (доки умови не дорівнює 0) або цикл буде перерваний командами "break", "continue" або "exit".

Оператор циклу з хибною умовою ("UNTIL").

Оператор циклу "until" має структуру:

            until умова

                do

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

                done

де "until" - службове слово, що визначає тип циклу з хибною умовою. Список команд в тілі циклу  повторюється стільки разів, скільки  буде зберігатися хибність умови  або цикл не буде перерваним спеціальними командами.

Відмінність від "while" полягає  в тому, що умова циклу перевіряється  на хибність, перевіряється після  кожного виконання тіла циклу.

Пустий оператор.

Пустий оператор має формат:

Нічого не робить. Повертає значення "0". Наприклад, в конструкції "while :" або ставить у початок  командного файлу, щоб гарантувати, що файл не буде прийнятий за виконавчий для "csh".

 

 

 

 

 

 

 

 

 

 

 

 

 

Завдання №1:

27. Дан текст, каждый символ которого может быть малой буквой, большой буквой, цифрой или одним из знаков “+”, “-”, “*”. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определим группу цифр и группу знаков. Найти все такие группы букв, в которые буква “а” входит не менее 2-х раз.

Код програми:

#!/bin/bash  

#1 #вивід інформації про  виконавця роботи та ввід вхідних  даних

gdialog --title "Виконав" --msgbox "Башинський Олег БІТ-3-09"

gdialog --title "Вхідні дані" --inputbox  "Введіть текст" 10 50 2> lab6text.txt

 

#ввід вхідних даних

if [ $? -ne 1 ];

#Рядок опрацьовується  якщо ввід підтверджено («Ок»)

then

 

ptext=$(cat lab6text.txt)

#вхідний рядок

text=$ptext;

#його копія 

n=${#ptext};

#кількість символів  

i=0;  

j=0;  

m=0;

#2  

while [ $i -le $n ];

#цикл по символах строки

do   

k=${ptext:$i:1}

#вибір  і-го символу  в строці  

case $k in

#перевірка чи належить  символ до літер, і формування  груп літер

1|2|2|3|4|5|6|7|8|9|0) grup=' '; m=$(($m+1));;

#якщо не літера, очищаємо  буфер групи літер

"*"|"-"|"+") grup=' '; m=$(($m+1));;

?) grup=$grup$k; #якщо  літера, добавляємо  до буфера групи літер

    ns[$m]=$grup; #зберігаємо  в масив

                               

esac

 

i=$(($i+1)) #переходимо до  наступного символу строки

   done

 

#3  

for p in ${ns[*]}; #цикл по групах  літер

do

j=0;

i=0;

 

ind='no';#індекатор присутності  в групі "аа"

     n=$((${#p} - 1));

#кількість символів групи   

while [ $i -lt $n ];#цикл по символах  групи

do

j=$(($i+1));

if  [ ${p:$i:1} = 'a' ] && [ ${p:$j:1} = 'a' ] && [ $ind = 'no' ]

#перевірка чи є в  групі "аа"

then

GrupAA=$GrupAA"  "$p #якщо  так, добавляємо до вихідних  даних

 

ind='yes'

#"аа" присутні  

    fi

i=$(($i+1));

#переходио до наст. групи

done

ind='no' #в наст. груні ще  невідомо чи є "аа"

    done

 

#4 Виведення вхідного  та зміненого тексту та набору  спец. символів. Кінець алгоритму.

 

gdialog --title "Вихідні дані" --msgbox "Вхідний текст:$text\nВихідні  дані:$GrupAA"

fi

gdialog --clear

#Кінець програми.

exit 0

 

 

Операційна система  Windows. Системне програмування в MASM.

Регістри

Крім комірок оперативної  пам'яті для короткочасного збереження даних використовуються регістри - комірки, що входять до складу процесора. Доступ до регістрів здійснюється значно швидше, ніж до комірок пам'яті, тому використання регістрів помітно зменшує час виконання програм. Крім того, у деяких випадках без регістрів узагалі неможливо обійтися.

Усі регістри мають розмір слова (16 бітів), за кожним з них закріплена визначена назва. За призначеням та способом використання регістри можна розбити на наступні групи:

  • регістри загального призначення (AX, BX, CX, DX, BP, SI, DI, SP);
  • сегментні регістри (CS, DS, SS, ES);
  • лічильник команд (IP);
  • регістр флагів (Flags).

Тлумачення цих назв:

  • A accumulator, акумулятор;
  • B base, база;
  • C counter, лічильник;
  • D data, дані;
  • BP base pointer, покажчик бази;
  • SI source index, індекс джерела;
  • DI destination index, індекс приймача;
  • SP stack pointer, покажчик стеку;
  • CS code segment, сегмент команд;
  • DS data segment, сегмент даних;
  • SS stack segment, сегмент стеку;
  • ES extra segment, додатковий сегмент;
  • IP instruction pointer, лічильник команд.

Регістри загального призначення  можна використовувати у всіх арифметичних і логічних командах. У той же час кожен з них має визначену спеціалізацію, тобто для деяких команд необхідні тільки визначені регістри. Наприклад, команди множення і ділення вимагають, щоб один з операндів знаходився в регістрі AX чи в регістрах AX і DX (у залежності від розміру операнду), а команди керування циклом використовують регістр CX як лічильник циклу. Регістри BX і BP зазвичай використовуються як базові регістри, а SI і DI - як індексні. Регістр SP як правило вказує на вершину стеку, апаратно підтримуваного ПК.

Регістри AX, BX, CX і DX конструктивно  влаштовані так, що можна отримувати доступ до їх старшої і молодшої половин; можна сказати, що кожний з  цих регістрів складається з двох регістрів, розмір яких один байт і що позначаються через AH, AL, BH, BL, CH, CL, DH, DL відповідно (H - high, старша; L - low, молодша). Таким чином, з кожним з цих регістрів можна працювати як з єдиним цілим, так і з його частинами. Наприклад, можна записати слово в AX, а потім зчитати тільки частину слова з регістра AH чи замінити тільки частину в регістрі AL і т.д. Така структура регістрів дозволяє використовувати їх для роботи і з числами так і із символами.

Информация о работе Системне програмування та операційні системи