Ім'я файлу: Звіт ЗСМ №6.docx
Розширення: docx
Розмір: 109кб.
Дата: 09.11.2021
скачати

Міністерство освіти і науки України

Національний університет “Львівська політехніка”

Кафедра ЕОМ



Звіт

З лабораторної роботи №6

З дисципліни: «Засоби системного програмування»

На тему: «Використання макрокоманд та процедур.

Ввід даних з клавіатури та вивід результату на екран.»

Виконав: ст.гр. КІ-25

Хром’як І. Д.

Прийняв:

Асистент: Козак Н.Б.
Львів 2018

Мета: : набути навиків написання макрокоманд та процедур на Асемблері, освоїти способи передачі параметрів. Реалізувати ввід та вивід даних в десятковій системі числення.
Теоретичні відомості
Процедури та оператор CALL

Процедура – це частина програми, яка може бути описана в довільному місці і містити дії над довільними даними. Процедура починається директивою PROC та завершується директивою ENDP. Кодовий сегмент може містити будь-яку кількість процедур, що розділяються директивами PROC і ENDP. Типова організація багато процедурної програми приведена нижче. Виклик процедури здійснюється командою CALL. Для повернення з процедури використовується команда RET.



Рис.1.Виклик процедур.

Зверніть увагу на наступні особливості:

- директиви PROC по мітках B10 і C10 мають операнд NEAR для вказівки того, що ці процедури знаходяться в поточному кодовому сегменті. У багатьох випадках, цей операнд опускається, тому що за замовчуванням асемблер приймає тип NEAR.

- Кожна процедура має унікальне ім'я і містить власну директиву ENDP для вказівки кінця процедури.

- Для передачі керування в процедурі BEGIN маються дві команди: CALL B10 і CALL C10. У результаті першої команди CALL керування передається процедурі B10 і починається її виконання. Досягши команди RET, керування повертається на команду безпосередньо наступну за CALL B10. Друга команда CALL діє аналогічно - передає керування в процедуру C10, виконує її команди і повертає керування по команді RET.

- Команда RET завжди виконує повернення у вихідну програму. Програма BEGIN викликає процедури B10 і C10, що повертають керування назад у BEGIN. Для виконання самої програми BEGIN операційна система DOS викликає її, і наприкінці виконання команда RET повертає керування в DOS. Якщо процедура B10 не містить завершальної команди RET, то виконання команд продовжиться з B10 безпосередньо в процедурі C10. Якщо процедура C10 не містить команди RET, то будуть виконуватися команди, що йдуть за процедурою C10 з непередбаченим результатом.

Використання процедур дає гарну можливість організувати логічну структуру програми. Крім того, операнд для команди CALL можуть мати значення, що виходять за межу від -128 до +127 байт.

Технічно керування в процедуру типу NEAR може бути передане за допомогою команд переходу чи навіть звичайним порядковим кодуванням. Але в більшості випадків рекомендується використовувати команду CALL для передачі керування в процедуру і команду RET для повернення.

ЗАВДАННЯ:

1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу над даними, введеними в десятковій системі і результат виводить на екран в десятковій формі.

Програма повинна складатися з трьох основних підпрограм:

процедура вводу - забезпечує ввід даних з клавіатури в десятковій формі і їх перевід у двійкове значення ;

процедура безпосередніх обчислень – здійснює всі необхідні арифметичні дії у двійковій системі;

процедура виводу – забезпечує перевід війкового результату у десятковий формат та вивід на екран.

Передача параметрів може здійснюватися довільним чином. Кожна з перерахованих процедур може містити довільну кількість додаткових підпрограм.

Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу. К – константа, довжина якої визначається значенням(згідно варіанту).

2. Переконатися у правильності роботи кожної процедури зокрема та програми загалом.

3. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.

4. Дати відповідь на контрольні запитання.
Мій варіант: №21

21

X=A4/B2+C1*(D2 – E1+K)

21



Лістинг програми

DOSSEG

.MODEL SMALL
MY_MUL MACRO X,Y,Z

mov z,0

mov z+2,0

MOV AX,X

MUL Y

MOV Z,AX

MOV Z+2,DX

MOV AX,X+2

MUL Y

ADD Z+2,AX

mov ax,Z

mov dx,Z+2

ENDM
.STACK 100h

.DATA

K EQU 21h;обв'явлення змінних

A dw 0000h, 0000h

B dw 0000h

C db 00h

D dw 0000h

E db 00h

Temp1 dw 0000h;обв'явлення проміжних змінних

Temp2 dw 0000h

Temp3_high dw 0000h

Temp3_low dw 0000h

X dw 0000h, 0000h;обв'явлення результату
X_Str db 10 dup (0)

TempStr db 10 dup (0)

TempBin dw 0,0

MaxLen dw 0

X_div2 dw 0,0

Y_div2 dw 0
MESSG_X DB 13,10,'X = A(4)/B(2)+C(1)*(D(2) - E(1)+ K) K=33 (21h)','$'

MESSG_A DB 13,10,'A= ','$'

MESSG_B DB 13,10,'B= ','$'

MESSG_C DB 13,10,'C= ','$'

MESSG_D DB 13,10,'D= ','$'

MESSG_E DB 13,10,'E= ','$'
MESSG_X1 DB 13,10,'X= ','$'

erStr1 db 13,10,'Data not input_variable',13,10,'$'

erStr2 db 13,10,'Incorrectly data ',13,10,'$'

erStr2_1 db 13,10,' D =0 --> divide by zero ',13,10,'$'

erStr3 db 13,10,'Data is too long ',13,10,'$'
Mult10 dw 1,0

my_z dw 0,0
.CODE

start:

mov ax,@data

mov ds,ax
call input

call calculation

call output
mov ah,01

int 21h
mov ah,4Ch

int 21h


input proc

LEA DX,MESSG_X

MOV AH,09

INT 21H

LEA DX,MESSG_A

MOV AH,09

INT 21H

mov di,offset A

mov MaxLen,3

mov cx,MaxLen

call input_variable

LEA DX,MESSG_B

MOV AH,09

INT 21H

mov di,offset B

mov MaxLen,5

mov cx,MaxLen

call input_variable

cmp B,0

jne dali

mov ah,09

mov dx, offset erStr2_1

int 21h

mov ah,4Ch

int 21h

dali: LEA DX,MESSG_C

MOV AH,09

INT 21H

mov di,offset C

mov MaxLen,3

mov cx,MaxLen

call input_variable

LEA DX,MESSG_D

MOV AH,09

INT 21H

mov di,offset D

mov MaxLen,3

mov cx,MaxLen

call input_variable

LEA DX,MESSG_E

MOV AH,09

INT 21H

mov di,offset E

mov MaxLen,3

mov cx,MaxLen

call input_variable

ret

input endp
calculation proc

xor ax,ax

xor bx,bx

xor cx,cx

xor dx,dx
;Temp1 <- A4/B2 ;в цьому блоці виконуємо операцію ділення

mov dx,A+2

mov ax,A

div B

mov Temp1, ax ;записуємо частку в Temp1

;Temp2 <- D2 - E1 + K ; в цьому блоці виконуємо операцію додавання та віднімання

mov ax,0

mov ax, D

sub al, E

sbb ah, 0

add ax, K

mov Temp2, ax

;Temp3 <- C1*Temp2; в цьому блоці виконуємо операцію множення

mov ax,0

mov dx,0

mov al,C

mul Temp2

mov Temp3_high, dx

mov Temp3_low , ax

;X <- Temp1 + Temp3;в цьому блоці виконуємо операцію додавання

mov ax,0

mov dx,0

mov ax, Temp3_low

add ax, Temp1

mov dx, Temp3_high

adc dx, 0

mov X, ax

mov X+2, dx

ret
calculation endp

input_variable PROC

mov si,0

In_00: mov ah,01

int 21h

cmp al,0Dh

je In_1

In_0: mov dl,al

call CHECK_BYTE

mov TempStr[si],dl

inc si

loop In_00

In_1: push si

dec si

cmp cx,MaxLen

jne In_2

call Err1

In_2: mov bh,0

mov bl,TempStr[si]

MY_MUL Mult10,bx,my_z

add TempBin,ax

adc TempBin+2,dx

mov bh,0

mov bl,10

MY_MUL Mult10,bx,my_z

mov Mult10,ax

mov Mult10+2,dx

dec si

cmp si,0

jge In_2

mov ax, TempBin

mov dx,TempBin+2

pop si

cmp si,MaxLen

jl In_3

cmp MaxLen,10

jl In_2_1

js In_Err

cmp dx,0FFFFh

ja In_Err

jmp In_3

In_2_1: cmp MaxLen,5

jl In_2_2

cmp dx,00

ja In_Err

cmp ah,0ffh

ja In_Err

jmp In_3

In_2_2: cmp ax,00FFh

jbe In_3

In_Err: LEA DX,erSTR3

MOV AH,09

INT 21H

mov ah,4Ch

int 21h

In_3: mov [di],ax

mov [di+2],dx

mov TempBin,0

mov TempBin+2,0

mov Mult10,1

mov Mult10+2,0

RET

input_variable ENDP

Err1 PROC

PUBLIC Err1

LEA DX,erSTR1

MOV AH,09

INT 21H

mov ah,4Ch

int 21h
RET

Err1 ENDP
CHECK_BYTE PROC

PUBLIC CHECK_BYTE

sub dl,30h

cmp dl,00

jl ErS

cmp dl,0Ah

jl GO

ErS: LEA DX,erSTR2

MOV AH,09

INT 21H

mov ah,4Ch

int 21h

GO: RET
CHECK_BYTE ENDP

MY_DIV2 proc

sub cx,cx

sub bx,bx

mov dx,X_div2+2

mov ax,X_div2

M2_D1:

cmp dx,Y_div2

jb M2_D3

sub ax,Y_div2

sbb dx,00

add cx,01

adc bx,0

jmp M2_D1

M2_D3:

div Y_div2

add cx,ax

adc bx,00

ret

MY_DIV2 ENDP

output PROC

mov di,0

mov Y_div2,10

mov cx,X

mov bx,X+2

O_1: mov X_div2,cx

mov X_div2+2,bx

call my_div2

add dl,30h

mov X_Str[di],dl

inc di

cmp bx,0

ja O_1

cmp cx,10

jae O_1

add cl,30h

mov X_Str[di],cl

mov dx,offset MESSG_X1

mov ah,09

int 21h

O_2:

mov dl,X_Str[di]

mov ah,02h

int 21h

dec di

jge O_2

ret

output ENDP

end start



Рис.1. Результати виконання програми
Висновок: набув навичків написання макрокоманд та процедур на Асемблері, освоїв способи передачі параметрів. Реалізував ввід та вивід даних в десятковій системі числення.
скачати

© Усі права захищені
написати до нас