a = 20000
b = 200
i = a
While i < a + b
Debug i
i + 1
Wend
Meine Frage: Wird bei jedem Schleifendurchlauf die Addition a + b ausgeführt ? Oder wird schon im vorraus a + b gegen einen konstanten Wert ersetzt, da sich ja a und b während der Schleife nicht ändern?
PS: Wie komme ich für diese kleine Beispiel an den Assembler-Code heran?
Lebostein hat geschrieben:Hi,Meine Frage: Wird bei jedem Schleifendurchlauf die Addition a + b ausgeführt ? Oder wird schon im vorraus a + b gegen einen konstanten Wert ersetzt, da sich ja a und b während der Schleife nicht ändern?
Idealerweise sollte bereits der 'Entwickler' wissen ob es konstante Werte sind und dann natürlich #a bzw #b verwenden.
Oder eben gleich die Zahlen (und dann natürlich bereits ausrechnen)
Wie es der Compiler umsetzt weiss ich nicht (habe ich nicht nachgeschaut)
Siehste! Geht doch....?! PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
; a = 20000
MOV dword [v_a],20000
; b = 200
MOV dword [v_b],200
;
; i = a
PUSH dword [v_a]
POP dword [v_i]
; While i < a + b
_While1:
MOV ebx,dword [v_i]
MOV edi,dword [v_a]
ADD edi,dword [v_b]
CMP ebx,edi
JGE _Wend1
; Debug i
; i + 1
INC dword [v_i]
; Wend
JMP _While1
_Wend1:
Das Listing zeigt, daß in der While/Wend-Schleife mit "ADD edi,dword [v_b]" bei jedem Schleifendurchlauf eine erneute Addition von A und B stattfindet, wie die vorherigen Postings ja auch schon vermutet und begründet haben.
Na der Compiler kann ganz einfach schauen, ob die Werte in der Schleife
verändert werden, wenn nicht, sind sie konstant für diese Schleife und
die Summe muss nur einmal berechnet werden...
; While i < #a + #b
_While1:
MOV ebx,dword [v_i]
CMP ebx,20200
JGE _Wend1
; Debug i
; i + 1
INC dword [v_i]
; Wend
JMP _While1
_Wend1:
PS: kann man des ASM-Output bzw. -Input standardmäßig einschalten, so dass er immer generiert wird? Kann in der PB-IDE keine Compliereinstellungen finden...