Advertisement
Guest User

Untitled

a guest
Feb 13th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .286
  2. .model small
  3. .stack 100h
  4. .data
  5.     a dd 0.0
  6.     b dd 0.0
  7.     c dd 0.0
  8.  
  9.     str1 db 13,"Enter a = ",'$'
  10.     str2 db 13,"b = ",'$'
  11.     str3 db 13,"c = ",'$'
  12.     str_many db 13,"Infinit set of solutions.",'$'
  13.     str_non db 13,"Set of solutions = 0",'$'
  14.  
  15.     length dw 0
  16.     after_poin dw 0
  17.     fminus dw 0  
  18.     arr_len dw 0
  19.     mass dw 100 dup(0)
  20.    
  21.  
  22.     two dd 2.0
  23.     four dd 4.0
  24.     ten dd 10.0
  25.     zero dd 0.0
  26.     one dd 1.0
  27.     minus_one dd -1.0
  28.     temp dw 0
  29.     outp dd 0
  30.     ost dw 0
  31.     to_steck dw 0
  32.     fufu dd 0
  33. .code
  34.  
  35.  
  36. read_fun PROC
  37.     mov ax, 0
  38.     mov length, ax
  39.     mov after_poin, ax
  40.     mov fminus, ax
  41.  
  42. cin:
  43.     mov ah, 08h
  44.     int 21h
  45.  
  46.     cmp al, '0'
  47.     jl next                       ;<
  48.     cmp al, '9'
  49.     ja next                       ;>
  50.    
  51.     push ax
  52.     mov ah, 02h
  53.     mov dl, al
  54.     int 21h
  55.     pop ax
  56.  
  57.     mov dl, '0'
  58.     sub al, dl
  59.     mov ah, 0
  60.    
  61.     mov di, offset mass
  62.     add di, length ;заносим на позицию
  63.     add di, length
  64.  
  65.     mov dx, 1
  66.     cmp fminus, dx
  67.     jne goto3
  68.         dec di
  69.         dec di
  70.     goto3:
  71.     mov dx, 0
  72.     cmp after_poin, dx
  73.     je goto4
  74.         dec di
  75.         dec di
  76.     goto4:
  77.     mov [di], ax    ;указывает на ячейку в 2 байта
  78.     inc length
  79.  
  80.     mov ax, 0
  81.     cmp after_poin, ax
  82.     je read                       ;=
  83.     inc after_poin
  84.    
  85. read:
  86.    jmp cin
  87.  
  88. next:
  89.     cmp al, '-'
  90.     jne next_s
  91.         jmp minus
  92.     next_s:
  93.     cmp al, 8
  94.     je bsckspace
  95.     cmp al, '.'
  96.     je p
  97.     cmp al, 13
  98.     jne cin
  99.         jmp enter
  100. bsckspace:
  101.     mov ax, 1
  102.     cmp fminus, ax
  103.     jne check3
  104.  
  105. check2:
  106.     mov ax, 1
  107.     cmp length, ax
  108.     je delete_minus
  109.    
  110. check3:
  111.     mov ax, 1
  112.     cmp after_poin, ax
  113.     je del_poin
  114.    
  115.     mov ax, 0
  116.     cmp length, ax
  117.     ja out
  118.     jmp cin
  119.    
  120. del_poin:
  121.     mov ax, 0
  122.     mov after_poin, ax
  123.     jmp clear_screen
  124.  
  125. delete_minus:
  126.     mov ax, 0
  127.     mov fminus, ax
  128.     jmp clear_screen
  129.    
  130. out:
  131.     mov ax, 0
  132.     cmp after_poin, ax
  133.     je clear_screen
  134.     dec after_poin
  135.  
  136.    
  137. clear_screen:
  138.     dec length
  139.  
  140.     xor ax, ax  
  141.     xor bx, bx    
  142.     xor dx, dx    
  143.  
  144.     mov ah, 03h    
  145.     int 10h    
  146.  
  147.     xor ax, ax    
  148.     mov ah, 02h    
  149.     dec dl    
  150.     int 10h    
  151.     push dx    
  152.        
  153.     mov ah, 02h    
  154.     mov dl, ' '  
  155.     int 21h    
  156.  
  157.     pop dx  
  158.     mov ah, 02h  
  159.     int 10h    
  160.  
  161.     jmp cin    
  162.  
  163. p:
  164.     mov ax, 0
  165.     cmp after_poin, ax
  166.     je next_ss                     ;==
  167.         jmp cin
  168.     next_ss:
  169.    
  170.     mov ax, 0
  171.     cmp fminus, ax
  172.     je check                    ; >=
  173.    
  174.     mov ax, 2
  175.     cmp length, ax
  176.     jge write_point
  177.  
  178.     jmp cin
  179.  
  180. check:
  181.     mov ax, 0
  182.     cmp length, ax
  183.     jne write_point
  184.     jmp cin
  185.  
  186. write_point:
  187.     inc after_poin
  188.     inc length
  189.     mov ah, 02h
  190.     mov dl, '.'
  191.     int 21h
  192.            
  193.     jmp cin
  194.  
  195. minus:
  196.     mov ax, 0
  197.     cmp length, ax
  198.     je go
  199.         jmp cin
  200.     go:
  201.     mov ax, 0
  202.     cmp fminus, ax
  203.     je next_w
  204.         jmp cin
  205.     next_w:
  206.     mov ax, 1
  207.     mov fminus, ax
  208.     inc length
  209.  
  210.     mov ah, 02h
  211.     mov dl, '-'
  212.     int 21h
  213.  
  214.     jmp cin
  215. enter:
  216.     mov ax, 0
  217.     cmp length, ax
  218.     jne go1
  219.         jmp cin
  220.     go1:
  221.         mov ax, 1
  222.         cmp fminus, ax
  223.         jne go2
  224.         cmp length, ax
  225.         jne go2
  226.             jmp cin
  227.     go2:
  228.         fld zero
  229.         mov ax, 1
  230.         cmp fminus, ax
  231.         jne goto
  232.             dec length
  233.  
  234.         goto:
  235.         mov ax, 0
  236.         cmp after_poin, ax
  237.         je goto2
  238.             dec length
  239.         goto2:
  240.         mov cx, length
  241.         mov di, offset mass
  242.    
  243.     loooop:
  244.         fmul ten
  245.         mov ax, [di]
  246.         mov temp, ax
  247.         fiadd temp
  248.         add di, 2
  249.     loop loooop
  250.         mov ax, 0
  251.         cmp after_poin, ax
  252.         je exit
  253.  
  254.         dec after_poin
  255.         fld one
  256.  
  257.         mov cx, after_poin
  258.         loop1:
  259.             fmul ten
  260.         loop loop1
  261.         fdivp
  262.  
  263.       exit:
  264.         mov ax, 1
  265.         cmp fminus, ax
  266.         jne exit2
  267.         fmul minus_one
  268.     exit2:
  269.         fstp outp
  270.         ret
  271. read_fun  endp
  272.  
  273.  
  274.  
  275. count_x PROC
  276.     fld b
  277.     fmul b
  278.  
  279.    
  280. if_1:
  281.     fld a
  282.     fcomp zero
  283.     fstsw ax
  284.     sahf
  285.     jne to1
  286.         jmp else_1
  287.     to1:
  288.     xor ax, ax
  289.  
  290.     fld b
  291.     fcomp zero
  292.     fstsw ax
  293.     sahf
  294.     je else_2
  295.  
  296.     fld a
  297.     fmul c
  298.     fmul four
  299.     fsubp
  300. ; HERE WAS ERROR
  301.     fld zero
  302.     fcomp
  303.     fstsw ax
  304.     sahf
  305.     jna to2   ; And here was jnb
  306.         jmp else_4
  307.     to2:
  308. ; NOw EVERYTHING IS GOOD
  309.     fsqrt
  310.     fld st(0)
  311.     fmul minus_one
  312.  
  313. if_D:
  314.     fld b
  315.     fmul minus_one
  316.     faddp
  317.     fdiv two
  318.     fdiv a
  319.     fstp outp
  320.  
  321.     call output
  322.     call eol_w
  323.  
  324.     fld b
  325.     fmul minus_one
  326.     faddp
  327.     fdiv a
  328.     fdiv two
  329.     fstp outp
  330.  
  331.     call output
  332.  
  333.     ret
  334. else_2:
  335.     fld c
  336.     fld a
  337.     fdivp
  338.     fld zero
  339.     fcomp
  340.     fstsw ax
  341.     sahf
  342.     jb else_4
  343.  
  344.     fmul minus_one   ; Here was sqrt from negative
  345.     fsqrt            ; You forgot sqrt
  346.  
  347.     fstp outp
  348.  
  349.     call output
  350.  
  351.     ret
  352.  
  353. else_1:
  354.     fld b
  355.     fcomp zero
  356.     fstsw ax
  357.     sahf
  358.     jz else_3
  359.  
  360.     fld c
  361.     fmul minus_one
  362.     fld b
  363.     fdivp
  364.     fstp outp
  365.  
  366.     call output
  367.  
  368.     ret
  369.  
  370. else_3:
  371.     fld c
  372.     fcomp zero
  373.     fstsw ax
  374.     sahf
  375.     jne else_4
  376.    
  377.     mov ah, 09h
  378.     mov dx, offset str_many
  379.     int 21h
  380.  
  381.     ret
  382. else_4:
  383.     mov ah, 09h
  384.     mov dx, offset str_non
  385.     int 21h
  386.  
  387.     ret
  388. count_x endp
  389.  
  390.  
  391.  
  392.  
  393. output PROC
  394.     mov cx, 0
  395.     mov arr_len, cx
  396.  
  397.     fld outp
  398.  
  399.     fld zero
  400.     fcomp
  401.     fstsw ax
  402.     sahf
  403.     jbe  ln   ; here was jb, what means >, now is jbe, what means >=
  404.         jmp put_minus
  405.     ln:
  406. write_number:
  407.     fld one
  408.     fld st(1)
  409.     fprem
  410.  
  411.     fld zero
  412.     fcomp
  413.     fstsw ax
  414.     sahf
  415.     je zero_check
  416.         mov ost, 1
  417.     zero_check:
  418.         fxch st(2)
  419.         fsub st(0), st(2)
  420.         while:
  421.             fcom zero
  422.             fstsw ax
  423.             sahf
  424.             je end_while
  425.  
  426.             fld ten
  427.             fld st(1)
  428.             fprem
  429.             fsub st(2), st(0)
  430.            
  431.             fistp to_steck ;достаем из стека с удалением
  432.             mov bx, to_steck
  433.             push bx
  434.             inc arr_len
  435.             fstp ten
  436.             fdiv ten
  437.         jmp while
  438.  
  439. end_while:
  440.         mov cx, arr_len
  441.  
  442.         mov ax, 0
  443.         cmp ax, arr_len
  444.         je exit_zero
  445.  
  446.         away_steck:
  447.             pop bx
  448.            
  449.             mov ah, 02h
  450.             add bl, '0'
  451.             mov dl, bl        
  452.             int 21h
  453.         loop away_steck
  454. ost2:
  455.         fstp zero
  456.         fstp one  
  457.  
  458.         mov dx, 0
  459.         cmp dx, ost
  460.         je exit3
  461.  
  462.         mov ah, 02h
  463.         mov dl, '.'
  464.         int 21h
  465.    
  466.     mov cx, 0
  467. write_ost:
  468.     fcom zero
  469.     fstsw ax
  470.     sahf
  471.     je exit3
  472.    
  473.     cmp cx, 5
  474.     jz exit3
  475.     inc cx
  476.  
  477.     fmul ten
  478.     fld one
  479.     fld st(1)
  480.     fprem
  481.     fxch st(2)
  482.     fsub st(0), st(2)
  483.    
  484.     fistp to_steck
  485.     mov bx, to_steck
  486.     fstp one
  487.  
  488.     mov ah,02h
  489.     add bl, '0'
  490.     mov dl, bl
  491.     int 21h
  492.  
  493. jmp write_ost
  494.     ret
  495. put_minus:
  496.     fmul minus_one
  497.    
  498.     mov ah, 02h
  499.     mov dl, '-'
  500.     int 21h
  501.    
  502.     jmp write_number
  503. exit_zero:
  504.     mov ah, 02h
  505.     mov dl, '0'
  506.     int 21h
  507.     jmp ost2
  508. exit3:
  509.     fstp fufu
  510.     ret
  511. output endp
  512.  
  513.  
  514.  
  515. eol_w PROC
  516.     mov dl, 10
  517.     mov ah, 02h
  518.     int 21h
  519.  
  520.     mov dl, 13
  521.     mov ah, 02h
  522.     int 21h
  523.     ret
  524. eol_w endp
  525.  
  526.  
  527.  
  528. start:
  529.     mov ax, @data
  530.     mov ds, ax
  531.     mov es, ax
  532.  
  533.     mov ah, 09h
  534.     mov dx, offset str1
  535.     int 21h
  536.  
  537.     call read_fun
  538.     fld outp
  539.     fstp a
  540.     call eol_w
  541.  
  542.     mov ah, 09h
  543.     mov dx, offset str2
  544.     int 21h
  545.  
  546.     call read_fun
  547.     fld outp
  548.     fstp b
  549.     call eol_w
  550.  
  551.     mov ah, 09h
  552.     mov dx, offset str3
  553.     int 21h
  554.  
  555.     call read_fun
  556.     fld outp
  557.     fstp c
  558.     call eol_w
  559.  
  560.     call count_x
  561.  
  562.     mov ax, 4c00h
  563.     int 21h
  564. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement