Diese Seite enthält einige Hinweise aus der beim MASM32-SDK mitgelieferten Hilfe.
Zu vermeidende AssemblerbefehleLaut Abschnitt „Introduction to Assembler / Flat memory Model” sollten einge Assemblerbefehle nicht genutzt werden, da eine individuelle Codierung einen schnelleren Ablauf ergibt:
Empfohlener Standard zur Registersicherung in Prozeduren
meineprozedur proc ..... push ebx push esi push edi ; Hier, was in der Prozedur gemacht wird pop edi pop esi pop ebx ret myproc endpHinweis: Nur die in der Prozedur geänderten Register Register EBX, ESI und EDI sollten gesichert und wieder hergestellt werden. Einfache SchleifentechnikenSchleife, die x-mal ausgeführt werden sollmov edx, 100 ;Anzahl Durchläufe start: ; Hier was gemacht werden soll dec edx ;Schleifenzähler um 1 reduzieren jnz start ;Wiederholen falls noch nicht fertigSiehe auch Repeat- und While-Schleifen weiter unten auf dieser Webseite. Byteweise Zeichenkette lesen, bearbeiten und abspeichern
AblaufsteuerungZur Programmablaufsteuerung sind einige Makros vorhanden. Ihr Einsatz bewirkt eine bessere Ingerpretierbarkeit des Quellprogramms..if, .elseif, .else, .endif, .until und .while mit VergeichsoperatorenDie unterstützten Vergleichsoperatoren sind== gleich != ungleich > größer als >= größer als oder gleich < kleiner als <= kleiner als oder gleich & bitweiser Vergleich im Format Ausdruck & Bitnummer) ! logisch Nein && logisch Und || logisch Oder CARRY? Carrybit gesetzt OVERFLOW? Überlaufbit gesetzt PARITY? Paritätsbit gesetzt SIGN? Vorzeichenbit gesetzt ZERO? Nullbist gesetzt
Repeat- und While-SchleifenDie Repeat-Schleife wird so lange durchlaufen, bis eine Endebedingung erfüllt wird. Die Endbedingung wird nach der Aktion abgefragt. Somit wird die Aktion mindestens einmal durchgeführt. Die Aktion muss so codiert werden, dass die nachfolgende Vergeichsoperation zu einem eindeutigen Ergebnis führt..repeat ;hier die Aktion codieren. ;.until VergleichsoperationBei der While-Schleife wird die Endbedingung vor der Aktion abgefragt. Somit wird die Aktion dann nicht durchgeführt, wenn die Endbedingung bereits vor Eintritt in die While-Schleife erfüllt war. Auch hier gilt, dass die Aktion so codiert werden muss, dass die Vergeichsoperation zu einem eindeutigen Ergebnis führt. .while Vergleichsoperation ;hier die Aktion codieren. ;.endwBeide Schleifen lassen sich verhältnismäßig einfach ohne Nutzung von .repeat oder .while codieren. Die Nutzung von .repeat oder .while verbessert die Lesbarkeit des Quellcodes. Beispiel zu .repeat, .until, .if, elseif, .else und endifInnerhalb der Repeat-Schleife wird die Eingabe einer Zahl im Bereich 1 bis 200 angefordert. Damit mit dem Zahlenwert gerechnet werden kann, muss die aus der Eingabe als String vorliegende Zahleneingabe in eine Integerzahl gewandelt werden. Dies erfolgt durch invoke atodw, lpstring.Innerhalb .if und .endif wird ein einziger Write-Befehl ausgewählt und angewendet. Seine Anwendung verändert jedoch das eax-Register. Deshalb wird der Inhalt des eax-Registers vor .if gesichert und nach .endif wieder hergestellt. Das Beispiel demonstriert die Mächtigkeit der beim MASM32-SDK mitgelieferten Beigaben: Das beigegebene atodw erspart die Codierung von etwa 20 Programmzeilen. Das Beispiel ist nicht umfassend: Es wird nicht geprüft, ob die Eingabe eine Zahl ist. Wenn keine Zahl eingegeben wurde, wird die Eingabe dennoch als Zahl interpretiert. .586 .model flat,stdcall .xlist option casemap:none include \masm32\include\windows.inc include \masm32\macros\macros.asm include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include c:\masm32\include\msvcrt.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib c:\masm32\lib\msvcrt.lib .list .data lpstring dd ? ;zeigt auf den per Input eingetippten String .code start: .repeat write "Bitte geben Sie eine Ganzzahl im Bereich 1 bis 200 ein.",13,10 write "99 beendet das Programm.",13,10 mov lpstring, input("Ihre Eingabe: ") invoke atodw, lpstring ;Eingabe konvertieren von String nach Integer ;Integer steht dann in eax push eax ;sichern wegen der write-Befehle .if eax == 99 write "Das Programmende wurde angefordert",13,10 .elseif eax > 0 && eax < 201 write "Die Zahleneingabe war O.K.",13,10 .else write "So nicht!!!",13,10 .endif pop eax .until eax == 99 inkey ;Tastendruck abwarten bei Programmende invoke ExitProcess, 0 end start Ablaufbeispiel:C:\masm32\Uebung>repeattest Bitte geben Sie eine Ganzzahl im Bereich 1 bis 200 ein. 99 beendet das Programm. Ihre Eingabe: 201 So nicht!!! Bitte geben Sie eine Ganzzahl im Bereich 1 bis 200 ein. 99 beendet das Programm. Ihre Eingabe: 200 Die Zahleneingabe war O.K. Bitte geben Sie eine Ganzzahl im Bereich 1 bis 200 ein. 99 beendet das Programm. Ihre Eingabe: 1 Die Zahleneingabe war O.K. Bitte geben Sie eine Ganzzahl im Bereich 1 bis 200 ein. 99 beendet das Programm. Ihre Eingabe: 99 Das Programmende wurde angefordert Press any key to continue ... C:\masm32\Uebung> |