
- •1 Завдання курсової роботи
- •1.1 Варіант завдання
- •2 Арифметика
- •2.1 Розробка програми
- •2.2 Контрольний приклад
- •3 Обробка рядків
- •3.1 Операції з рядками
- •3.2 Контрольний приклад:
- •In the course of this work is carried out development programs in assembler. There are two programs under the order of the course work.
2.2 Контрольний приклад
3 Обробка рядків
3.1 Операції з рядками
При початку роботи програми з’являється звертання, яке сповіщає про введення рядка. Введені рядки записуються у масиви байтів. Це виконується у циклах, допоки користувач не натисне Enter. Ввід виконується кожного символу за допомогою функції 01h переривання 21h:
message str1
newline
mov si,0
z0:
cmp si,255
je z1
mov ah,01h ; ввід символів з ехо-супроводженням
int 21h;
cmp al,13;
je z1
mov dest1[si],al
inc si
jmp z0;
z1:
newline
mov len1,si
Передача управління DOS виконується за допомогою функції 4C переривання 21.
Код головного модулю наведено у додатку D.
У модулі, що наведено у додатку Е, за допомогою циклу виводиться сума цифр які були введені у рядку.
@111:lea dx,res1
mov ah,9
int 21h
newline
jmp @1
@1:
mov ax,len2
cmp si,ax
ja @ext
xor ax,ax
mov dl,dest1[si-1]
mov ah,02h
int 21h
add si,1
jmp @1
@222:lea dx,res2
mov
ah,9
int 21h
newline
jmp @2
@2:
mov ax,len1
cmp si,ax
ja @ext
xor ax,ax
mov dl,dest2[si-1]
mov ah,02h
int 21h
add si,1
jmp @2
@3:lea dx,rav
mov ah,9
int 21h
jmp @ext
3.2 Контрольний приклад:
ВИСНОВОК
Були практично закріплені отримані навички роботи з TASM, знання про структуру мови та її синтаксису. Програми, розроблені в ході виконання даної курсової роботи, характеризуються малим розміром виконуваного файлу, працюють безпосередньо з апаратним забезпеченням ПК.
В даній курсовій роботі були реалізовані дві програми: одна для обчислення функції з вводом та виводом даних у таблицю та на дисплей і перевіркою діапазону вхідних даних, друга – сумує цифри у рядку, якщо вони присутні.
Так як основні дії були поділені на модулі, були значно спрощені модифікація та налагодження програми.
ПЕРЕЛІК ЛІТЕРАТУРИ
Юров В.И. «Assembler: учебный курс». – СПб: Питер, 2008.
Голубь Н.Г. «Искусство программирования на ассемблере». – СПб: Питер, 2006.
Абель П.”Язык Ассемблер для IBM РС и программирование”.
Нортон П.”Язык Ассемблера для IBM PC”.
ДОДАТОК А
extrn calc:far ;функція обчислення з другого модуля
public tabl_a
public tabl_b
public
tabl_res
public i
include macro.lib
sseg segment stack 'stack' ; сегмент стеку
db 32 dup ('stack') ; резервування місця у пам’яті
sseg ends
dseg segment public ; сегмент даних
tabl_a dw 3 dup(?) ; масив з 3 елементів
tabl_b dw 3 dup(?)
tabl_res dw 3 dup(?)
i dw (?)
promt db ‘Please, input A and B','$'
dseg ends
cseg segment ; сегмент коду
begin proc far ; вхід програми
assume cs:cseg, ds:dseg, ss:sseg ; зв’язок сегментів з регістрами
mov ax,dseg ; ініціалізація регістра DS
mov ds, ax
mov i,0
cikl_en: ;цикл вводу трьох параметрів а та b
cmp i,6 ;перевірка умови закінчання циклу вводу
jge drr
mov
si,i ; лічильник i
call get_n ; викликання процедури вводу числа
call calc ; викликання процедури обчислення вирaзу
add i, 2
jmp cikl_en
drr:
xor si,si
message promt4
newline
cikl_vi: ; цикл виводу таблиць
mov ax,tabl_a[si]
print_number
mov ax,tabl_b[si]
print_number
mov ax,tabl_res[si]
print_number
newline
add si, 2
cmp si,6 ; перевірка умови закінчення циклу вивода
je @ext
jmp cikl_vi
@ext: mov ah,4ch
int 21h
ret ; вихід з процедури
begin endp ; кінець процедури
get_n proc near ; опис процедури вводу чисел
cls
home
crlf
@again:
message promt
crlf
clc ; скидання CF
key_$2bin ; зчитування першого числа в ax
jno @2 ;при перетворюванні було переповнення -> @bad
jmp @bad
@2: mov tabl_a[si],ax ; зберігаєм зчитане число
crlf
message promt2 ; аналогічне для числа b
crlf
clc
key_$2bin
jo @bad
mov tabl_b[si],ax
crlf
;далее - контроль деления на ноль
cmp tabl_a[si], ax ; перевірка a > b
jg agb
jl alb
jmp @ex
agb:
mov cx, tabl_a[si] ; якщо a>b, то а!=0
jmp @next
alb:
mov cx,tabl_b[si] ; якщо b>a,то b!=0
@next:
cmp cx, 0 ;якщо призводиться до ділення на нуль, ввід знов ->@again
jne @ex
@bad: newline
message promt3
newline
jmp @again
@ex:
ret
get_n endp ; кінець процедури
cseg ends ; кінець сегменту кода
end begin ; вихід програми
ДОДАТОК В
extrn
tabl_b:word
extrn tabl_a:word
extrn tabl_res:word
extrn i
cseg segment ; сегмент коду
calc proc far ; вхід програми у процедуру
assume cs:cseg ; зв’язок сегментів з регістрами
public calc
push ax ; запам’ятовування значень регістрів
push bx
push dx
push si
mov si,i
mov ax, tabl_a[si] ; запис першого даного у регістр ax
mov bx,tabl_b[si] ; запис другого даного у регістр bx
cmp ax, bx ; порівняння даних
JG @m1 ; 1-е більше => мітку @m1
JL @m2 ; 2-е більше => мітку @m2
mov ax, 43 ; рівні => мітку @m3
jmp @m3
@m1: mov ax, tabl_b[si]
cwd
mov cx, tabl_a[si]
idiv cx ; частка у ax
jmp @m3 ; => мітку @m3
@m2: mov ax, tabl_a[si]
mov cx, tabl_a[si]
imul cx ; перемножування даних, результат в ax
mov cx, tabl_a[si]
imul cx
imul ax, tabl_b[si] ; ділення на b
cwd ; ділимо те, що отримали, на друге дане
mov cx, tabl_b[si]
idiv cx ; частка в ax
jmp @m3
@m3: mov tabl_res[si], ax ; запис результата у змінну
pop
si
pop dx
pop bx
pop ax
ret ; вихід з процедури
calc endp ; кінець процедури
cseg ends ; кінець сегменту кода
end calc ; вихід з програми
ДОДАТОК C
ДОДАТОК D
extrn count:far
public dest1,dest2,len1,len2,rav,res1,res2
stack1 segment stack 'stack'
db 30 dup ('stack')
stack1
ends
dseg segment
dest1 db 255 dup (?)
dest2 db 255 dup (?)
len1 dw 0
len2 dw 0
str1 db 'Please input the string $'
rav db ‘Result is $'
dseg ends
include macro.lib
cseg segment
assume cs: cseg, ds: dseg, ss: stack1
start:
mov ax, dseg
mov ds, ax
message str1
newline
mov si,0
z0:
cmp si,255
je z1
mov ah,01h ; ввід символів з ехо-супроводженням
int 21h;
cmp al,13;
je z1
mov dest1[si],al
inc si
jmp z0;
z1:
newline
mov len1,si
message str2
newline
mov si,0
z2:
cmp si,255
je z3
mov ah,01h
int 21h;
cmp al,13;
je z3
mov dest2[si],al
inc si
jmp z2;
z3:
newline
mov len2,si
call count;
mov ax,4c00h ; Вихід
int 21h
cseg ends
end start
ДОДАТОК E
extrn dest1: byte
extrn len1:word
extrn dest2: byte
extrn len2:word
extrn rav:byte
extrn res1:byte
extrn res2:byte
public count
include
macro.lib
code segment
count proc far
assume cs:code
mov si,1
@111:lea dx,res1
mov ah,9
int 21h
newline
jmp @1
@1:
mov ax,len2
cmp si,ax
ja @ext
xor ax,ax
mov dl,dest1[si-1]
mov ah,02h
int 21h
add si,1
jmp @1
@222:lea dx,res2
mov ah,9
int 21h
newline
jmp @2
@2:
mov
ax,len1
cmp si,ax
ja @ext
xor ax,ax
mov dl,dest2[si-1]
mov ah,02h
int 21h
add si,1
jmp @2
@3:lea dx,rav
mov ah,9
int 21h
jmp @ext
@ext:
ret
count endp
code ends
end
ДОДАТОК F
АННОТАЦИЯ
В данной курсовой работе выполняется разработка программ на языке ассемблера. Разрабатываются две программы согласно заданию курсовой работы.
Первая программа выполняет ввод числовых данных, арифметико-логические операции с этими данными и вывод результата пользователю на экран. Ниже приведена формула, по которой выполняются вычисления:
2*a / b + 1, якщо a>b
Y = -445, якщо a=b
(b+5)/a, якщо a<b
Вторая часть курсовой работы представляет собой разработку программу, в которой выполняется суммирование чисел в строке, если они там есть, их обработка и вывод результата на экран.
ABSTRACT