JASMIN DOKUMENTATION ZUM PROGRAMM COPYRIGHT 1994, JAN LAITENBERGER Inhalt ÍÍÍÍÍÍ Kapitel 0: Vorwort, Was leistet JASMIN? fr wen? Kapitel 1: Freeware, bitte lesen!! Kapitel 2: Grundlegendes ber den Assembler JASMIN Kapitel 3: šbersicht ber die Maschinensprache-Befehle Kapitel 4: Assembler-Direktiven ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Kapitel 0 Was leistet JASMIN? fr wen? ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Der Name "JASMIN" steht fr Jan ASseMbler INput. Das Programm wandelt einen Quelltext in 8088/8086-Maschinensprache in ein ausfhrbares Pro- gramm um. JASMIN bersetzt einen Quelltext direkt in eine COM-Datei und untersttzt keine OBJ- und EXE-Dateien. JASMIN ist nicht so m„chtig, wie man das heute von einem Assembler er- wartet. Das war auch nicht mein Ziel. JASMIN habe ich fr den Einsatz auf dem Atari Portfolio entwickelt und daher das Programm einfach und speicherplatzsparend gehalten. Die Bildschirmausgaben sind deswegen auch nicht l„nger als 40 Zeichen/Zeile. Genaugenommen ist JASMIN ein Maschinensprachebersetzer, der die Mnemoniks (= symbolische Opera- tionsschlssel, z.B. MOV AX) in eine dem Computer verst„ndliche Folge von Zeichen umsetzt. JASMIN untersttzt nicht den gewohnten Befehlsum- fang eines Assemblers! JASMIN eignet sich fr all diejenigen, die unter MS-DOS nur begrenzt Speicherplatz auf Disketten, Ramcards, etc. zur Verfgung haben. Aber auch fr Einsteiger in Maschinensprache ist JASMIN hervorragend geeig- net, da der Programmierer alle CPU Befehle verwenden kann ohne ein um- st„ndliches Gerst von Assemblerbefehlen in sein Programm einbinden zu mssen (CODE SEGMENT ASSUME CS:CODE,DS:DATEN ORG 100h START: ... CODE ENDS ...) ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Kapitel 1 Freeware, bitte lesen!! ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Ich m”chte dieses Programm allen Interessierten kostenlos zur Verwen- dung berlassen und dazu ermutigen es auch an andere weiterzugeben, solange ALLE Dateien OHNE Žnderungen kopiert werden !! Ich habe wirklich viel Zeit in dieses Programm gesteckt, um einen gu- ten Kompromiá zwischen dem Nutzen und der Gr”áe des ausfhrbaren Pro- gramms zu finden. Herauszufinden, ob mir das gelungen ist, m”chte ich Ihnen berlassen. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Kapitel 2 Grundlegendes ber den Assembler JASMIN ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Kommandozeilenaufruf ßßßßßßßßßßßßßßßßßßßß Sie rufen den Assembler von DOS aus wie folgt auf: JASMIN [ [Quelldatei[.JAS]] [Zieldatei[.COM]] ] Das heiát im Klartext: Sie k”nnen das Programm mit keinem, einem oder mit 2 Kommandozeilenparametern aufrufen. Wenn Sie ... ... keinen Parameter angeben, werden Sie nach den Namen fr Quell- und Zieldatei gefragt. Wenn Sie die Frage nach der Zieldatei nur mit beantworten, so wird der Name der Quelldatei mit der Extension ".COM" verwendet. ... einen Parameter angeben, so wird dieser Dateiname fr die Quell- datei verwendet, der Name der Zieldatei wird wie im letzten Fall ermittelt (selber Name + ".COM") ... zwei Parameter eingeben, wird der Erste als Quelldateiname, der Zweite als Zieldateiname verwendet. Hinweis: Wenn Sie einen Dateinamen ohne Punkt eingeben, so wird beim Quelldateinamen grunds„tzlich die Extension ".JAS" bzw beim Zieldatei- namen die Extension ".COM" angeh„ngt. Wenn Sie einen Dateinamen ohne Extension eingeben m”chten, so muá dieser mit einem Punkt abgeschlos- sen sein! Bildschirmausgaben von JASMIN ßßßßßßßßßßßßßßßßßßßßßßßßßßßßß JASMIN --- Freeware --- Version 1.6 8088/86 Jan laitenberger ASseMbler INput max. size of COM file: 65535 bytes Mit dieser Ausgabe werden Sie bei jeder šbersetzung begrát. Sie werden ber die Gr”áe des Speicherbereiches, den JASMIN fr die zu bersetzende COM-Datei reservieren konnte, informiert. Wenn Sie keine Parameter beim Aufruf bergeben haben, folgen nun Fragen nach Quell- und Zieldateinamen. Danach wird die Assemblerdatei Zeile fr Zeile bersetzt. Die aktuelle Zeile wird in eckigen Klammern angezeigt, w„h- rend eine INCLUDE-Datei assembliert wird erscheint hinter den eckigen Klammern ein "I". Tritt beim šbersetzungsvorgang ein Fehler auf, wird eine Fehlermeldung im Klartext ausgegeben, wenn sich die Datei "JASMIN.ERR" im Verzeich- nis befindet. Ist diese Datei nicht vorhanden, so wird nur eine Feh- lernummer ausgegeben. Nach der Fehlermeldung wird (zum leichteren Auf- finden im Quelltext) die fehlerhafte Zeile angezeigt. Meine Philosophie ßßßßßßßßßßßßßßßßß ú Groá- und Kleinschreibung wird nicht unterschieden (auch nicht bei Adressmarken). ú Es ist unerheblich, wieviele Tabulatoren/Leerzeichen (Trennzeichen) in einer Quelltext-Zeile stehen, der Maschinenbefehl darf jedoch nicht durch Trennzeichen unterbrochen werden, auf einen Maschinen- befehl muá mindestens ein Trennzeichen folgen, wenn auf den Befehl Operanden folgen. ú Speicheroperanden mssen immer in eckigen Klammern eingefasst sein, sonst werden sie als Adressmarken oder Imm-Zahlen interpretiert. ú Adressmarken werden mit "@" eingeleitet, die Definition einer Marke wird mit einem Doppelpunkt abgeschlossen und darf keine Trennzeichen enthalten. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Kapitel 3 šbersicht ber die Maschinensprache-Befehle ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ In diesem Kapitel werden Sie nicht lernen, wie man in Maschinensprache programmiert, dafr sollten Sie sich lieber ein gutes Buch kaufen. Ich m”chte an dieser Stelle nur ansprechen, welche Befehle es gibt, was sie machen und mit welchen Operanden man sie aufruft. Der Befehlssatz der Intel 8088/86-CPU ist in Liste 1 zusammengestellt. Diese Befehle k”nnen in JASMIN-Quelltexten verwendet werden. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ AAA AAD AAM AAS ADC ADD AND CALL ³ ³ CBW CLC CLD CLI CMC CMP CMPSB CMPSW ³ ³ CWD DAA DAS DEC DIV HLT IDIV IMUL ³ ³ IN INC INT INTO IRET JA JAE JB ³ ³ JBE JCXZ JE JG JGE JL JLE JMP ³ ³ JNA JNAE JNB JNBE JNE JNG JNGE JNL ³ ³ JNLE JNO JNP JNS JNZ JO JP JPE ³ ³ JPO JS JZ LAHF LDS LEA LES LOCK ³ ³ LODSB LODSW LOOP LOOPE LOOPNE LOOPNZ LOOPZ MOV ³ ³ MOVSB MOVSW MUL NEG NOP NOT OR OUT ³ ³ POP POPF PUSH PUSHF RCL RCR REP REPE ³ ³ REPNE REPNZ REPZ RET RETF ROL ROR SAHF ³ ³ SAL SAR SBB SCASB SCASW SHL SHR STC ³ ³ STD STI STOSB STOSW SUB TEST WAIT XCHG ³ ³ XLAT XOR ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Liste 1 ÄÄÄÄÄÄÄÄÄÄÙ Jeder Befehl wird entweder mit keinem, einem oder mit zwei Operanden aufgerufen. Dabei kann ein Operand ein Register, eine Adressmarke, ei- ne Speicherstelle oder eine Konstante sein. Register (reg, reg8, reg16): ßßßßßßßßßßßßßßßßßßßßßßßßßßßß AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, ES, SS und das Flag-Register sind 16-Bit-Register. Jedes Register hat eine bestimme Bedeutung. In Ihren Programmen k”nnen Sie AX ... BP Werte zuweisen ohne gr”áeren Schaden anzurichten. CS ... SS werden beim Start eines von JASMIN bersetzten Programms geladen und enthalten alle den gleichen Wert. (JASMIN erzeugt ".COM"-Dateien!) AX, BX, CX, DX k”nnen auch als AH,AL, BH,BL, CH,CL und DH,DL (8-Bit- Register) angesprochen werden. Adressmarken (adr, shortadr): ßßßßßßßßßßßßßßßßßßßßßßßßßßßßß JASMIN gibt Ihnen die M”glichkeit fr Sprnge oder fr Variablen sym- bolische Namen zu definieren. Diese Marken sind im Prinzip Konstanten, deren Wert bei der šbersetzung des Quelltextes ermittelt wird. Eine Marke muá mit einem Klammeraffen ("@") eingeleitet werden. Die Defini- tion einer Adressmarke endet mit einem Doppelpunkt. Beispiel: @Loop: ; Definition einer Adressmarke ... ; weitere gltige Anweisungen JMP @Loop ; und Sprung zurck zur Marke Speicherstellen (mem, mem8, mem16): ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß In eckigen Klammern eingeschlossene Werte geben den Offset einer Spei- cherstelle an. Sie k”nnen damit auf beliebige Stellen im Speicher zu- greifen. JEDER Zugriff auf eine Speicherstelle muá in eckigen Klammern "[]" eingeschlossen sein! Das ist nicht bei allen Assemblern so! Nicht eingeklammerte Zahlen bzw. Angaben mit OFFSET werden von JASMIN als imm (s.u.) betrachtet! Wenn Sie auf Speicherstellen in anderen Segmenten zugreifen m”chten, so k”nnen Sie dies mit einem Segment-Pr„fix ("ES:","SS:","CS:","DS:") anzeigen. Dieser Befehl muá eine Zeile vor dem eigentlichen Speicher- zugriff stehen. Beispiele: MOV AH, [1234] ; AH wird mit dem Wert an Speicherstelle 1234 ; geladen MOV BYTE PTR [10], 5 ; weisen Sie einer Speicherstelle eine Kon- ; stante zu, mssen Sie ber BYTE / WORD PTR ; festlegen, ob es sich um eine 8- oder 16- ; Bit Operation handeln soll. @var: DW 0FF00h ... MOV AX, [OFFSET @var] ; bzw. krzer: MOV AX, [?@var] ; so k”nnen Sie auf einen Wert an einer ; Speicherstelle, die durch eine symbolische ; Adressmarke gekennzeichnet ist, zugreifen MOV BYTEPTR["$$"],"?" ; ist gleich: MOV BYTEPTR[2424h],3Fh MOV ES, 0 ; direkte Zuweisung fr die Segmentregister ; CS, DS, ES, SS ist nicht zul„ssig! ; ALSO: MOV AX,0 und dann MOV ES,AX MOV AX, B800h ; Textbildschirmspeichersegment CGA/EGA/VGA MOV ES, AX ; in das Extra-Segment laden ES: ; n„chster Zugriff in diesem Segment! MOV DL, [0] ; lese das Zeichen, das in der linken oberen ; Ecke auf dem Bildschirm steht -> DL ; meine Philosophie, aber schlechter Stil - ; die folgenden Anweisungen werden akzeptiert: MoV B Y T E ptr[9999h], 5 @label1: MOV A X, word PT R [10 99 h] add A X , A X ReT caLL @LABEL 1 ; Dieser Code ist fast kaum zu lesen. Vermeiden Sie es also bitte, ; die Freiheiten, die Ihnen JASMIN zugesteht voll auszuntzen! Konstanten (imm, imm8, imm16): ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß Zahlen im Bin„r-, Dezimal- oder Hexadezimalsystem oder als ASCII-String (imm8: 1 Zeichen, imm16: 2 Zeichen) Beispiele: ; dezimal: 0101b ; 5 0FFFFh ; 65535 WORDPTR -10h ; 65520 (=0FFF0h) BYTEPTR -10h ; 240 (=0F0h) 10d ; 10 255 "A" ; 65 "AB" ; 24889 (6139h) "A" ist das niederwertige ; "B" das h”herwertige Byte ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ³ Befehl ³ ³ Opcode Bedeutung Operanden ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ AAA ASCII Adjust After Addition keine ³ ³ AAD ASCII Adjust Before Division keine ³ ³ AAM ASCII Adjust After Multiplication keine ³ ³ AAS ASCII Adjust After Subtraction keine ³ ³ ADC Add with Carry reg,reg ³ ³ addiert den zweiten Operanden zum ersten, reg,mem ³ ³ zus„tzlich wird das Carryflag mitaddiert mem,reg ³ ³ reg,imm ³ ³ mem,imm ³ ³ ADD Integer Addition s. ADC ³ ³ AND Boolean AND s. ADC ³ ³ CALL Call Procedure adr ³ ³ reg16 ³ ³ mem16 ³ ³ CBW Convert Byte to Word keine ³ ³ CLC Clear Carry Flag keine ³ ³ CLD Clear Direction Flag keine ³ ³ CLI Clear Interrupt Flag keine ³ ³ CMC Complement Carry Flag keine ³ ³ CMP Compare Integers s. ADC ³ ³ CMPSB Compare String Bytes keine ³ ³ CMPSW Compare String Words keine ³ ³ CWD Convert Word to Doubleword keine ³ ³ DAA Decimal Adjust AL After Addition keine ³ ³ DAS Decimal Adjust AL After Subtraction keine ³ ³ DEC Decrement reg ³ ³ mem ³ ³ DIV Unsigned Division reg ³ ³ mem ³ ³ HLT Halt keine ³ ³ IDIV Integer Signed Division reg ³ ³ mem ³ ³ IMUL Integer Signed Multiplikation reg ³ ³ mem ³ ³ IN Input from I/O Port Akku,imm8 ³ ³ Akku,DX ³ ³ INC Increment reg ³ ³ mem ³ ³ INT Software Interrupt imm8 ³ ³ INTO Interrupt on Overflow keine ³ ³ IRET Interrupt Return keine ³ ³ JA/JNBE Jump Above/Jump Not Below or Equal Disp ³ ³ JAE/JNB Jump Above or Equal/Jump Not Below Disp ³ ³ JB/JNAE Jump Below/Jump Not Above or Equal Disp ³ ³ JBE/JNA Jump Below or Equal/Jump Not Above Disp ³ ³ JCXZ Jump CX=Zero Disp ³ ³ JE/JZ Jump Equal/Jump Zero Disp ³ ³ JG/JNLE Jump Greater/Jump Not Less or Equal Disp ³ ³ JGE/JNL Jump Greater or Equal/Jump Not Less Disp ³ ³ JL/JNGE Jump Less/Jump Not Greater or Equal Disp ³ ³ JLE/JNG Jump Less or Equal/Jump Not Greater Disp ³ ³ JMP Jump adr ³ ³ reg16 ³ ³ mem16 ³ ³ JNE/JNZ Jump Not Equal/Jump Not Zero Disp ³ ³ JNO Jump No Overflow Disp ³ ³ JNP/JPO Jump No Parity/Jump Parity Odd Disp ³ ³ JNS Jump No Sign Disp ³ ³ JO Jump if Overflow Disp ³ ³ JP/JPE Jump if Parity/Jump if Parity Even Disp ³ ³ JS Jump if Sign Disp ³ ³ LAHF Load AH with Flags keine ³ ³ LDS Load DS with Pointer reg16,mem32 ³ ³ LEA Load Effective Adress reg16,mem16 ³ ³ LES Load ES with Pointer reg16,mem32 ³ ³ LOCK Assert Hardware LOCK keine ³ ³ LODSB Load String Byte keine ³ ³ LODSW Load String Word keine ³ ³ LOOP Decrement CX and Branch Disp ³ ³ LOOPE Decrement CX and check Zeroflag Disp ³ ³ LOOPNE Decrement CX and check Zeroflag Disp ³ ³ LOOPNZ Decrement CX and check Zeroflag Disp ³ ³ LOOPZ Decrement CX and check Zeroflag Disp ³ ³ MOV Move Data reg,reg ³ ³ reg,mem ³ ³ mem,reg ³ ³ reg,imm ³ ³ mem,imm ³ ³ sreg,reg16 ³ ³ sreg,mem16 ³ ³ reg16,sreg ³ ³ mem16,sreg ³ ³ MOVSB Move String Byte keine ³ ³ MOVSW Move String Word keine ³ ³ MUL Unsigned Multiplication reg ³ ³ mem ³ ³ NEG Negate Integer reg ³ ³ mem ³ ³ NOP No Operation keine ³ ³ NOT Boolean Complement reg ³ ³ mem ³ ³ OR Boolean OR reg,reg ³ ³ reg,mem ³ ³ mem,reg ³ ³ reg,imm ³ ³ mem,imm ³ ³ OUT Output to Port imm8,Akku ³ ³ DX,Akku ³ ³ POP Pop Value off Stack reg ³ ³ segreg ³ ³ (nicht CS) ³ ³ POPF Pop Stack into Flagregister keine ³ ³ PUSH Push Value onto Stack reg ³ ³ segreg ³ ³ mem16 ³ ³ PUSHF Push Flagregister onto Stack keine ³ ³ RCL Rotate Through Carry Left reg,1 ³ ³ reg,CL ³ ³ mem,1 ³ ³ mem,CL ³ ³ RCR Rotate Through Carry Right s. RCL ³ ³ REP Repeat String Prefix MOVS ³ ³ STOS ³ ³ REPE/REPZ/REPNE/REPNZ Repeat String Prefix and chk ZF CMPS ³ ³ SCAS ³ ³ RET Return from Subroutine [imm8|imm16] ³ ³ RETF Return from Subroutine [imm16] ³ ³ ROL Rotate Left s. RCL ³ ³ ROR Rotate Right s. RCL ³ ³ SAHF Store AH in Flagregister keine ³ ³ SAL Shift Arithmetic Left s. RCL ³ ³ SAR Shift Arithmetic Right s. RCL ³ ³ SBB Subtraction with Borrow s. OR ³ ³ SCASB Scan String Byte keine ³ ³ SCASW Scan String Word keine ³ ³ SHL Shift Left (identisch mit SAL) s. SAL ³ ³ SHR Shift Right Logical s. RCL ³ ³ STC Set Carry Flag keine ³ ³ STD Set Direction Flag keine ³ ³ STI Set Interrupt Flag keine ³ ³ STOSB Store String Byte keine ³ ³ STOSW Store String Word keine ³ ³ SUB Subtraction with Integers s. OR ³ ³ TEST Test Bits s. OR ³ ³ WAIT Wait Until Not Busy keine ³ ³ XCHG Exchange reg,reg ³ ³ reg,mem ³ ³ XLAT Translate Byte keine ³ ³ XOR Boolean Exclusive OR s. OR ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Tabelle 1 ÍÍÍÍÍÍÍ; In Tabelle 1 sind die gltigen Kombinationen von Opcodes mit Operanden dargestellt. Die Abkrzungen bedeuten: adr Adress(mark)e Akku AX (16-Bit) oder AL (8-Bit) Disp Adressmarke, die nicht weiter als +- 127 Byte entfernt ist imm beliebige Zahl (8086 => h”chstens 16 Bit!) imm8 Zahl mit 8-Bit imm16 Zahl mit 16-Bit mem BYTE PTR [????] mem16 WORD PTR [????] reg AX, BX, CX, DX, AH, AL, BH, BL, CH, CL, DH, DL, SI, DI, BP, SP reg8 AH, AL, BH, BL, CH, CL, DH, DL reg16 AX, BX, CX, DX, SI, DI, BP, SP segreg CS, DS, ES, SS Wenn es nicht explizit anders angegeben ist, so mssen die Operanden in ihrer Gr”áe bereinstimmen! Beispiel: reg,mem kann sein reg8,mem8 oder reg16,mem16 - nichts anderes. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Kapitel 4 Assembler-Direktiven ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ $ Das Dollarzeichen kann bei bedingten Sprngen verwendet wer- den um Adressmarkierungen (in bersichtlichen F„llen) einzu- sparen. Es wird dadurch das ausfhrbare Programm nicht klei- ner! Geben Sie dem Sprungbefehl als Operand $+x. Dabei geben Sie mit x die Entfernung des Sprungziels an. Fr x=0 wird zum n„chsten Befehl im Programm gesprungen. VORSICHT: Sprn- ge dieser Art sind unbersichtlich! Sie k”nnen durch eine falsche Angabe auch in die Mitte eines Befehls springen und damit beliebig viel Unsinn anstellen! Beispiele: ... JCXZ $ + 11 ; CX=0 => Schleife berspringen CALL @ReadKey ; warte auf Tastendruck, Taste -> AX CMP AX, 27 ; ESC gedrckt ? JE $+2 ; JA => Schleife verlassen LOOP $-11 ; wieder zum CALL zurckspringen ... BYTEPTR Eine der beiden Anweisungen werden Sie ben”tigen, wenn Sie WORDPTR bei einer Instruktion die Operanden mem und imm verwenden m”chten. In diesem Fall kann der Assembler nicht wissen, ob der immediate-Wert ein Byte oder ein Wort darstellt - Sie mssen dies durch BYTE/WORD PTR angeben! Hinweis: Es ist egal ob BYTE/WORDPTR beim Speicher- oder Im- mediate-Operand angegeben wird. Die Angabe ist nicht n”tig, wenn die Gr”áe eines Operanden bestimmt werden kann (wenn es sich z.B. bei einem Operand um ein Register und beim Zweiten um eine Zahl oder Speicherstelle handelt.) Beispiele: MOV [1000h], WORD PTR 12h CMP BYTEPTR [10h], 35 MOV BYTE PTR AL, 10h ; Ok, aber unn”tig falsch ist: MOV WORD PTR AH, [0] ; WORDPTR wird ignoriert! MOV BYTE PTR [1], WORD PTR 255 ; Operandengr”áen MOV AH, WORD PTR 20h ; unterschiedlich MOV BYTEPTR [0], 256 ; 256 > MAX(BYTE) ! DB Mit diesen Anweisungen kann ein Byte bzw. Wort direkt ange- DW geben werden. Die nach DB folgenden Zahlen und Zeichen einer Zeichenkette werden an der auftretenden Stelle in die aus- fhrbare Datei kopiert. Es k”nnen nach DB Zahlen, die mit einem Byte dargestellt werden k”nnen, oder Zeichenketten in Anfhrungsstrichen folgen. Mit DW k”nnen W”rter (16- bit Zahlen) definiert werden. Es sind hierbei - wie bei den Kon- stanten - Zeichenketten der L„nge 2 zugelassen. Wenn Sie nach DB/DW keine weiteren Angaben machen, wird 1 Byte/Wort freigehalten und mit 0 vorbelegt. Vorsicht: Wenn Sie keinen Sprung um einen Datenbereich machen, werden die mit DB/DW eingegebenen Zahlen als Code angesehen und ausgefhrt! Beispiele: JMP SHORT @weiter DW ; gleich wie DB 0,0 DB 0 DB "Hello world", 10h, 20h, 01101101b, "?" DW 0, "??", 0 @weiter: DB B8h,38h,29h ; MOV AX,2938h DW 20CDh ; INT 20h INCLUDE Ein anderes Assembler-Listing kann an einer beliebigen Stel- le im Programm eingebunden werden. Der Assembler behandelt den eingebundenen Text genauso wie das Programm, d.h. alle Label-Definitionen sind global und beim Assemblieren wird die Zeilenzahl in den Include-Dateien weitergez„hlt als wr- de der Inhalt direkt im Hauptprogramm stehen. Geschachtelte Include-Dateien sind nicht erlaubt! Dieser Befehl ist sinn- voll, wenn man Routinen geschrieben hat und diese in mehre- ren Programmen nutzen m”chte. Dabei spielt es keine Rolle, ob die Include-Dateien am Anfang, am Ende oder irgendwo im Programm eingefgt werden. Bitte beachten Sie aber auch hier, daá Sie - falls die Rou- tine nicht an der Stelle im Programm ausgefhrt werden soll, an der sie eingebunden wurde - einen Sprung darber hinweg machen mssen. Beispiele: JMP @Start ; Include berspringen INCLUDE C:\Params.INC ; Prozeduren einbinden @Start: INCLUDE Init ; Init einbinden und an ... ; dieser Stelle ausfhren CALL @GetPar ; Funktion aus Params.INC ... ; ausfhren INT 20h ; Programm beenden INCLUDE WrNum.INC ; Prozeduren einbinden OFFSET Mit diesen Schlsselworten ist es m”glich, die Adresse einer ? Marke zu bestimmen. OFFSET und ? sind identisch. Diesen Befehl k”nnen Sie dazu verwenden, um die Adresse in ein Re- gister zu laden, oder um direkt auf die Speicherstelle mit der ermittelten Adresse zuzugreifen. Beispiele: JMP SHORT @load @x: DW @Name: DB "C:\JASMIN.DOC", 0 @load: MOV DX, OFFSET @Name ; Offsetadresse -> DX MOV AX, 3D00h ; Datei ”ffnen INT 21h ... MOV DX,[?@x] INC BYTE PTR [OFFSET @x] ...