Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; main.asm головна програма
- ; X=A4/B2-C1*(D1+E2-K) K=202 (Decimal K = 516)
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement