Памагити)) Masm, цикл не останавливается(хотя явно должен), не пойму в чем дело

Есть некая ф-ия(экземпляр кода ниже), должна производить мат. операции пока х1 < x2 с шагом deltaX в n мы храним кол-во пар (не важно) В общем ф-ия работает хорошо при вводе допустим х1 = 1 х2 = 2 deltaX = 2 но когда вводим к примеру x1 = 1 x2 = 5 deltaX = 1 Бегите все, цикл не остановить, оч долго пытался найти решение проблемы но пока не справился. Выч-ления пока абсолютно не важны, нужно просто сделать что бы работал цикл.

!!!ниже будет приложен код той самой ф-ии, а еще ниже сам код всей проги Для любознательных: сам таск с заданием будет в самом низу (я новенький не бульте)

Буду рад любой помощи ^-^

funcc Proc    

;------------------------------------------------------- 
        ;чекаем на x1>=x2 - тогда вычисления не требуются

        finit
        fld x2
        fld x1
        fcompp
        fstsw ax      
        sahf
        jnb Break 
        
        ;------------------------------------------------   

        Cycle:     
        ;---------- 
        ;чекаем на x1>=x2 - для выхода с цикла  

        fld x2
        fld x1
        fcompp      
        fstsw ax      
        sahf
        jnb Endl  
        ;----------  
        ; чекаем на x1<1 для определения способа нахождения у - task

        fld1
        fld x1
        fcompp 
        fstsw ax      
        sahf 
        jnb secnd 
        ;----------   
        ;1ый способ
        fld x1      
        fld x1   
        fmul st, st (1)
        fld b
        fmul st, st (1) 
        fld a 
        fld x1
        fmul st, st (1)
        fsub st, st (2)              
        fstp y                  
        jmp Nexta
        ;----------  
        ;2-ой способ
        
        secnd:                     
        fld x1      
        fld x1   
        fmul st, st (1)
        fld b
        fmul st, st (1) 
        fld a 
        fld x1
        fmul st, st (1)
        fadd st, st (2)              
        fstp y 

        ;------------------------------------------------
        ;выч-ления окончены, увеличиваем n на 1(кол-во пар x1, y) и х1 на deltaX - шаг

        Nexta:
        mov eax, n
        add eax, 1
        mov n, eax
        
        fld x1
        fld deltaX
        fadd    
        fstp x1 
             
        jmp Cycle
        ;------------------------------------------------
        ;выход из ф-ии если x1>=x2 изначально и вывод сообщения о неудачном вводе
        Break:
        mov eax, 666   
        push 29
        push offset err666
        call cout 
        ;------------------------------------------------
        Endl:   
;--------------------------------------------------------       
ret
funcc ENDP

!!! ДЛЯ ЛЮБОЗНАТЕЛЬНЫХ сам таск: Постройте таблицу значений функции (см. свой вариант) на отрезке [x1, x2] с шагом Δx при заданных пользователем значениях переменных x1, x2, Δx, a, b:

ф-ия

Указания.

1)Формирование массивов значений аргумента и функции оформить в виде отдельной функции.

2)Для формирования строки, содержащей десятичное представление вещественного числа, необходимо использовать функцию FloatToStr.

.486
.model flat, stdcall

option casemap : none

include windows.inc
include kernel32.inc 
include user32.inc 
include masm32.inc
includelib kernel32.lib 
includelib user32.lib 
includelib masm32.lib

.data 
T                db "| %4.6s | %4.4s |", 10  
answer           db "    { a*x - b*x^2, x < 1;", 10, "y = {", 10, "    { a*x + b*x^2, x >= 1;", 10, 10
eA               db "Enter a: ", 0
eB               db "Enter b: ", 0   
eX1              db "Enter x1: ", 0 
eX2              db "Enter x2: ", 0 
eDeltaX          db "Enter delta x: ", 0    
err666           db "Bad gay, x1 must be < x2 !!!", 10
newline          db 10 
n                dd 0
y                dq 0    

.data?
inputHandle    dd ?
outputHandle   dd ?
noc            dd ?
sA             db 1000 dup(?)                                                               
sB             db 1000 dup(?)  
sX1            db 1000 dup(?)  
sX2            db 1000 dup(?)  
sDeltaX        db 1000 dup(?)   
x1             dq ?  
x2             dq ?       
a              dq ? 
b              dq ?   
deltaX         dq ?    
arrX           db 1000 dup(?)
arrY           db 1000 dup(?)
result         db 1000 dup(?)

.code      
cout PROC msg:dword, chars:dword 
    push NULL              
    push offset noc
    push chars                 
    push msg
    push outputHandle      
    call WriteConsole
    ret
cout ENDP     

cin PROC msg:dword
    push NULL
    push offset noc
    push 100
    push msg
    push inputHandle
    call ReadConsole 
    ret
cin ENDP   

func Proc    
;функиця служит для формирования массивов х и у
;кол-во пар храниться в n
;------------------------------------------------------- 
;чек на x1 < x2          

        finit
        fld x2
        fld x1
        fcompp
        fstsw ax      
        sahf
        jnb Break 
        
        ;------------------------------------------------   
;считаем х и у

        Cycle:     
        ;---------- 
        ;брейкпоинт
        fld x2
        fld x1
        fcompp      
        fstsw ax      
        sahf
        jnb Endl  
        ;----------  
        ;определяем x < 1 чи не - для решения системы
        fld1
        fld x1
        fcompp 
        fstsw ax      
        sahf 
        jnb secnd 
        ;----------    |                    |
        ;выч для x < 1 | a*x - b*x^2, x < 1 |
        fld x1      
        fld x1   
        fmul st, st (1)
        fld b
        fmul st, st (1) 
        fld a 
        fld x1
        fmul st, st (1)
        fsub st, st (2)              
        fstp y                  
        jmp Nexta
        ;----------     |                    |
        ;выч для x >= 1 | a*x + b*x^2, x < 1 |
        
        secnd:                     
        fld x1      
        fld x1   
        fmul st, st (1)
        fld b
        fmul st, st (1) 
        fld a 
        fld x1
        fmul st, st (1)
        fadd st, st (2)              
        fstp y 

  ;TASK занести х и у в аrr 
        ;------------------------------------------------
        Nexta:
        mov eax, n
        add eax, 1
        mov n, eax
        
        fld x1
        fld deltaX
        fadd    
        fstp x1 
             
        jmp Cycle
        ;------------------------------------------------
        Break:
        mov eax, 666   
        push 29
        push offset err666
        call cout 
        ;------------------------------------------------
        Endl:   
;--------------------------------------------------------       
ret
funcc ENDP
    
main:
;-----------------------------------------------------------------------------------------------------;
push STD_INPUT_HANDLE 
call GetStdHandle
mov inputHandle, EAX

push STD_OUTPUT_HANDLE
call GetStdHandle
mov outputHandle, EAX    
      
        push offset n
        call atodw   
        mov n, eax
;-----------------------------------------------------------------------------------------------------;  
        push 60
        push offset answer
        call cout  
        
        ;enter a 
        push offset eA 
        call lstrlen
        push EAX
        push offset eA
        call cout
        
        push offset sA
        call cin
        
        mov EDX, offset sA
        mov EAX, noc
        mov byte ptr [ EAX + EDX - 2], 0
        
        push offset a
        push offset sA
        call StrToFloat    
        
        ;enter b
         
        push offset eB
        call lstrlen
        push EAX
        push offset eB
        call cout
        
        push offset sB
        call cin
        
        mov EDX, offset sB
        mov EAX, noc
        mov byte ptr [ EAX + EDX - 2], 0
        
        push offset b
        push offset sB
        call StrToFloat    
        ;enter x1
         
        push offset eX1
        call lstrlen
        push EAX
        push offset eX1
        call cout
        
        push offset sX1
        call cin
        
        mov EDX, offset sX1
        mov EAX, noc
        mov byte ptr [ EAX + EDX - 2], 0
        
        push offset x1
        push offset sX1
        call StrToFloat 
        ;enter x2
         
        push offset eX2
        call lstrlen
        push EAX
        push offset eX2
        call cout
        
        push offset sX2
        call cin
        
        mov EDX, offset sX2
        mov EAX, noc
        mov byte ptr [ EAX + EDX - 2], 0
        
        push offset x2
        push offset sX2
        call StrToFloat 
        ;enter deltaX
         
        push offset eDeltaX
        call lstrlen
        push EAX
        push offset eDeltaX
        call cout
        
        push offset sDeltaX
        call cin
        
        mov EDX, offset sDeltaX
        mov EAX, noc
        mov byte ptr [ EAX + EDX - 2], 0
        
        push offset deltaX
        push offset sDeltaX
        call StrToFloat 
        
    ;-----------------------------------------    
        
    ;----------------------------------------
        body:
                              
        call funcc     
                              
        push offset n
        push n
        call dwtoa
        push offset n
        call lstrlen
        push eax
        push offset n
        call cout
        
        push offset x1
        push dword ptr x1+4
        push dword ptr x1
        call FloatToStr 
        push offset x1
        call lstrlen
        push eax
        push offset x1
        call cout
        
        cmp eax, 666
        je final 
        
;-----------------------------------------------------------------------------------------------------;
;END

final:

push NULL
push offset noc
push 1
push offset x1
push inputHandle
call ReadConsole

push 0
call ExitProcess

end main

Ответы (0 шт):