Смекни!
smekni.com

Робота з записами мови ассемблера (стр. 2 из 2)

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->>',&bsol;

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