Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер оформление.doc
Скачиваний:
6
Добавлен:
26.08.2019
Размер:
399.87 Кб
Скачать

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, знання про структуру мови та її синтаксису. Програми, розроблені в ході виконання даної курсової роботи, характеризуються малим розміром виконуваного файлу, працюють безпосередньо з апаратним забезпеченням ПК.

В даній курсовій роботі були реалізовані дві програми: одна для обчислення функції з вводом та виводом даних у таблицю та на дисплей і перевіркою діапазону вхідних даних, друга – сумує цифри у рядку, якщо вони присутні.

Так як основні дії були поділені на модулі, були значно спрощені модифікація та налагодження програми.

ПЕРЕЛІК ЛІТЕРАТУРИ

  1. Юров В.И. «Assembler: учебный курс». – СПб: Питер, 2008.

  2. Голубь Н.Г. «Искусство программирования на ассемблере». – СПб: Питер, 2006.

  3. Абель П.”Язык Ассемблер для IBM РС и программирование”.

  4. Нортон П.”Язык Ассемблера для 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]