Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DOSSEG
- .8086
- .MODEL SMALL
- ;====================================================================
- 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
- ;====================================================================
- .STACK 100h
- .DATA
- K_low EQU 37h
- K_high EQU 02h
- A dw 0000h
- B dw 0000h
- F db 00h
- D dd 00000000h
- E dw 0000h
- Temp1 dw 00h
- Temp2 dw 00h,00h
- Temp3 dw 00h,00h
- Temp4 dw 00h,00h
- X dw 00h,00h
- ;--------------------------------------------------------------------
- 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=(A4-B3-K)*D1+E4/F2 K=311 (0137h)','$'
- MESSG_A DB 13,10,'A= ','$'
- MESSG_B DB 13,10,'B= ','$'
- MESSG_F DB 13,10,'F= ','$'
- 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,'F =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
- ;====================================================================
- .CODE
- Start:
- mov ax,@data
- mov ds,ax
- call input
- call calculation
- call output
- ;--------------------------------------------------------------------
- mov ah,01
- int 21h
- ;--------------------------------------------------------------------
- mov ah,4Ch
- int 21h
- ;--------------------------------------------------------------------
- input proc
- 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,5
- 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
- cmp F,0
- jne dali
- mov ah,09
- mov dx, offset erStr2_1
- int 21h
- mov ah,4Ch
- int 21h
- call input_variable
- ;--------------------------------------------------------------------
- LEA DX,MESSG_D
- MOV AH,09
- INT 21H
- mov di,offset D
- mov MaxLen,10
- 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
- call input_variable
- ;--------------------------------------------------------------------
- dali: ret
- input endp
- ;====================================================================
- calculation proc
- xor ax,ax
- xor bx,bx
- xor cx,cx
- xor dx,dx
- ;--------------------------------------------------------------------
- mov ax, B
- mov dl,F
- add ax,dx
- mov Temp1 , ax
- mov ax, A
- mov dx, Temp1
- mul dx
- mov Temp2, ax
- mov ax , word ptr [D]
- mov dx , word ptr [D+2]
- mov bx , E
- div bx
- mov Temp3 , ax
- clc
- mov ax, Temp2
- mov dx, Temp2+2
- mov bx, Temp3
- sub ax, bx
- sbb dx, 0
- mov Temp4 , ax
- mov Temp4+2 ,dx
- mov ax, Temp4
- mov dx, Temp4+2
- mov bl, K_low
- mov bh, K_high
- add ax,bx
- adc dx,0
- mov X , ax
- mov X+2, dx
- ret
- calculation 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
- 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
- ;====================================================================
- 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
- ;====================================================================
- output PROC
- 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
- ret
- output ENDP
- end Start
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement