Kłopot z operatorem cmp w asemblerze

0

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

2

ja - dla liczb bez znakowych
jg - dla liczb ze znakiem

1 użytkowników online, w tym zalogowanych: 0, gości: 1