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 Tiny

    mov 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
    ret

    Hier 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
    

Anmelden zum Antworten