Опрацювання потокових даних засобами Мови Асемблер

Автор: Пользователь скрыл имя, 26 Апреля 2012 в 23:49, контрольная работа

Описание работы

Мета: Ознайомитися та засвоїти особливості роботи з потоками вводу/виводу та

написання програм для опрацювання потокових даних.

Работа содержит 1 файл

Розрах_my.docx

— 258.11 Кб (Скачать)

Вихід:

CF=1 і АХ = 0100h, якщо операція виконана

CF=1 і АХ = 0Fh, якщо зазначено неіснуючий  диск

Зауваження: Після виконання у  буфері за адресою DS:SI розміститься у  формі

ASCIIZ шлях поточної директорії, що  визначений для диска, який  зазначено в DL. Шлях

повертається у форматі: "шлях\назва_директорії",0. Не підставляється спереду буква

диска, а позаду не підставляється символ ‘\’. Наприклад, якщо поточною директорією є

коренева директорія, то ця функція  поверне порожній рядок (DS:[SI] = 0).

 

 

 

 

 

 

 

 

 

 

ЗАВДАННЯ

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

операндами отриманими в заданих варіантом місцях.

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

головний модуль – містить спільний сегмент стеку, необхідні дані та виклик

основних процедур;

модуль потокового вводу - забезпечує ввід даних з потоку (файл, клавіатура) в

десятковій формі;

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

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

десятковій формі.

Всі модулі повинні бути в різних файлах і об’єднуватися в єдину  програму на етапі

лінкування. Передача параметрів має здійснюватися через стек.

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

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

тестових даних та кінцевого  результату отриманого в результаті виконання програми.

Привести текст всіх програмних модулів.

4. Дати відповідь на контрольні  запитання

X=A4/B2-C1*(D1+E2-K)

A,B,C,D- з файлу

E, F – з клавіатури

 

 

 

Алгоритм для модуля input.asmБлок – схема алгоритму перетворення шістнадцяткового значення у

ASCII – код

 

 

 

 

 

 

 

 

 

Алгоритм для модуля output.asm

Блок – схема алгоритму  перетворення шістнадцяткового значення в десяткове

 

 

 

Результат виконання

Файл з вхідними даними

 

Файл з вихідними даними

Додатки

Main.asm

DOSSEG

EXTRN    Input :FAR, Calculation :FAR, Output :FAR

PUBLIC   erFlag

STACKSG         SEGMENT PARA STACK 'Stack'

DW      127 DUP(0)

STACKSG         ENDS

DATASG  SEGMENT PARA PUBLIC 'Data'

          erFlag  DB      0

DATASG  ENDS

CODESG  SEGMENT PARA PUBLIC 'Code'

main:

ASSUME  CS:CODESG,DS:DATASG,SS:STACKSG

MOV     AX,DATASG

MOV     DS,AX

 

CALL    Input

cmp erFlag,0

jne A30   

CALL    Calculation   

cmp erFlag,0

jne A30   

CALL    Output

cmp erFlag,0

jne A30   

A30:

        mov ah,4Ch

int 21h

CODESG  ENDS

END   main

Input.asm

DOSSEG

EXTRN    erFlag:BYTE

PUBLIC A,B,C,D,E

 

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 

 

DATASG  SEGMENT PARA PUBLIC 'Data'

 

K dw 717h

A dw 00h

B db 00h

C db 00h

D db 00h

E dw 00h

X dw 00h,00h

buf db 0h

mark db 00h

bf dw 0h

ifname db 'in.txt',0

 

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=A2/B1-C1*(D1+E2-K)   K=1815 (717h)','$'

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_F  DB     13,10,'F= ','$'

 

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

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

erStr2_1  db  13,10,' B =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

 

DATASG  ENDS

 

CODESG  SEGMENT PARA PUBLIC 'CODE'

ASSUME  DS:DATASG, CS:CODESG

 

 

input proc  FAR

public Input

 

mov ah,3Dh

mov al,00h

mov dx,offset ifname

mov cx,0

int 21h

mov bf,ax

 

 

 

 

LEA     DX,MESSG_X   

MOV     AH,09

INT     21H 

LEA     DX,MESSG_A  

MOV     AH,09

INT     21H 

mov di,offset A

mov MaxLen,5

mov cx,MaxLen

call input_variable

 

LEA     DX,MESSG_B   

MOV     AH,09

INT     21H 

mov di,offset B

mov MaxLen,3

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,5

mov cx,MaxLen

mov mark,1

call input_variable

mov mark,0

ret

input endp

 

input_variable PROC

mov si,0    

In_00: call input_file

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

 

input_file PROC

cmp mark,1

je mark2

Mark1:mov ah,01

int 21h

jmp mark3

Mark2:

 

push cx

mov ah,3Fh

mov bx,bf

mov cx,1

mov dx, offset buf

int 21h

mov al,buf

pop cx

cmp al,20h

je mark2

 

Mark3:

 

ret

input_file 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

 

CODESG  ENDS

END 

Calc.asm

DOSSEG

 

EXTRN   A:BYTE,B:BYTE,C:WORD,D:BYTE,E:BYTE

PUBLIC  X;,MESSG_Sign

 

 

DATASG  SEGMENT PARA PUBLIC 'Data'

 

K dw 717h

Temp1 dw 00h

Temp2 dw 00h

Temp3 dw 00h

Temp4 dw 00h

X dw 00h,00h

 

DATASG  ENDS

 

CODESG  SEGMENT PARA PUBLIC 'CODE'

ASSUME  DS:DATASG, CS:CODESG

MOV     AX,DATASG

MOV     DS,AX

 

calculation proc Far

public calculation

xor ax,ax

xor bx,bx

xor cx,cx

xor dx,dx

 

mov ax, word ptr[A]

mov dh,00

mov dl, byte ptr [B]

div dl

mov word ptr[Temp1], ax

 

mov ax, word ptr [E]

mov dh, 00

mov dl, byte ptr [D]

add ax,dx

adc ah,00

mov word ptr [Temp2], ax

 

mov dx, word ptr [K]

sub ax,dx

mov word ptr [Temp3], ax

 

mov dl, byte ptr [C]

mov dh, 00

mul dx

mov word ptr [Temp4], ax

 

mov ax, word ptr[Temp1]

mov dx, word ptr [Temp4]

sub ax,dx

mov word ptr [X], ax

 

ret

calculation endp

 

CODESG  ENDS

END 

Output.asm

DOSSEG

EXTRN  X:WORD;, MESSG_Sign :BYTE

 

DATASG  SEGMENT PARA PUBLIC 'Data'

K dw 717h

 

 

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

ofname db 'out.txt',0

bff dw 0h

X_Str2    db     10 dup (0),0

MESSG_X  DB     13,10,'X=A2/B1-C1*(D1+E2-K)   К=1815 (717h)','$'

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_F  DB     13,10,'F= ','$'

 

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

 

DATASG  ENDS

CODESG  SEGMENT PARA PUBLIC 'CODE'

ASSUME  DS:DATASG, CS:CODESG

MOV     AX,DATASG

MOV     DS,AX

output PROC FAR

Public output

 

mov ah,3Ch

mov cx,0

mov dx,offset ofname

int 21h

mov bff,ax

 

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

 

mov di,9

mov si,0

mov cx,9

markk:

mov al,X_Str[si]

mov X_Str2[di],al

inc si

dec di

loop markk

 

mov ah,40h

mov bx,bff

mov cx,10

mov dx,offset X_Str2

int 21h

 

ret

output 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

 

CODESG  ENDS

END 


Информация о работе Опрацювання потокових даних засобами Мови Асемблер