Багатомодульне програмування

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
Комп'ютерна інженерія
Кафедра:
ЕОМ

Інформація про роботу

Рік:
2014
Тип роботи:
Звіт про виконання лабораторної роботи
Предмет:
Засоби системного програмування
Група:
КІ 2
Варіант:
2 11

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний університет «Львівська політехніка»  ЗВІТ З лабораторної роботи №7 З дисципліни: «Засоби системного програмування» На тему: «Багатомодульне програмування.» Мета: Оволодіти навиками створення багатомодульних програм. Засвоїти правила взаємодії різних модулів. ЗАВДАННЯ: Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу. Програма повинна складатися з чотирьох модулів: головний модуль – містить спільний сегмент стеку, необхідні дані та виклик основних процедур; модуль вводу - забезпечує ввід даних з клавіатури в десятковій формі; модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії. модуль виводу – забезпечує вивід на екран результату в десятковій формі. Всі модулі повинні бути в різних файлах і об’єднані на етапі лінкування. Передача параметрів може здійснюватися довільним чином. Переконатися у правильності роботи кожного модуля зокрема та програми загалом. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї. Дати відповідь на контрольні запитання. ВАРІАНТИ ЗАВДАННЯ – ДИВ. ЛАБОРАТОРНУ РОБОТУ №4. Варіант №2 № Вираз K  2 X=A4/B2+C3-D1*E1+K 202   Лістинг програми: ; main.asm головна програма ;X=A4/B2+C3-D1*E1+K K=202 (Decimal K = 514) 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' A dd 00h B dw 00h C dd 00h D db 00h E db 00h FlagSign dw 0 TempStr db 10 dup (0) TempBin dw 0,0 MaxLen dw 0 Mult10 dw 1,0 my_z dw 0,0 MESSG_X DB 13,10,'X=A4/B2+C3-D1*E1+K K=202 (Decimal K = 514)','$' 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,' B =0 --> divide by zero ',13,10,'$' erStr3 db 13,10,'Data is too long ',13,10,'$' DATASG ENDS CODESG SEGMENT PARA PUBLIC 'CODE' ASSUME DS:DATASG, CS:CODESG input proc FAR public Input 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,3 mov cx,MaxLen call input_variable cmp B,0 jne dali mov erFlag,1 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,5 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 MaxLen,3 mov cx,MaxLen call input_variable ret input endp input_variable PROC mov si,0 In_00:mov ah,01 int 21h cmp al,0Dh je In_1 cmp al,'-' jne In_0 mov FlagSign,1 jmp In_00 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 LEA DX,erSTR1 MOV AH,09 INT 21H mov erFlag,1 jmp In_5 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 erFlag,1 jmp In_5 In_3:cmp FlagSign,1 jne In_4 mov bx,0 sub bx,ax mov ax,bx mov bx,0 sbb bx,dx mov dx,bx In_4: mov [di],ax mov [di+2],dx mov TempBin,0 mov TempBin+2,0 mov Mult10,1 mov Mult10+2,0 mov FlagSign,0 In_5: RET input_variable ENDP CHECK_BYTE PROC sub dl,30h cmp dl,00 jl ErS cmp dl,0Ah jl GO ErS: LEA DX,erSTR2 MOV AH,09 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 EQU 202h Temp1 dw 00h,00h Temp2 dw 00h Temp3 dw 00h Temp4 dw 00h,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 ;Temp1 <- A4/B2 ; в цьому блоці виконуємо операцію ділення mov ax,word ptr A+2 ; переміщуємо старшу частину змінної А в регістр ах mov bx,1 ; переміщуємо 1 в регістр bx mul bx ; робимо множення на 1 div B ; виконуємо ділення mov Temp1+2,ax ; записуємо частку старшої частини в Temp1 зі зміщенням на 2 байти mov ax,word ptr A ; переміщуємо молодшу частину змінної А у регістр ах div B ; виконуємо ділення mov Temp1,ax ; записуємо частку в Temp1 ;Temp2 <- D1*E1 ; в цьому блоці виконуємо операцію множення mov ax,0 ; онулюємо регістр ах mov ax,word ptr D ; переносимо значення змінної D в регістр ax mul E ; виконуємо множення mov Temp2,ax ; молодший результат множення записуємо в Temp2 mov Temp2+2,dx ; старший результат множення записуємо в Temp2 зі зміщення у 2 байти ;Temp1 + C3 - Temp2 – K ; в цьому блоці виконуємо операцію додавання та віднімання з використанням ; проміжних результатів та змінних mov ax,0 ; онулюємо регістр ах mov ax, word ptr C ; переносимо значення зміноої С в регістр ах add ax,Temp1 ; виконуємо додавання adc dx,Temp1+2 ; виконуємо додавання з врахуванням переносу sub ax,Temp2 ; виконуємо віднімання sbb dx,0 ; виконуємо віднімання з запозиченням add ax,K ; виконуємо додавання mov X,ax ; переміщаємо молодшу частину результату з регістру ах у змінну Х mov X+2,dx ; переміщаємо старшу частину результату з регістру dх у змінну Х зі зміщенням на 2 байти ret calculation endp CODESG ENDS END ;Output.asm модуль виводу результату DOSSEG EXTRN X:DWORD;, MESSG_Sign :BYTE DATASG SEGMENT PARA PUBLIC 'Data' X_Str db 10 dup (0) MESSG_X1 DB 13,10,'X= ','$' X_div2 dw 0,0 Y_div2 dw 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 di,0 mov Y_div2,10 mov cx,word ptr X mov bx,word ptr 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 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 Висновок: Я оволодів навичками створення багатомодульних програм. Засвоїв правила взаємодії різних модулів.
Антиботан аватар за замовчуванням

28.05.2014 14:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!