wo ist der denkfehler??



  • ;daten:
    
    meldung dw ?
    numbertest db 52
    number_as_string dw ?
    
    ;daten ende
    
    mov ax, number
            mov bx, 10
    
    ; endlosschleife!?
    LetLoopStart:
            xor dx, dx ;damit dx gesichert "leer" ist
            div bx
            cmp ax, 0
            add dx, 48
            mov number_as_string, dx
            mov meldung, ax
            add meldung, 48
                invoke MessageBox, NULL,addr number_as_string, addr MsgCaption, MB_OK
                invoke MessageBox, NULL,addr meldung, addr MsgCaption, MB_OK   
            JNZ LetLoopStart
    

    der gibt mir beim ersten durchlauf korrekter weise erst ne 2 udn dann ne 5 aus, doch dann kommt statt ner 5 und ner 0 und dem ende
    ne 1 und ne 0 im wechsel ... endlosschleife!!

    wo baue ich da bockmist?

    danke + cu



  • kann es sein, daß invoke MessageBox, NULL,addr number_as_string, addr MsgCaption, MB_OK die register ax bis dx für eigene zwecke benutzt und nicht wiederherstellt?



  • korrekterweise liefert dir windows in EAX den Returncode für die MessageBox, was aber ein cmp ax,0 bringt, das bleibt wohl ein geheimniss 😉 (denn die Winfunktionien dazwischen verändern mit sicherheit die Flags, von daher kann man am ende auch kein JNZ schreiben. Außderdem verändert die Winfunktion auch EBX bis EDX... Also vorher POPPEN (nicht falsch verstehen 🙄 ). Wenn man WinAPIs aufruft, die sowieso mindestens 600 bis noch mehr Befehle enthalten, kommt es nicht mehr auf 2-3 Instruktionen in deiner schleife an.



  • Du dividierst number in AX solange durch 10 bis AX 0 hat und addierst zu dem Rest in DX 48, dann gibst du denn Rest+48 sowie den dividierten Wert in AX+48
    aus.
    Ist das richtig so, was möchteste du damit bezwecken.
    Wenn du das JNZ auf AX beziehst steht CMP AX,0 an der falschen Stelle.
    Ausserdem solltest du die relevanten Register sichern.

    LetLoopStart:
            xor dx, dx ;damit dx gesichert "leer" ist 
            div bx
            add dx, 48
            mov number_as_string, dx
            mov meldung, ax
            add meldung, 48
            push ax           //Register sichern da dir die unteren Zeilen
            push bx           //die Registerwerte ändern 
                invoke MessageBox, NULL,addr number_as_string, addr MsgCaption, MB_OK
                invoke MessageBox, NULL,addr meldung, addr MsgCaption, MB_OK 
            pop bx
            pop ax
            cmp ax, 0
            JNZ LetLoopStart
    


  • danke leute jetzt gehts

    die mesageboxen waren eigentlich nur zur fehler suche schnell reibgebastelt ohne an die folgen zu denken(zwecks register manipulation)

    ich hatte einfach ne endlosschleife udn wollte wissen wo der fehler ist

    dann habe ich son bissel rumprobiert udn dabei aus irgend einem grund mal das cmp ax, 0 nach vorn gepackt, weil ich dann mit ax noch was anderes gemacht hatte ...

    und nicht wieder rückgängig gemacht ...

    und was das soll: es soll ne funktion werden, die mir ne zahl in nen string umwandelt ... um den rest, der noch fehlt, kümmere ich mich noch 😉

    danke nochmals udn cu

    ps: und das mit den verenderlichen registern brennt sich gerade in mein hirn rein!!!


Anmelden zum Antworten