Deutsch
Forum

Bekomme falsches Ergebnis bei XPSE in der Schleife.

 

funkheld
Hallo, guten Tag, ich habe ein Problem.
Warum kommt unten das Ergenis 6 raus?
Wenn ich die Whilelloop rausnehme kommt richtig 9 raus.

Danke.
Gruss
 
18.04.2012  
 



Du musst davon ausgehen, dass Windows-APIs wie auch XPSE-Funktionen
wie auch Kontrollstrukturen die ASM-Registerwerte ändern weil sie mit ihnen arbeiten.

Möchte man mit diesen Werten arbeiten dann sollte man sie z.B. mit push und pop
sichern/ wiederherstellen. Bei manchen APIs ist dies sogar explizit notwenwie z.B.
bei LineDDA oder manch anderen ENUM-Procs.

Würdest Deine Schleife also nach cmp bzw. test und jmp bzw. jle oder jl umstellen -
also ohne While, dann würden auch die Registerwerte nicht beeinflusst oder nutze
eben push und pop.

Übrigens... je nach dem was einem liegt...

Du kannst natürlich:
nproc Addi(long x,y){ ... }


schreiben aber genauso auch:

Das gilt für procs wie für nprocs.
 
18.04.2012  
 




funkheld
Hmm.., mit push und pop ändert sich das Ergebnis nicht.

Gruss
 
18.04.2012  
 



Das WhileLoop und Wend nutzt ebenso mindestens eax und ebx,

wenn dann müsstest dein add eax,ebx abkapseln aber Du kannst wiederum
auch nicht davon ausgehen dass das while den ebx Wert unverändert in die Schleife
durchlässt.

In diesem Fall eignet sich das Mischen mit ASM nicht. Das wiederum ist wohl bei allen
"ehrlichen" nativen Programmiersprachen der Fall und eben auch so bei Windows-APIs
um ein Mehr an Geschwindigkeit zu erreichen bzw. um nicht unnötig Registerwerte zu sichern.

Du könntest aber Deine Schleife (also das while wend) auch komplett nach asm
umsetzen (wie oben geschrieben) mit cmp bzw. test(-asm)-Anweisungen.

Wenn Du schreibst was genau Du erreichen möchtest dann kann ich Dir den
ASM dazu auch aufschreiben.
 
18.04.2012  
 



Noch ein kleiner TIP:
kannst Du komplett fallen lassen da der Rückgabewert
der in EAX abgelegte Wert ist. So auch bei Windows-APIs.
 
18.04.2012  
 




funkheld
Jup, danke.
eax habe ich rausgelassen, jetzt funktioniert es.

Aber dieses funktioniert nicht mit der typischen MASM oder JWASM-SChleife:

Der XPIA kennt diese typische Schleife wieder.

Gruss
 
18.04.2012  
 




funkheld

cmp bzw. test und jmp bzw. jle oder jl


Wenn du mal bitte eine ASM-Demo machen könntest für XPSE, welches eine if-Schleife, eine Whileloop-Schleife und eine While-Schleife darstellt, damit könnte ich dann viel mit anfangen.

Danke.

Gruss
 
18.04.2012  
 



Morgen,

wie hier (  [...]  ) bereits geschrieben kannst Du if, while, whileloop einfach direkt verwenden
ohne die deutlich schmächtigere High-Level-Syntax (HLS) von jwasm.

Ein paar plakativ-gestaltete ASM-Beispiele für if, while und Zählschleife ohne HLS
könnten so aussehen:
und gibt aus:

0
1
1
0
10

wobei eben dies hier ja selbes Ergebis liefert:
 {$cleq}

nProc test.ifgleich

    parameters v&,w&

    if v&=w&

        return 1

    else

        return 0

    endif

endproc

nProc test.ifkleiner

    parameters v&,w&

    if v&<w&

        return 1

    else

        return 0

    endif

endproc

nProc test.whileZaehle

    parameters v&

    whileloop v&

        'schleifenkörper

    wend

    sub eax,1'<-- nicht wichtig, nur kosmetisch damit 10 zurück gegeben wird

endproc

cls
print test.ifgleich(9,10)
print test.ifgleich(10,10)
print test.ifkleiner(9,10)
print test.ifkleiner(10,10)
print test.whileZaehle(10)
waitInput
end

und dies hier eine optimiertere Variante davon ist:
 {$cleq}

nProc test.ifgleich

    parameters v&,w&
    case v&=w& : return 1
    return 0

endproc

nProc test.ifkleiner

    parameters v&,w&
    case v&<w& : return 1
    return 0

endproc

nProc test.whileZaehle

    parameters v&

    whileloop v&

        'schleifenkörper

    wend

    sub eax,1'<-- nicht wichtig, nur kosmetisch damit 10 zurück gegeben wird

endproc

cls
print test.ifgleich(9,10)
print test.ifgleich(10,10)
print test.ifkleiner(9,10)
print test.ifkleiner(10,10)
print test.whileZaehle(10)
waitInput
end

und es noch kürzer geht:
 {$cleq}

nProc test.ifgleich

    parameters v&,w&
    return v&=w&

endproc

nProc test.ifkleiner

    parameters v&,w&
    return v&<w&

endproc

nProc test.whileZaehle

    parameters v&

    whileloop v&

        'schleifenkörper

    wend

    sub eax,1'<-- nicht wichtig, nur kosmetisch damit 10 zurück gegeben wird

endproc

cls
print test.ifgleich(9,10)
print test.ifgleich(10,10)
print test.ifkleiner(9,10)
print test.ifkleiner(10,10)
print test.whileZaehle(10)
waitInput
end

und es auch noch "cooler" geht:
 {$cleq}

nProc test.ifgleich(long v,w){ return v&==w& }

nProc test.ifkleiner(long v,w){ return v&<w& }

nProc test.whileZaehle(long v){

    whileloop v {

        'schleifenkörper

    }

    sub eax,1'<-- nicht wichtig, nur kosmetisch damit 10 zurück gegeben wird

}

cls
print test.ifgleich(9,10)
print test.ifgleich(10,10)
print test.ifkleiner(9,10)
print test.ifkleiner(10,10)
print test.whileZaehle(10)
waitInput
end

Hoffe hilft.
 
19.04.2012  
 




funkheld
Ja danke, das sieht ja gut aus.
Das sind schöne Beispiele, die ich gut anwenden kann.

Danke.

Gruss
 
19.04.2012  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

11.627 Betrachtungen

Unbenanntvor 0 min.
funkheld29.07.2017
iF28.11.2014
mein02.06.2013
Andreas Koch14.01.2013
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

funkheld (5x)
iF (4x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie