Witam,
Mam problem gdyż potrzebuję napisać program wyliczający deltę i dalej pierwiastki trójmianu kwadratowego. Niby nic nadzwyczajnego jednak gdy chcę porównać dwie zmienne operatorem cmp program wariuje. Nie mam pojęcia gdzie tkwi błąd, proszę o wytłumaczenie
format PE console
entry start
include 'win32a.inc'
section ".code" code readable writeable executable
start:
ccall [printf],string0
ccall [scanf],szFnv,zmienna1
ccall [printf],string1
ccall [scanf],szFnv,zmienna2
ccall [printf],string2
ccall [scanf],szFnv,zmienna3
xor eax,eax
mov eax,[zmienna2]
imul eax
xor ebx,ebx
xor ecx,ecx
mov ebx,[zmienna1]
mov ecx,[zmienna3]
imul ebx,ecx
imul ebx,4
sub eax,ebx
cmp eax,0
ja .blad ; <------- tutaj gdzies jest problem zawsze mimo ujemnego eax wywoluje
; procedure obslugi bledu
ccall [printf],szFnv,eax
cinvoke getchar,0
cinvoke getchar,0
cinvoke ExitProcess,0
.blad:
ccall [printf],string3
cinvoke getchar,0
cinvoke getchar,0
cinvoke ExitProcess,0
section '.bss' readable writeable
szFnv db "%i",0
szEnv db "%d",0
zmienna1 dd 0
zmienna2 dd 0
zmienna3 dd 0
string0 db "Dany jest trojmian kwadratowy ax^2 + bx + c. Podaj wspolczynnik a: ",0 ;lancuchy znakow do wyswietlenia
string1 db "Podaj wspolczynnik b: ",0
string2 db "Podaj wspolczynnik c: ",0
string3 db "Blad! Zbyt duze zadeklarowane zmienne. Ktoras z liczb nie miesci sie w przedziale -46335 < a | b | c < 46335.",0
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL',\
msvcrt,'MSVCRT.dll'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'
import user,\
DialogBoxParam,'DialogBoxParamA',\
CheckRadioButton,'CheckRadioButton',\
GetDlgItemText,'GetDlgItemTextA',\
IsDlgButtonChecked,'IsDlgButtonChecked',\
MessageBox,'MessageBoxA',\
EndDialog,'EndDialog'
import msvcrt,\
printf,'printf',\
scanf,'scanf',\
getchar,'getchar'
Dodam tylko, że gdy normalnie wyświetlam eax printfem wszystko jest ok. Wynik taki jaki być powinien. Problem zaczyna się gdy chcę porównać eax i wykonać ew skok. Do etykiety .błąd skacze nawet gdy eax wychodzi mi ujemne ;/
dodanie znacznika <code class="asm"> - fp