PrimCheck



  • Ich glaub ich hab grad en knick in der logik oO
    naja mein code:

    include 'INCLUDE/win32ax.inc'
    .code
    start:
    	invoke	AllocConsole
    	invoke	GetStdHandle,STD_OUTPUT_HANDLE
    	mov [std_output],eax
    	invoke	GetStdHandle,STD_INPUT_HANDLE
    	mov [std_input],eax
            ;Wandel in Zahl um
            mov ebp, temp_input
            mov dh, [ebp]
            sub eax, 48
            mov edx, 10000
            mul edx
            add [Zahl], eax
            mov dh, [ebp+1]
            sub eax, 48
            mov edx, 1000
            mul edx
            add [Zahl], eax
            mov dh, [ebp+2]
            sub eax, 48
            mov edx, 100
            mul edx
            add [Zahl], eax
            mov dh, [ebp+3]
            sub eax, 48
            mov edx, 10
            mul edx
            add [Zahl], eax
            mov dh, [ebp+4]
            sub eax, 48
            add [Zahl], eax
            ;fertig die Zahl ist in der vari Zahl
            mov ebx, 2
            mov edx, 0
            mov eax, [Zahl]
            cmp eax,ebx
            je PrimZahl
    
    	NEXT:
            mov edx, 0
            mov ebx, 2
            mov eax, [Zahl]
            cmp eax,ebx
            je PrimZahl
            div ebx
            cmp edx,0
            je Keine_PrimZahl
            mov eax, [Zahl]
            add ebx, 1
            jmp NEXT 
    
    	PrimZahl:
    	invoke WriteFile,[std_output],"Es ist eine Primzahl!",22,NULL,NULL
    	jmp EXIT
    
    	Keine_PrimZahl:
    	invoke WriteFile,[std_output],"Es ist keine Primzahl!",23,NULL,NULL
    
    	EXIT:
    	invoke	Sleep,10000
    	invoke	FreeConsole
    	invoke	ExitProcess,0
    .end start
    ;strings
    
    ;varis
    std_output dd 0
    std_input  dd 0
    temp_input db '00007'
    Zahl dd 0
    

    Der soll folgendes machen:
    ich trag in temp_input eine Zahl ein in form eines Strings dieser string soll in eine Zahl umgewandelt werden und in Zahl gespeichert werden. Jetzt soll geprüft werden ob die Zahl ne Primzahl ist.
    Leider wird mir immer ausgegeben das es keine Primzahl ist auch bei Primzahlen 😞
    Hoffe es kann mir jemand helfen ich brauch das prog morgen für mein referat!
    /edit Assembler ist der FASM

    mfg tobZel


  • Mod

    sieht auf den ersten Blick wie eine Endlosschleife aus, durch

    mov ebx,2
    

    fängst du ja immer wieder von vorn an; das hat nach dem Label NEXT nichts verloren



  • thx für die antwort
    ich hab das jetzt entfernt.
    ich bekomme aber immer noch die ausgabe das es keine Primzahl ist
    obwohl '00007' doch in 7 umgewandelt werden sollte und 7 eine Primzahl ist

    /edit ich hab jetzt nochmal geguckt also er kann jetzt prüfen ob das eine Primzahl ist aber er wandelt den string nicht richtig in eine Zahl um
    Hat jemand ne idee für ne andere "atoi" funktion?

    mfg tobZel


  • Mod

    Du solltest vielleicht den echten Input verarbeiten. statt

    mov dh, [ebp]
    

    soll es wohl besser

    movzx eax, byte ptr[ebp]
    

    heißen. Die korrekte Syntax für Angabe der Operandengröße für deinen Assembler musst du selbst finden. Im Übrigen ist für die Multiplikationen die Zwei- oder Dreioperandenform von imul sinnvoll.



  • thx für die antworten ich habs jetzt über loadsb gelöst!

    mfg tobZel



  • Ist dir wahrscheinlich auch selbst schon klar, aber deine atio-Funktion ist doch ein wenig... unflexibel.
    Folgenden Code verwende ich in meinem tollen IT-Player (ja, es gibt bald endlich mal wieder eine neue Version *Werbetrommel ruehr* :D) :

    xor   eax,eax
    	mov   ebx, 0Ah
    @@DecLoop:
    	movzx edx, [byte ptr edi]
    	sub   edx, 30h
    	js     short @@ExitProc
    	cmp   edx, 09h
    	ja     short @@ExitProc
    	inc   edi
    	add   eax, edx
    	dec   ecx
    	jz     short @@ExitDecLoop
    	mul   ebx
    	jmp    short @@DecLoop
    @@ExitDecLoop:
    	mov    [word ptr Frequency], ax
    @@ExitProc:
    	ret
    

    Nur falls Interesse an einer Alternativimplementierung besteht...
    Die Adresse des Strings steht in edi, die Laenge in ecx.


  • Mod

    Nur so zum Spaß, wir könne das noch ein bisschen kürzen:

    xor   eax, eax
        add   edi, ecx
        neg   ecx
        jmp   short @@LoopEntry
    @@IncLoop:
        inc   ecx
        lea   eax, [4*eax+eax]
        lea   eax, [2*eax+edx]
    @@LoopEntry:
        jz    short @@ExitLoop
        movzx edx, [byte ptr edi+ecx]
        sub   edx, 30h
        cmp   edx, 10
        jb    short @@IncLoop
    @@ExitLoop:
    

    hm, dachte eigentlich, da geht noch mehr...



  • *lol* Nicht schlecht. 😃
    Naja, ich hab' noch genug Code zum Optimieren, wenn mir mal langweilig wird, aber den Vorschlag speicher ich mir auf jeden auch mal ab. 🙂



  • Ich weis das man sie flexibler machen kann ist aber so:
    Das ist ein Referat, ich bin in der 8. Klasse oO, meine Mitschüler und Lehrer haben kp.
    Die würden sowas nicht verstehen oO.
    Ich hab ihm gesagt das ich eh davon abraten würde asm zu presentieren ( ist en Referat über Programmiersprachen ) aber er wollte es unbedingt. Naja wird lustig werden :).

    mfg tobZel


  • Mod

    Nobuo T schrieb:

    *lol* Nicht schlecht. 😃
    Naja, ich hab' noch genug Code zum Optimieren, wenn mir mal langweilig wird, aber den Vorschlag speicher ich mir auf jeden auch mal ab. 🙂

    Wenn du ein paar interessante Schnipsel posten könntest. Ist hin und wieder ein gute Fingerübung zum entspannen 🙂


Anmelden zum Antworten