Автор: Пользователь скрыл имя, 26 Апреля 2012 в 23:49, контрольная работа
Мета: Ознайомитися та засвоїти особливості роботи з потоками вводу/виводу та
написання програм для опрацювання потокових даних.
Вихід:
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:
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
Информация о работе Опрацювання потокових даних засобами Мови Асемблер