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