ohne 21h anzeigen
-
Hallo!
Kann mir bitte jemand diesen Code erläutern! Verstehe leider nur Bahnhof.
Wie kann außerdem ohne ein '21h-Interrupt' das A angezeigt werden.
Welche Bezug haben diese Zahlen zueinander (0b800h mit 01011111b und 15eh)?
ORG 100h
mov ax, 0b800h
mov ds, ax
mov cl, 'A'
mov ch, 01011111b
mov bx, 15eh
mov [bx], cx
ret
-
Moin, Moin...
ORG 100h
Programm beginnt im Segment an Offsetadresse 100h, Speichermodell Tinymov ax, 0b800h
Segmentadresse des Grafikspeichers im Textmodus in Register AX. Im Textmodus beginnt der Grafikspeicher an Adresse 0B800h und im Grafikmodus an Adresse 0A000h.mov ds, ax
Die Segmentadresse in das Register Segmentregister DS schreiben. Dadurch greifen
alle folgenden mov-Befehle(mit Zugriff auf den Speicher) auf den Grafikspeicher zu.mov cl, 'A'
ASCII-Code des großen A in Register cl(ASCII 65)mov ch, 01011111b
Farbwert in das Register ch.mov bx, 15eh
Adresse im Bildschirmspeicher in Register BX. Dadurch wird bestimmt, wo auf dem Bildschirm das A erscheint.mov [bx], cx
ASCII-Code und Farbwert in den Grafikspeicher schreiben, weil DS ja die Segmentadresse des Bildschirmspeichers enthält.Ciao...
-
Tauboga schrieb:
Hallo!
mov [ds:bx], cx
retHier wird indirect über den Pointer BX, im Datensegment DS das vorher
auf den Segmentbereich(0xB800)der Textausgabe der Grafikkarte gelegt wurde der Wert in CX High->Attribut, Low->Zeichen direkt in den Garfikkarten
Speicher geschrieben.
Man könnte das ganze auch so erreichen.mov ax,0xb000 //Segment mov ds,ax //Nach DS mov bx,0x800 // OFFSET IM SEGMENT mov ax,0x8031 mov [ds:bx],ax Alternativ; mov ax,0xb000 //Segment Adresse mov es,ax //Nach ES mov bx,0x800 //OFFSET IM SEGMENT mov ax,0x8031 mov [es:bx],ax
Oder noch besser:
mov ax,0xb000 //Segment Adresse mov es,ax //Nach ES mov di,0x800 //OFFSET IM SEGMENT mov ax,0x8031 stosw // Der befehl stosw schreibt den Wert in AX // direkt über den Index [ES:DI] in den Speicher.
Was eine blinkende 1 entspricht.
Für zu schreibenden/lesende Daten sollte man AX benutzen, da CX ein
"Counter Register" ist was man besser für Count Befehle benutzt "LOOP".
Sonst fehlt einem das Register irgendwann.Ein kleines Spielchen:
mov ax,0xb000 //Segment Adresse mov es,ax //Nach ES mov di,0x800 //OFFSET IM SEGMENT mov ax,0x802f mov cx,9 draw: inc ax stosw //Schreibt den Wert in AX nach [ES:DI] DI wird // automatisch um 2 (WORD) erhöht; loop draw //Die Schleife wird CX mal durchlaufen