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

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

ВУЗ:
Інші
Інститут:
Не вказано
Факультет:
УІ
Кафедра:
Не вказано

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

Рік:
2013
Тип роботи:
Лабораторна робота
Предмет:
Програмування частина 4 Технологія системного програмування

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

Заданий вираз: X=A2*B1+C4/(K-E1*F1) K=10974759 Згідно з завданням, головний модуль повинен містити попереднє визначення зовнішніх процедур та їх виклик. Оскільки жодних дій у ньому не відбувається, то сегмент даних буде містити лише прапорець помилки, яка може виникнути в одній з процедур. Він потрібен для коректного завершення програми. ; main.asm головна програма 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 міститься оголошення зовнішньої змінної erFlag та загальнодоступних змінних B,C,D,E,F, що є визначені в сегменті даних даного модуля. Крім того, сама процедура Input оголошується як FAR та PUBLIC, що дає змогу викликати її з головної програми. Сегмент коду містить, також, опис локальних процедур, необхідних для функціонування модуля - input_variable та CHECK_BYTE та макрокоманду множення MY_MUL. Вони директив доступності (PUBLIC) не мають. Сегмент даних містить повідомлення та змінні необхідні лише для вводу даних ти їх перетворення в шістнадцяткову форму. erFlag – змінна, що містить ознаку помилки. В даному модулі вона формується у разі некоректно введеного символу, або якщо введене значення не відповідає діапазону. ;Input.asm модуль вводу даних EXTRN erFlag:BYTE PUBLIC B,C,D,E,F 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 dw 00h B db 00h C dd 00h E db 00h F db 00h X_Str db 10 dup (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=A2*B1+C4/(K-E1*F1) K=10974759 (A77627h)','$' MESSG_A DB 13,10,'A= ','$' MESSG_B DB 13,10,'B= ','$' MESSG_C DB 13,10,'C= ','$' 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,'$' 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,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 LEA DX,MESSG_E MOV AH,09 INT 21H mov di,offset E mov MaxLen,3 mov cx,MaxLen call input_variable LEA DX,MESSG_F MOV AH,09 INT 21H mov di,offset F 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 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 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 міститься оголошення зовнішніх змінних B,C,D,E,F та загальнодоступної змінної X, що є визначеною в сегменті даних даного модуля і буде отримана як результат обчислення заданого виразу. В сегменті даних, також, визначається задана у виразі константа та повідомлення та змінні необхідні лише арифметичних обчислень. Сегмент коду містить процедуру Calculation, оголошену як FAR та PUBLIC, що дає змогу викликати її з головної програми. ; calc.asm модуль обчислень EXTRN A:WORD,B:BYTE,C:DWORD,E:BYTE,F:BYTE PUBLIC X;,MESSG_Sign DATASG SEGMENT PARA PUBLIC 'Data' K_low EQU 6982h K_high EQU 0005h Temp1 dw 00h,00h Temp2 dw 0000h Temp3 dw 00h,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 mov ax,0 mov al,B mul A mov Temp1,ax;=0002 mov Temp1+2,dx;=0000 mov ax,0 mov al,E mul F mov Temp2,ax ;=4B0 mov dx,K_high mov ax,K_low mov bx,Temp2 sub ax,bx sbb dx,0 mov Temp3,ax;=7177 mov Temp3+2,dx;=00A7 mov ax,word ptr[C] mov dx,word ptr[C+2] div Temp3 mov Temp4,ax mov dx,0 mov ax,Temp4 add Temp1,ax adc Temp1+2,0 mov X,ax mov X+2,dx ret calculation endp CODESG ENDS END В модулі Output міститься оголошення зовнішньої змінної X. Сама процедура Output оголошується як FAR та PUBLIC, що дає змогу викликати її з головної програми. Сегмент коду містить також, опис локальної процедури MY_DIV2 необхідної для переводу у десяткову систему числення. Сегмент даних містить повідомлення та змінні необхідні для виводу результату на екран в десятковій формі зі знаком .;Output.asm модуль виводу результату 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
Антиботан аватар за замовчуванням

19.12.2013 23:18

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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