; es wird eine Zeichenkette eingelesen (Oktett-Folge) und ; die Position der letzten '0' Charakter ; als eine hexa Ziffer ausgegeben assume cs:code, ds:data data segment Folge db 15 dup (?) ; es wird Platz für 15 Bytes reserviert fehlermeldung db 13,10,'Keine hexa Ziffer!$' Text db 13,10,'Geben Sie einen Text ein: $' data ends code segment start: mov ax, data mov ds, ax mov es,ax mov ah,09h ; mit der Funktion 09h der Unterbrechung 21h wird lea dx,Text ; der Text am Bildschirm angezeigt, deren Anfangsadresse int 21h ; sich im Register dx befindet. ; Achtung! Der Text soll mit einem '$' Zeichen ; beendet werden. lea di,Folge ; die Anfangsadresse der Folge wird in di geladen CLD xor cx,cx ; in cx wird die Länge der Reihe gerechnet einlesen: mov ah,01h ; mit der funktion 01h der Unterbrechung 21h kann ; man ein Zeichen einlesen int 21h ; in Al - der ASCII Kode des eingelesenen Zeichens cmp al,13 ; wir testen ob wir Enter gedrückt haben je fertig cmp cx,15 ; wir dürfen nicht mehr als 15 Charaktern einlesen ; (denn wir nur so viel Platz gespeichert haben) je fertig inc cx stosb ; wir kopieren den eingelesenen Charakter in die Folge jmp einlesen fertig: dec DI ; wir kehren zum letzten Element der Folge zurück std ; jetzt werden wir die gleiche Folge in umgekehrter ; Reihenfolge bearbeiten mov al,'0' suche_weiter: scasb je gefunden loop suche_weiter ; ! die Schleife wird nicht mehr als CX-mal durchgeführt ; also wenn in der Folge überhaupt kein '0' Charakter gibt ; wird die Suche beendet werden, erst nachdem wir die ganze ; Folge durchgesucht haben mov bl,0 ; wir haben kein '0' gefunden jmp ergebnis gefunden: inc DI ; wir kehren zum gefundenen Charakter zurück (oder zum Anfang der ; Folge, wenn kein '0' Charakter gibt) sub di, offset Folge mov bx,di inc bl ; jetzt haben wir in bl die Position der letzten '0' Charakter ergebnis: mov ah,02h ; wir setzen den Kursor am Anfang einer neuen Zeile: mov dl,13 ; Zwei Zeichen werden mit der Hilfe der Funktion int 21h ; 02h der Unterbrechung 21h ausgegeben: mov dl,10 ; - CR -Carriage Return-, mit ASCII Kode =13 int 21h ; - LF -Line Feed-, mit ASCII Kode =10 cmp bl,0 ; es wird überprüfen ob der Wert in bl überhaupt eine jb fehler ; Hexa-Ziffer ist cmp bl,15 ja fehler cmp bl,9 ja buchstabe add bl,'0' ; der Wert wird in ASCII Kode transformiert jmp aus buchstabe: add bl,'A'-10 aus: mov ah,02h ; die gesuchte Position wird als Hexa-Ziffer ausgegeben mov dl,bl ; und ein 'h' Zeichen danach int 21h mov dl,'h' int 21h jmp Ende fehler: mov ah,09h lea dx,fehlermeldung int 21h Ende: mov ax,4c00h int 21h code ends end start