МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
Кафедра "Обчислювальної техніки та програмування"
АЛЬБОМ ДОКУМЕНТІВ
до курсового проекту з курсу
“Системне програмування”
Тема: “ Робота з записами мови ассемблера ”
Харків
2005
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
Кафедра"Обчислювальної техніки та програмування"
Затверджую
__________________________
_________________/ /
“___” ________________2005 р.
Робота з записами мови ассемблера
Специфікація
Лист затвердження
xxxxxxxxxxxxxx
Виконав
ст. гр xxxx
xxxxxxxxxxxxxxx
“___” ________________2005 р.
Перевірив
xxxxxx.
“___” ________________2005 р.
Харків
2005
ЗАТВЕРДЖЕНО
xxxxxxxxxxxx
Робота з записами мови ассемблера
Специфікація
xxxxxxxxxxxxxxxx
Код
|
Найменування
|
Примітки
|
xxxxxx
|
Специфікація
|
|
xxxxxx
|
Опис пргограми
|
|
xxxxxxx
|
Текст програми
|
Харків
2005
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
Кафедра"Обчислювальної техніки та програмування"
Затверджую
__________________________
_________________/ /
“___” ________________2005 р.
Робота з записами мови ассемблера
Опис програми
Лист затвердження
xxxxxxxxxxxxx
Виконав
ст. гр xxxxxx
xxxxxxxx.
“___” ________________2005 р.
Перевірив
xxxxxxxxx.
“___” ________________2005 р.
Харків
2005
ЗАТВЕРДЖЕНО
xxxxxxxxxxx
Робота з записами мови ассемблера
Опис програми
xxxxxxxxxxx
Харків
2005
Зміст
Вступ
Загальні відомості
Функціональне призначення
Опис логічної структури
Використовувані технічні засоби
Виклик і завантаження
Вхідні дані
Вихідні дані
Висновки
Література
Вступ
Запис — структурний тип даних, що складається з фіксованого числа елементів завдовжки від одного до декількох біт.
При описі запису для кожного елементу вказується його довжина в бітах і, що необов'язкове, деяке значення. 8, 16 або 32 біт.
Якщо сумарний розмір запису менше вказаних значень, то всі поля запису “притискаються” до молодших розрядів.
Використовування записів в програмі, так само, як і структур, організовується в три етапи:
Задання шаблона запису
, тобто визначення набору бітових полів, їх довжин і, при необхідності, ініціалізація полів.
Визначення
екз
емпляр
у
запис
у
. Так само, як і для структур, цей етап має на увазі ініціалізацію конкретної змінної типом наперед визначеної за допомогою шаблона запису.
Орган
і
зац
і
я
звертання
до
элемент
ів
запис
у
.
Компілятор TASM, крім стандартних засобів обробки записів, підтримує також і деякі додаткові можливості
їх обробки.
Опис запису
Опис шаблона запису має наступний синтаксис (мал. 6):
Имя_записи RECORD <описание элементов>
Тут: <описание элементов> є послідовністю описів окремих елементів запису згідно синтаксичній діаграмі (див. мал. 6):
Мал.1. Синтаксис опису шаблона запису
При описі шаблона пам'ять не виділяється, оскільки це всього лише інформація для транслятора асемблера про структуру запису. Так само, як і для структур, місцеположення шаблона в програмі може бути будь-ким, але при цьому необхідно враховувати логіку роботи однопрохідного транслятора.
Визначення екземпляру запису
Для використовування шаблона запису в програмі необхідно визначити змінну з типом даного запису, для чого застосовується наступна синтаксична конструкція (мал. 7):
Мал.2. Синтаксис опису екземпляру запису
Аналізуючи цю синтаксичну діаграму, можна зробити висновок, що ініціалізація елементів запису здійснюється достатньо гнучко. Розглянемо декілька варіантів ініціалізації.
Якщо ініціалізувати поля не потрібен, то достатньо вказати ? при визначенні екземпляру запису:
...
iotest record
i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
...
flag iotest ?
Якщо ви складете і дослідите у відладчику тестовий приклад з даним визначенням запису, то побачите, що всі поля змінної типу запис flag обнуляються. Це відбувається не дивлячись на те, що у визначенні запису задані початкові значення полів.
Якщо потрібна часткова ініціалізація елементів, то вони полягають в кутові
(< і >) або фігурні
({ і }) дужки. Відмінність тут в тому, що в кутових дужках елементи повинні бути задані в тому ж порядку, що і у визначенні запису. Якщо значення деякого елементу спывпадає з початковим, то його можна не вказувати, але обов'язково позначити його комі. Для останніх елементів коми, що йдуть підряд, можна опустити.
Наприклад, згодитися із значеннями за умовчанням можна так:
iotest record
i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
...
flag iotest <> ;согласились со значением по умолчанию
Змінити значення поля i2 можна так:
iotest record
i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
...
flag iotest <,10,> ; перевизначили i2
Застосовуючи фігурні дужки, також можна вказати вибіркову ініціалізацію полів,але при цьому необов'язково позачити комами поля, із значеннями за умовчанням яких ми згодні:
iotest record
i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
...
flag iotest {i2=10} ; переопределили i2, не обращая внимания на порядок;следования других компонентов записи
1.Загальні відомості
Проект написан на мові TASM, реалізовано у трьох файлах:
main.asm, defs.inc, funcs.inc, record.inc. Під час компіляції усі файли об’єднуються в один.
Для своєї роботи проект може використовувати операційні системи MS Dos версії 1.0, або вище, а також операційні системи
MS WINDOWS 95/98/Me/2000/XP. Не виключається робота проекту під усіма іншими операційними системами, що якимсь чином можуть емулювати сеанси роботи під операційною системою MS DOS.
2. Функціональне призначення
Проект може слугувати в якості навчального посібника для розуміння роботи записів та в якості прикладу одного з варіантів, такого як створення масиву, добавлення елемента, видалення елемента, змінення поля, очищення поля. Також у проекті можна наглядно побачити ввод з клавіатури і вивід результатів на екран.
Програма написана на мові ассемблера з використовуванням процедур.
Функціональне обмеження програми є те, що вона може бути реалізована тільки у файлі з розширенням COM, якщо розширення буде EXE програма працювати не буде. Більше функціональних обмежень немає.
3. Опис логічної структури
|
ні
так
4.Використовувані технічні записи
Проект має нормально працювати на комп’ютерах IBM PC із процесорами і8086, або більш старших моделях. Програма потребує оперативної пам’яті не більше 6 Кб, до цього треба додати пам’ять, яку займає операційна система MS DOS чи WINDOWS. Потрібен також відеоадаптер VGA, для організації діалогу з користувачем. При написанні проекту використовувався комп’ютер з процесором AMD Athlon XP 1700+, оперативною пам’ятю 256 Мб та операційною системою Windows XP у середовищі TASM.
5. Виклик і завантаження
Основним є файл main.com з його допомогою працює проект. Запускається він з будь-якого носія. Перед користувачем на синьому фоні з’являється меню, в якому він спочатку може виконати наступні дії, за допомогою функціональних клавіш: F2 - створити масив, або F10 – залишити програму.
Далі, користувачеві пропонується додати елемент, клавішею F3, або залишити програму. При додаванні елемента, пропонується ввести прізвищє, вік, місто. Потім, користувач може додати новий елемент, змінити елемент, видалити його, а також переміщуватись серед елементів, і звичайно вийти з програми.
6. Вхідні дані
Вхідними даними програми компілятора є файли main.asm, defs.inc, funcs.inc, record.inc, що розташовані в одному каталозі. Зкомпільований виконуючий файл main.com запускається і користувач працює з інформацією.
7.Вихідні дані
Вихідні дані програми з’являються на дисплеї в ході роботи програми.
Вихідними даними програми проекту є створення масиву, додавання елемента, видалення елемента, зміна поля та очистка поля.
Висновки
У ході розробки курсового проекту були вивчені навички роботи з записами мови ассемблера, зокрема, створення масивів записів, доступу до них, створення в них записів, з можливістю управління елементами і очищення поля. Розроблена програма дозволяє ввести з клавіатури запис, представлений у вигляді прізвища, імені, по батькові, назва міста і дати народження, а потім за допомогою функціональних клавіш дозволяючих:
-додати запис;
-видалити запис;
-змінити поле;
-очистити поле.
Література
1. Финагенов К.Г. “Основы системного программирования” изд.”Радио
и Связь”2001 год.
2. Питер Абель “Ассемблер- язык и программирование для IBM PC”
изд. Киев “HTИ” 2003 год.
3. Зубков С.В.”Ассемблер для DOS,WINDOWS И UNIX ” Москва 2004г.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
Кафедра"Обчислюва
Затверджую
__________________________
_________________/ /
“___” ________________2005 р.
Робота з записами мови ассемблера
Текст програми
Лист затвердження
xxxxxxxxxxxx
Виконав
ст. гр xxxxxx
xxxxxxx
“___” ________________2005 р.
Перевірив
xxxxxxxxxx.
“___” ________________2005 р.
Харків
2005
ЗАТВЕРДЖЕНО
xxxxxxxxxxxx
Робота з записами мови ассемблера
Текст програми
xxxxxxxxx – 12 00-01
Харків
2005
РАЗРАБОТКА ТЕКСТА ПРОГРАММЫ
Главная программа:
LOCALS
include defs.inc
.model tiny
.386
.387
.code
org 100h
start:
call clrscr ;очитска экрана
mov al,17h
mov bx,0000h
mov cx,80*25
call settextattr ;установка атрибутов текста
mov ax,0016h
call gotoxy
lea dx,title1
call writestring ;вывод заголовка
mov ax,0100h
call gotoxy
lea dx,separ
call writestring ;вывод разделителя
mov ax,1700h
call gotoxy
lea dx,separ
call writestring
call main ;вызов главной финкции
call clrscr
ret
main proc near
call writemenu ;вывод меню
cmp proglevel,3
jne @@l1
call viewel ;вывод текущего элемента
@@l1:
mov ax,1900h
call gotoxy
xor ax,ax
int 16h ;ожидание и чтение сканкода нажатой клавиши
cmp ah,sF10
je @@exit1
cmp proglevel,1
jne @@l2
call keyb1lvl
jmp main
@@l2:
cmp proglevel,2
jne @@l3
call keyb2lvl
jmp main
@@l3:
call keyb3lvl
jmp main
@@exit1:
ret
main endp
writemenu proc near ;вывод меню
push ax dx si
mov ax,1800h
call gotoxy
lea dx,clr
call writestring
mov ax,1800h
call gotoxy
xor ax,ax
mov al,proglevel
dec al
shl ax,1
lea si,menux
add si,ax
mov dx,[si]
call writestring
pop si dx ax
ret
writemenu endp
keyb1lvl proc near
cmp ah,sF2
jne @@ex1
mov proglevel,2
@@ex1:
ret
keyb1lvl endp
keyb2lvl proc near
cmp ah,sF3
jne @@ex1
mov ax,0
call input_record
mov proglevel,3
mov curitem,1
mov itemscnt,1
@@ex1:
ret
keyb2lvl endp
keyb3lvl proc near
cmp ah,sF3
jne @@l1
mov ax,itemscnt
call input_record
inc itemscnt
jmp @@ex1
@@l1:
cmp ah,sF6
jne @@l2
cmp curitem,1
je @@ex1
dec curitem
jmp @@ex1
@@l2:
cmp ah,sF7
jne @@l3
push ax
mov ax,curitem
cmp ax,itemscnt
je @@ll2
inc curitem
@@ll2:
pop ax
jmp @@ex1
@@l3:
cmp ah,sF4
jne @@l4
mov ax,curitem
dec ax
call input_record
jmp @@ex1
@@l4:
cmp ah,sF8
jne @@l5
pusha
mov ax,curitem
dec ax
xor dx,dx
mov bl,size STUD
mul bl
add ax,offset mas
mov di,ax
mov si,ax
add si,size STUD
mov ax,itemscnt
sub ax,curitem
xor dx,dx
mul bl
mov cx,ax
rep movsb
mov ax,curitem
cmp ax,itemscnt
jne @@ll4
dec curitem
@@ll4:
dec itemscnt
cmp itemscnt,0
jne @@lll4
mov proglevel,2
call clrworkfield
@@lll4:
popa
jmp @@ex1
@@l5:
@@ex1:
ret
keyb3lvl endp
include funcs.inc
include record.inc
proglevel db 1 ; 1 - массива еще нет
; 2 - создан пустой массив
; 3 - есть не пустой массив
title1 db 'Работа с записями языка ассемблера',0
data1 db 'Элемент ',0
data2 db ' из ',0
inpName db ' Имя : ',0
inpAge db ' Возраст: ',0
inpCity db ' Город : ',0
separ db 80 dup (196),0
clr db 79 dup (' '),0
menux dw offset menu1,offset menu2,offset menu3
menu1 db ' F2 - Создание массива F10 - Выход',0
menu2 db ' F3 - Добавление элемента F10 - Выход',0
menu3 db ' F3-Добав. эл. F4-Изм. эл. F6-<< F7->>',
F8-Удал. эл. F10-Выход',0
АП 02093
curitem dw 1
itemscnt dw 0
mas: ;начало массива записей
end start
Ввод записи с клавиатуры:
input_record proc near ;ввод записи с клавиатуры
pusha
push ax
call clrworkfield
mov ax,0500h
call gotoxy
lea dx,inpName
call writestring
lea dx,TMP.SName
mov al,20
call readstring
mov ax,0600h
call gotoxy
lea dx,inpAge
call writestring
call readword
mov TMP.SAge,ax
mov ax,0700h
call gotoxy
lea dx,inpCity
call writestring
lea dx,TMP.SCity
mov al,20
call readstring
xor dx,dx
mov ax, size STUD
mov cx,ax
pop bx
mul bx
add ax,offset mas
mov di,ax
lea si,TMP
rep movsb
popa
ret
TMP STUD <>
input_record endp
viewel proc near ; вывод записи на экран
pusha
mov ax,curitem
dec ax
xor dx,dx
mov bl,size STUD
mul bl
add ax,offset mas
mov si,ax
call clrworkfield
cmp itemscnt,0
je @@ex2
mov ax,0500h
call gotoxy
lea dx,inpName
call writestring
lea dx,[si].SName
call writestring
mov ax,0600h
call gotoxy
lea dx,inpAge
call writestring
mov ax,[si].SAge
call writeword
mov ax,0700h
call gotoxy
lea dx,inpCity
call writestring
lea dx,[si].SCity
call writestring
@@ex2:
mov ax,1600h
call gotoxy
lea dx,data1
call writestring
mov ax,curitem
call writeword
lea dx,data2
call writestring
mov ax,itemscnt
call writeword
@@ex1:
mov ax,1900h
call gotoxy
popa
ret
viewel endp
memzero proc near ;Обнуление памяти
;DS:DX->Mem
;CX=SIZE
push ax cx di es
xor ax,ax
mov di,dx
push ds
pop es
cld
rep stosb
pop es di cx ax
ret
memzero endp
readstring proc near ;Чтение строки с клавиатуры
;DS:DX->буффер
;AL=макс. кол-во символов
push ax dx
xor cx,cx
mov cl,al
call memzero
mov @@buf,al
mov ah,0Ah
lea dx,@@buf
int 21h
lea si,@@buf
inc si
xor cx,cx
mov cl,[si]
inc si
pop di
push dx
rep movsb
pop dx ax
ret
@@buf db 0, 60 dup (?)
readstring endp
readword proc near ;Чтение числа с клавиатуры
push bx dx si
lea dx,@@tmps
mov al,3
call readstring
xor ax,ax
lea si,@@tmps
cmp byte ptr [si+1],0
jne @@l2
mov al,[si]
xor bx,bx
jmp @@l1
@@l2:
mov al,[si]
cmp al,'0'
jb @@ex1
cmp al,'9'
ja @@ex1
sub al,'0'
mov bl,10
mul bl
mov bx,ax
mov al,[si+1]
@@l1:
cmp al,'0'
jb @@ex1
cmp al,'9'
ja @@ex1
sub al,'0'
add ax,bx
jmp @@ex2
@@ex1:
xor ax,ax
@@ex2:
pop si dx bx
ret
@@tmps db 3 dup (?)
readword endp
writestring proc near ;Вывод строки на экран
;DS:DX->STR
push ax si
mov si,dx
cld
@@l1:
lodsb
test al,al
jz @@l2
push si
mov ah,0Eh
int 10h
pop si
jmp @@l1
@@l2:
pop si ax
ret
writestring endp
writeword proc near ;Вывод числа на экран
;EAX=WORD
pusha
cmp ax,0
jne @@ll1
mov ax,0E30h
int 10h
popa
ret
@@ll1:
lea dx,@@res_str
mov cx,20
call memzero
mov @@value,eax
fild @@value ;загрузка числа в сопроцессор
fbstp @@bcd_value ;выгрузка из сопроцессора в память
;в BCD формате (двоично-десятичный)
mov si,offset @@bcd_value+10-1
lea di,@@res_str
std
@@l1:
lodsb
test al,al
jz @@l1
push ax
shr al,4
test al,al
jz @@l3
add al,'0'
mov [di],al
inc di
@@l3:
pop ax
and al,0Fh
add al,'0'
mov [di],al
inc di
cmp si,offset @@bcd_value
jb @@l2
jmp @@l1
@@l2:
lea dx,@@res_str
call writestring
popa
ret
@@value dd 0
@@bcd_value dt 0
@@res_str db 20 dup (0)
writeword endp
gotoxy proc near ;Установить позицию курсора
;AH=Y AL=X
push ax bx dx
mov dx,ax
xor bh,bh
mov ah,2
int 10h
pop dx bx ax
ret
gotoxy endp
clrscr proc near ;Очитска экрана
push ax
mov ax,0003
int 10h
pop ax
ret
clrscr endp
settextattr proc near ;установка атрибутов текста
;AL=атрибут
;BL=X BH=Y - начальная позиция
;CX - количество знакомест
push ax bx cx di es
mov dl,80*2
push ax
xor ax,ax
mov al,bh
mul dl
xor dx,dx
mov dl,bl
shl dx,1
add ax,dx
mov di,ax
inc di
pop ax
mov dx,0B800h
push dx
pop es
@@l1:
stosb
inc di
loop @@l1
pop es di cx bx ax
ret
settextattr endp
clrworkfield proc near ; очитска рабочей части экрана
push ax cx dx
mov ax,0500h
lea dx,clr
mov cx,3
@@l1:
call gotoxy
call writestring
inc ah
loop @@l1
mov ax,1600h
call gotoxy
lea dx,clr
call writestring
pop dx cx ax
ret
clrworkfield endp.
sF2 equ 3Ch
sF3 equ 3Dh
sF4 equ 3Eh
sF5 equ 3Fh
sF6 equ 40h
sF7 equ 41h
sF8 equ 42h
sF9 equ 43h
sF10 equ 44h
STUD STRUC
SName db 20 dup (' ')
SAge dw 0
SCity db 20 dup (' ')
STUD ends