| |
|
|
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
|
|
|
| |
|
|
|
| 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:
schreiben aber genauso auch:
Das gilt per procs wie per nprocs. |
|
|
| |
|
|
|
funkheld | Hmm.., mit push und pop ändert sich das Ergebnis nicht.
Gruss
|
|
|
| |
|
|
|
| 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. |
|
|
| |
|
|
|
| Noch ein kleiner TIP: kannst Du komplett fallen lassen da der Rückgabewert der in EAX abgelegte Wert ist. So auch bei Windows-APIs. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
| 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:
{$cleq}
nProc test.ifgleich
parameters v&,w&
mov eax,1
mov ebx,v&
mov ecx,w&
cmp ebx,ecx
je uebersprung
mov eax,0
uebersprung:
endproc
nProc test.ifkleiner
parameters v&,w&
mov eax,1
mov ebx,v&
mov ecx,w&
cmp ebx,ecx
jl uebersprung
mov eax,0
uebersprung:
endproc
nProc test.whileZaehle
parameters v&
mov ebx,v&
xor ecx,ecx
anfang:
add ecx,1
'schleifenkörper, ecx ist hier 1 bis 10
cmp ecx,ebx
jge uebersprung
jmp anfang
uebersprung:
mov eax,ecx
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 gibt aus:
0 1 1 0 10 wobei eben dies hier ja selbes Ergebis liefert:
und dies hier eine optimiertere Variante davon ist:
und es noch kürzer geht:
und es auch noch "cooler" geht:
Hoffe hilft. |
|
|
| |
|
|
|
funkheld | Ja danke, das sieht ja gut aus. Das sind schöne Beispiele, die ich gut anwenden kann.
Danke.
Gruss |
|
|
| |
|
|