МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет
„Львівська політехніка”
Кафедра САПР
Звіт
Про лабораторної роботи №3
На тему:
“СИСТЕМА ПРОГРАМУВАННЯ НА АСЕМБЛЕРІ”
З курсу „Системне програмування та операційні системи”
МЕТА РОБОТИ
Мета роботи - вивчення системи програмування на Асемблері ІВМ РС.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Асемблер є мовою програмування низького рівня. Він забезпечує написання, відладку та виконання програм на рівні близькому до машинних команд. Основна область застосування Асемблера - написання високоефективних програм системного характеру (драйверів, динамічна відеографіка, обробка сигналів в режимі реального часу, тощо).
Програмування на Асемблері базується на системі програмування, яка забезпечує перехід від початкового файлу з текстом програми до завантажуваного файлу, готового до виконання (інтерпретації мікропроцесором).
Реалізація програми на Асемблері охоплює такі етапи:
- написання програми на мові Асемблера, ввід та оформлення її у вигляді початкового файлу за допомогою текстового редактора (наприклад, Nогtоn Соmmander);
- трансляція початкового файлу в об'єктний файл;
- редагування зв'язків на основі декількох об'єктних файлів і формування завантажуваного файлу для інтерпретації мікропроцесором.
Така схема забезпечує незалежне асемблювання кількох початкових файлів з подальшим їх об'єднанням на рівні об'єктних файлів в один завантажуваний. Вказаний підхід реалізує концепції модульного програмування (розробка та реалізація програм по частинах - модулях). Відповідно розглядають початковий модуль, об'єктний модуль та завантажуваний модуль. Відомі і простіші схеми асемблювання, які забезпечують, перехід, від рівня початкових файлів до завантажуваних.
2.1. Структура програми на Асемблері
Програма. на Асемблері складається з модулів. Модулі складаються з сегментів. Сегменти складаються з процедур, команд та директив.
Початковий програмний модуль складається з операторів. Виділяються оператори трьох типів: команди, директиви, коментар. Оператори команд визначають операції, які виконує процесор. Директиви вказують Асемблеру та Редактору зв'язків як оформляти (об'єднувати) команди та модулі в програму. Директиви також забезпечують розподіл пам'яті та визначення даних.
Оператори команд складаються з символічного імені, коду операції, поля операндів та коментаря. Код операції визначає команду і відрізняє її від директиви. При написанні програми на Асемблері символічне ім’я ставиться перед кодом операції через двокрапку і називається міткою (внутрішньою). Мітка визначає адресу команди в оперативній пам'яті, що може використовуватись, наприклад, операторами переходу.
Операнди (два, один, або відсутні) визначають дані над якими виконуються операції процесором. Операнди відділяються один від одного комою, а від коду команди - пропуском.
Коментар відділяється від полів команди та операндів пропуском та крапкою з комою. Він не приймає участі в асемблюванні і служить лише для документування програми.
Оператори директив складаються з символічного імені, коду псевдооперації, поля операндів та коментаря. Структура директиви аналогічна структурі команди. Код псевдооперації визначає зміст директиви.
Операндів директиви може бути декілька і вони розділяються комами, а від коду псевдооперації відділяються пропуском.
Символічне ім'я, яке стоїть на початку директиви розподілу пам'яті (директиви визначення) називається змінною. Символічне ім'я директиви відділяється від коду пропуском, а не двокрапкою, як мітка.
Коментар записується через пропуск та крапку з комою.
Програма складається з модулів, які можуть бути паралельно розроблені та реалізовані. Кожний модуль складається з операторів, які обробляються (транслюються) Асемблером. Для транслятора признаком кінця операторів модуля є директива - ЕND (Кінець). Крім того операнд директиви END визначає точку входу програми.
Кожний модуль поділяється на окремі частини директивами сегментації, які визначають початок (SEGMENT) та кінець (ENDS) сегмента. Кожен із сегментів (типів сегментів) має певні функції і забезпечує структуризацію програм. Всі сегменти поіменовані (SSEG - стековий сегмент, CSEG - програмний сегмент, DSEG - сегмент даних, ESEG - додатковий сегмент даних). Директива ASSUME зв'язує довільні імена з сегментами відповідного типу. Типи сегментів визначають функції, що вони виконують (SS, ES та-DS - визначення даних, CS - послідовність команд, а також, директив, що групують ці команди у блоки).
Програмний сегмент поділяється на частини директивами визначення процедур (по іменованих). Процедури близькі до підпрограм, але вони знаходяться, у складі початкового модуля. Основні складові програми вказані на прикладі
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG
START PROC FAR
PUSH DS
PAD: MOV BX,DSEG
CALL MAIN
MOV AX,4C00H
INT 21H
START ENDP
MAIN PROC NEAR
MOV AM,CATS
. . . RET
MAIN ENDP
CSEG ENDS
END START
2.2. Структура операндів
Виділяють два основних типи операндів: регістровий та операнд в оперативній пам'яті. Команда може мати 0,1,2 операнди. Якщо операнд один, то він або регістровий, або в оперативній пам'яті. Якщо їх два, то один регістровий, а інший в оперативній пам'яті. Операнд в регістрі визначається ім'ям цього регістра. Операнд в оперативній пам'яті визначається вмістом регістрів, поіменованих символічними іменами, областями оперативної пам'яті та константами - це визначає спосіб адресації.
2.3. Способи адресації
Безпосередня адресація:
MOV DX,3451H ; (3451H - абсолютна адреса)
MOV DX,OFFSET CATS ; адреса, змінної CATS відносно початку сегмента)
Індексна адресація:
MOV DX,[SI] ; (посередня адресація)
Відносна адресація:
MOV DX,[BX] ; (посередняадресація)
Адресація з індексацією та базуванням:
MOV [DX+SI] ; (посередня адресація)
Пряма адресація:
MOV DX,CATS
Пряма адресація з індексацією:
MOV DX,CATS[SI]
Пряма адресація з базуванням:
MOV DX,CATS[BX]
Пряма адресація з індексацією та базуванням:
MOV DX,CATS[BX+SI]
Якщо операнд заданий константою (безпосередня адресація), то він обробляється, як дані (при трансляції підставляється адреса цієї константи). Якщо в операнді вказане ім'я, то це - різновидність прямої адресації. Якщо в операнді імені немає, а є регістри (індексний чи базовий) в квадратних дужках, то це - посередня, адресація, бо адреса визначається через вміст регістрів. Коли є ім’я і регістри, то це пряма адресація з базуванням та індексуванням.
2.4. Класифікація команд:
Команди передачі даних MOV
Приклади:
MOV AH,CATS
MOV AX,BX
MOV AH,AL
MOV AH,6
Команди порівняння CMP, TEST, умовного JE, JG, JL, JNE, та безумовного JMP переходу
Приклади:
JMP FAD
CMP AH,01
JE C1
CMP AH,01
JNE C2
Команди виклику та повернення з процедури (підпрограми) CALL, RET
Приклад:
CALL PG
RET 4
Команди роботи зі стеком PUSH, POP
Приклад:
PUSH AX
POP
Команди роботи зі стрічковими даними LOADSB, MOVSB
Приклад:
MOV SI, OFFSET CATS
MOV DI, OFFSET RATS
MOV CX,3
REP MOVSB
Команда циклу LOOP
Приклад:
MOV CX,14
MOV SI,0
DAD: MOV AX,CAT[SI]
. . .
INC SI
LOOP DAD
. . .
MOV CX,10
C1: PUSH CH MOV CX,20
C2: PUSH CX
MOV CX,30
C3: MOV AX,B2
LOOP C3
POP CX
LOOP C2
POP CX
LOOP C1
Команди побітової обробки
AND AX,OFFOOH ; (логічне множення)
OR AX,OFFOOH ; (логічне додавання)
XOR AH,OF1H
TEST AX,BX ; (виконується аналогічно AND, однак операнди не міняються)
Команди зсуву
SHR AL,1 ; (вправо)
MOV CL,3
SHL AL,CL ; (вліво)
SAR AL,1 ; (арифметичний зсув вправо)
ROR AL,1 ; (циклічний зсув вправо)
ROR AL,1 ; (циклічний зсув вправо з переносом)
Арифметичні команди
ADD AX,DX ; (додавання)
SUB AX,AX ; (віднімання)
MUL BX ; (множення)
DIV BX ; (ділення)
Команди переривання INT, STI, CLI
Команди вводу/виводу
IN AX,DX
OUT DX,AX
Команди роботи з прапорцями (признаками)
TEST AX,01100B
Команди керування HLT,WAIT
Команди завантаження сегментів LDS, LES
Текст учбової підпрограми на Асемблері
title date+ time
frame struc
savep dw ?
saveret dd ?
jdl dd ?
jdh dd ?
jcx dd ?
jal dd ?
jah dd ?
frame ends
code segment ‘code’
assume cs:code
eldati proc far
public eldati
push bp
mov bp, sp
push si
les si,[bp]. jah
mov ah, es:[si]
cmp ah, 02bh
je c2
cmp ah, 02dh
je c2
c1: int 21h
les si, [bp]. jal
mov es:[si], al
mov al, 0
mov es:[si+1], al
les si,[bp]. jcx
mov es:[si], cx
les si,[bp]. jdh
mov es:[si], dh
mov es:[si+1], al
les si,[bp]. jdl
mov es:[si], dl
mov es:[si+1], al
jmp c3
c2: les si,[bp]. jcx
mov cx,es:[si]
les si,[bp]. jdh
mov dh, es:[si]
les si,[bp]. jdl
mov dl,es:[si]
int 21h
les si,[bp]. jal
mov es:[si], al
mov al, 0
mov es:[si+1],al
c3: pop si
mov sp, bp
pop bp
ret 20
eldati endp
code ends
end