Міністерство освіти і науки України
Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
Звіт
до лабораторної роботи №2
з дисципліни «Операційні системи»
Тема «Технологія роботи з системними засобами при створенні програм»
Варіант 12
КИЇВ-2022
Мета роботи : ознайомитися з технологією роботи створення асемблерної програми.
Порядок роботи :
Створити код асемблерної програми в середовищі текстового редактора Блокнот.
Виконати трансляцію створеної програми.
Проаналізувати лістинг програми, визначити поля лістингу, віднайти відповідні сегменти програми, виправити помилки. У разі виявлення помилок повторити трансляцію програми та отримати об’єктний модуль програми.
Викликати компонувальника та отримати виконуваний модуль програми.
Запустити виконуваний модуль на виконання.
Скопіювати лістинг трансляції та результат роботи програми у командному рядку у лабораторну роботу.
Результати надати викладачу.
Короткий теоретичний опис
Асемблери зазвичай виконують два або більше проходів по тексту програми при трансляції. При першому проході асемблер проглядає усю вхідну програму та створює таблицю символів, яка містить імена та мітки, що зустрічаються в програмі. При другому проході асемблер використовує таблицю символів, в якій відома довжина кожної команди та її відносне розташування, а також формує об’єктний код для кожної інструкції. Після цього асемблер створює об’єктний файл (*.obj), файл лістингу (*.lst) та файл перехресних посилань (*.crt).
Процес підготовки та відладки програми на мові Асемблер включає такі етапи:
Введення вхідного тексту програми (код програми) за допомогою текствого редактора (Блокнот).Файл, створений за допомогою текстового редактора повинен мати розширення *.asm.
Трансляція програми (для створення об’єктного модуля).
Створення завантажувального модуля (результатом роботи цього етапу є створення завантажувального файлу з розширенням *.exe).
Відладка програми – знаходження , локалізація та усунення помилкових операцій в програмах або повідомлень в комп’ютері. Цей етап здійснюється за допомогою програми Tdebug.exe.
Трансляція вхідного тексту програми полягає у перетворенні речень вхідної мови у коди машинних команд та виконується за допомогою програми TASM.
Для виконання трансляції використовується пакет TASM.EXE. В командному рядку ця програма запускається наступним чином:
TASM.EXE [ключі] ім’я_вхідного_файлу [, ім’я_об’єктного_файла]
[, ім’я_файла_лістингу] [, ім’я_файла_перехресних_посилань].
В квадратних дужках позначені необов’язкові параметри. Обов’язковим є лише ім’я вхідного файла. Цей файл повинен знаходитися на
диску, обов’язково мати розширення *.asm.
Ключі – це режими роботи транслятора.
При запуску транслятора треба використовувати два ключа:
/la – виведення розширеного варіанту лістингу транслятора,
/zi – отримання повної інформації для відладчика.
Запуск компоновщика (редактора зв’язку) здійснюється в командному рядку:
TLINK [ключі] список об’єктних модулів [, ім’я завантажувального модуля].
Наприклад, tasm /la /zi Lab2.asm. В результаті утвориться файл лістингу(*.lst), об’єктний файл (*.obj), таблиці перехресних посилань (*.crf ).
При запуску компоновщика треба використовувати два ключа:
/х – не створювати файл з розширенням *.map (подавляється формування файлу лістингу компоновки, в якому відображається карта завантаження, без цього файла можна обійтись);
/v – передає у завантажувальний файл символьну інформацію, яка дозволяє відладчику TD виводити на екран повний текст вхідної програми, включаючи мітки, коментарі та ін.
Для отримання виконуваного модуля треба запустити tlink /х /v Lab2.obj, в результаті буде отриманий модуль Lab2.exe.
Створити код асемблерної програми в середовищі текстового редактора Блокнот
/
Виконати трансляцію створеної програми
/
Проаналізувати лістинг програми, визначити поля лістингу, віднайти відповідні сегменти програми, виправити помилки. У разі виявлення помилок повторити трансляцію програми та отримати об’єктний модуль програми.
/
/
Викликати компонувальника та отримати виконуваний модуль програми
/
Запустити виконуваний модуль на виконання
/
Аналіз асемблерної програми
Проаналізуємо кожен рядок.
Title Lab2.asm – заголовок програми.
.model small – за допомогою директиви .model зазначаємо модель пам’яті small.
Директива .model визначає модель пам’яті, використовувану програмою. Ця директива повинна знаходитися перед будь-якою з директив оголошення сегментів.
.model small - код займає один сегмент, дані та стек поєднані в інший сегмент, для їх опису можуть використовуватися різні сегменти, але поєднані в одну групу з іменем DGROUP. Ця модель використовується для більшості програм асемблера.
.data – початок сегменту ініціалізованих даних.Також використовується для визначення типу даних near.
text segment – за допомогою директиви segment відкриваємо (зазначаємо початок) сегмент команд.
Директива SEGMENT починає новий сегмент, директива ENDS завершує його. Дозволяється починати новий сегмент, потім починати сегмент даних, потім переходити знову до текстового сегменту і т.д.
Дані та код при використанні цієї моделі адресуються як near (ближні).
assume CS:text, DS:data – тепер регістр сегменту коду вказує на початок сегменту команд (text), а регістр сегменту даних – на сегмент даних.
Директива ASSUME повідомляє компілятору, що зазначений у ній сегмент необхідно зв’язати з іменем сегмента або групи. В якості сегментних регістрів застосовуються регістри CS, DS, ES, SS.
Директива призначення сегментів ASSUME використовується для встановлення відповідності між сегментами та сегментними регістрами.
Сегмент коду CS містить команди програми. Для доступу до цього сегменту слугує регістр сегменту коду (Code Segment register) CS. Він містить початкову адресу сегменту коду з машинними командами, до якого має доступ процесор (ці команди завантажуються в конвейєр процесора).
Сегмент даних DS містить дані, що оброблюються програмою. Для доступу до цього сегменту слугує регістр сегменту даних (Data Segment register) DS, який зберігає адресу сегменту даних поточної програми. Регістр сегменту даних плюс величина зсуву, визначена в команді, вказує на конкретну комірку в сегменті даних.
begin:mov AX, data – точка входу в програму begin, в регістр загального призначення, первинний акумулятор, поміщаємо адресу сегменту.
Сенс команди MOV полягає в тому, щоб помістити дані передавача в комірку пам’яті одержувача, приклад:
MOV одержувач, передавач.
mov DS, AX – наповнення AX (адреса сегменту завантажену раніше), поміщаємо в сегментний регістр даних.
Регістр АХ =<AH:AL> - первинний акумулятор (Accumulator), який використовується у всіх операціях введення-виведення, в деяких операціях з рядками та в деяких арифметичних операціях.
mov AH, 09h – в AH поміщаємо 09h(функція DOS) – виведення на екран.
mov DX, offset mesg
int 21h – переривання, яке виконує DOS для того, щоб вивести повідомлення на екран.
Int - це скорочення слова Interrupt що на українську переводитися як переривання. Виглядає ця команда так:
Int номер.
У кожного переривання є номер, тобто виконавця переривання ми визанчаємо за номером.
В нашому випадку це 21h, що вказує нам на те, що переривання виконує DOS.
Одне переривання може виконувати багато функцій. Дію, яку має виконати переривання вказано в регістрі AX.
mov AH, 4Ch - в AH поміщаємо 4Ch(функція DOS) – завершення програми.
mov Al, 0 – поміщаємо 0 в AL, код 0 – код успішного завешення.
int 21h - переривання, яке виконує DOS для того, щоб завершити програму.
text ends - закриваємо сегмент коду за допомогою директиви ends.
data segment - за допомогою директиви segment відкриваємо сегмент даних.
mesg db "NACHINAEM ! $" – текст, який необхыдно вивести.
data ends - закриваємо сегмент даних за допомогою директиви ends.
stk segment stack – за допомогою директиви segment відкриваємо сегмент стеку.
db 256 dup (0) – резевуємо 256 байт для стеку.
Оператор DUP використовується для заповнення ділянки пам’яті елементами, що повторюються.
Тобто в даному випадку DUP виділяє 256 байтів зі значенням 0 кожний.
stk ends – закриває сегмент стеку за допомогою директиви ends.
end begin - кінець тексту програми з точкою входу.
Висновок
Під час виконання цієї роботи була розглянута технологія роботи створення асемблерної програми.
Було створено код асемблерної програми в Блокноті, потім була виконана трансляція отриманої програми. В результаті трансляції було отримано два файли – файл об’єктного модуля та файл лістингу. Проведено аналіз лістингу. Здійснено компоновку програми, результатом якої є створення виконуваного модуля, отриманий модуль запущено на виконання. Повідомлення виводиться на екран.