Italia
Foro

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 naturalmente:
nproc Addi(long x,y){ ... }


schreiben aber genauso auch:

Das gilt per procs wie per 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 Di più 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 per XPSE, welches eine if-Schleife, eine Whileloop-Schleife und eine While-Schleife darstellt, damit potuto 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 per 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  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

11.559 Views

Untitledvor 0 min.
funkheld29.07.2017
iF28.11.2014
mein02.06.2013
Andreas Koch14.01.2013
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

funkheld (5x)
iF (4x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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