Памагити)) 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
