Advertisement
Guest User

Untitled

a guest
May 20th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DOSSEG
  2. .8086
  3. .MODEL SMALL
  4. ;====================================================================
  5. MY_MUL   MACRO   X,Y,Z  
  6.          mov z,0
  7.          mov z+2,0  
  8.                  MOV     AX,X  
  9.                  MUL     Y    
  10.                  MOV     Z,AX  
  11.                  MOV     Z+2,DX
  12.                  MOV     AX,X+2
  13.                  MUL     Y    
  14.                  ADD    Z+2,AX
  15.          mov ax,Z
  16.                  mov dx,Z+2          
  17. ENDM  
  18. ;====================================================================
  19. .STACK 100h
  20. .DATA
  21.     K_low   EQU     37h
  22.     K_high  EQU     02h
  23.     A       dw      0000h
  24.     B   dw  0000h
  25.     F   db  00h
  26.     D   dd  00000000h
  27.     E   dw  0000h
  28.  
  29.     Temp1   dw  00h
  30.     Temp2   dw  00h,00h
  31.     Temp3   dw  00h,00h
  32.     Temp4   dw  00h,00h
  33.     X   dw  00h,00h
  34. ;--------------------------------------------------------------------
  35. X_Str    db   10 dup (0)
  36. TempStr  db   10 dup (0)
  37. TempBin  dw   0,0
  38. MaxLen   dw   0
  39. X_div2   dw   0,0
  40. Y_div2   dw   0
  41. ;--------------------------------------------------------------------
  42. MESSG_X  DB     13,10,'X=(A4-B3-K)*D1+E4/F2   K=311 (0137h)','$'
  43. MESSG_A  DB     13,10,'A= ','$'
  44. MESSG_B  DB     13,10,'B= ','$'
  45. MESSG_F  DB     13,10,'F= ','$'
  46. MESSG_D  DB     13,10,'D= ','$'
  47. MESSG_E  DB     13,10,'E= ','$'
  48. ;--------------------------------------------------------------------
  49. MESSG_X1  DB  13,10,'X= ','$'
  50. erStr1    db  13,10,'Data not input_variable',13,10,'$'
  51. erStr2    db  13,10,'Incorrectly data ',13,10,'$'
  52. erStr2_1  db  13,10,'F =0 --> divide by zero ',13,10,'$'
  53. erStr3    db  13,10,'Data is too long ',13,10,'$'
  54. ;--------------------------------------------------------------------
  55. Mult10   dw 1,0
  56. my_z     dw 0,0
  57. ;====================================================================
  58. .CODE  
  59. Start:
  60.     mov ax,@data        
  61.     mov ds,ax
  62. call input
  63. call calculation
  64. call output
  65. ;--------------------------------------------------------------------
  66. mov ah,01
  67. int 21h        
  68. ;--------------------------------------------------------------------
  69. mov ah,4Ch
  70. int 21h
  71. ;--------------------------------------------------------------------
  72. input proc
  73.         LEA     DX,MESSG_X    
  74.         MOV     AH,09
  75.         INT     21H
  76. ;--------------------------------------------------------------------  
  77.         LEA     DX,MESSG_A    
  78.         MOV     AH,09
  79.         INT     21H
  80.         mov di,offset A
  81.         mov MaxLen,5
  82.         mov cx,MaxLen
  83.         call input_variable
  84. ;--------------------------------------------------------------------  
  85.         LEA     DX,MESSG_B    
  86.         MOV     AH,09
  87.         INT     21H
  88.         mov di,offset B
  89.         mov MaxLen,5
  90.         mov cx,MaxLen
  91.         call input_variable
  92. ;--------------------------------------------------------------------
  93.         LEA     DX,MESSG_F    
  94.         MOV     AH,09
  95.         INT     21H
  96.         mov di,offset F
  97.         mov MaxLen,3
  98.         mov cx,MaxLen
  99.        
  100.         cmp F,0
  101.         jne dali
  102.         mov ah,09
  103.         mov dx, offset erStr2_1
  104.         int 21h
  105.         mov ah,4Ch
  106.         int 21h
  107.         call input_variable
  108. ;--------------------------------------------------------------------
  109.         LEA     DX,MESSG_D    
  110.         MOV     AH,09
  111.         INT     21H
  112.         mov di,offset D
  113.         mov MaxLen,10
  114.         mov cx,MaxLen
  115.         call input_variable
  116.        
  117. ;--------------------------------------------------------------------
  118.             LEA     DX,MESSG_E    
  119.         MOV     AH,09
  120.         INT     21H
  121.         mov di,offset E
  122.         mov MaxLen,5
  123.         mov cx,MaxLen
  124.         call input_variable
  125.        
  126. ;--------------------------------------------------------------------
  127.  dali:       ret
  128. input endp
  129. ;====================================================================
  130. calculation proc
  131. xor ax,ax
  132. xor bx,bx
  133. xor cx,cx
  134. xor dx,dx
  135. ;--------------------------------------------------------------------
  136. mov ax, B
  137. mov dl,F  
  138. add ax,dx
  139. mov Temp1 , ax
  140.   mov ax, A
  141.   mov dx, Temp1
  142.   mul dx
  143.   mov Temp2, ax
  144.    mov ax , word ptr [D]
  145.    mov dx , word ptr [D+2]
  146.    mov bx , E
  147.     div bx
  148.     mov Temp3 , ax
  149.     clc          
  150.     mov ax, Temp2
  151.     mov dx, Temp2+2
  152.     mov bx, Temp3
  153.     sub ax, bx
  154.     sbb dx, 0
  155.     mov Temp4  , ax
  156.     mov Temp4+2 ,dx
  157.     mov ax, Temp4
  158.     mov dx, Temp4+2
  159.     mov bl, K_low
  160.     mov bh, K_high
  161.     add ax,bx
  162.     adc dx,0
  163.     mov X  , ax
  164.     mov X+2, dx
  165. ret
  166. calculation endp
  167. ;====================================================================
  168. input_variable PROC
  169.         mov si,0                
  170.     In_00:  mov ah,01
  171.         int 21h
  172.         cmp al,0Dh
  173.         je In_1
  174.     In_0:   mov dl,al
  175.         call CHECK_BYTE
  176.         mov TempStr[si],dl
  177.         inc si
  178.         loop In_00
  179.     In_1:   push si
  180.         dec si
  181.         cmp cx,MaxLen
  182.         jne In_2
  183.         call  Err1      
  184.     In_2:   mov bh,0
  185.                 mov bl,TempStr[si]
  186.         MY_MUL Mult10,bx,my_z
  187.         add  TempBin,ax
  188.                 adc  TempBin+2,dx
  189.         mov  bh,0
  190.         mov bl,10
  191.         MY_MUL Mult10,bx,my_z
  192.         mov Mult10,ax
  193.                 mov Mult10+2,dx
  194.         dec si
  195.         cmp si,0
  196.         jge In_2
  197.         mov ax, TempBin
  198.         mov dx,TempBin+2
  199.         pop si
  200.         cmp si,MaxLen
  201.         jl In_3
  202.             cmp MaxLen,10
  203.         jl  In_2_1      
  204.         js  In_Err
  205.                 cmp dx,0FFFFh
  206.         ja In_Err
  207.         jmp In_3
  208.     In_2_1: cmp MaxLen,5
  209.         jl  In_2_2
  210.         cmp dx,00
  211.         ja In_Err      
  212.                 cmp ah,0ffh
  213.         ja In_Err
  214.         jmp In_3
  215.     In_2_2: cmp ax,00FFh
  216.         jbe In_3
  217.     In_Err: LEA     DX,erSTR3
  218.                 MOV     AH,09
  219.                 INT     21H
  220.         mov ah,4Ch
  221.         int 21h
  222. ;--------------------------------------------------------------------
  223.     In_3:   mov [di],ax
  224.         mov [di+2],dx
  225.         mov TempBin,0
  226.         mov TempBin+2,0
  227.         mov Mult10,1        
  228.         mov Mult10+2,0
  229. ;--------------------------------------------------------------------                      
  230.         RET  
  231. input_variable  ENDP
  232. ;====================================================================
  233. Err1 PROC  
  234.               PUBLIC Err1
  235.               LEA     DX,erSTR1
  236.                   MOV     AH,09
  237.                   INT     21H
  238.           mov ah,4Ch
  239.           int 21h
  240.                   RET  
  241. Err1  ENDP
  242. ;====================================================================
  243. CHECK_BYTE  PROC
  244.         PUBLIC CHECK_BYTE
  245.         sub dl,30h
  246.         cmp dl,00
  247.         jl ErS
  248.         cmp dl,0Ah
  249.         jl GO
  250.     ErS:    LEA     DX,erSTR2
  251.                 MOV     AH,09
  252.                 INT     21H
  253.         mov ah,4Ch
  254.         int 21h
  255.        
  256.     GO: RET
  257. CHECK_BYTE ENDP
  258. ;====================================================================
  259. MY_DIV2 proc
  260.     sub cx,cx
  261.     sub bx,bx
  262.     mov dx,X_div2+2
  263.     mov ax,X_div2
  264.   M2_D1:
  265.     cmp dx,Y_div2
  266.     jb M2_D3
  267.     sub ax,Y_div2
  268.     sbb dx,00
  269.     add cx,01
  270.     adc bx,0
  271.     jmp M2_D1
  272.   M2_D3:
  273.     div Y_div2
  274.     add cx,ax
  275.     adc bx,00
  276.     ret
  277. MY_DIV2 ENDP
  278. ;====================================================================        
  279. output PROC
  280.                 mov di,0
  281.         mov Y_div2,10
  282.         mov cx,X
  283.         mov bx,X+2
  284.     O_1:    mov X_div2,cx
  285.         mov X_div2+2,bx
  286.         call my_div2    
  287.         add dl,30h
  288.         mov X_Str[di],dl
  289.         inc di
  290.         cmp bx,0
  291.         ja O_1
  292.         cmp cx,10
  293.         jae O_1
  294.         add cl,30h
  295.         mov X_Str[di],cl
  296.         mov dx,offset MESSG_X1
  297.         mov ah,09
  298.         int 21h        
  299.     O_2:    
  300.         mov dl,X_Str[di]        
  301.         mov ah,02h
  302.         int 21h
  303.         dec di
  304.         jge O_2
  305.         ret
  306. output ENDP
  307. end Start
  308. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement