Version 2.0 Aktualisiert: 30.03.04



Mit diesem kleinen Programm will ich zeigen, wie man den Status der Num-Lock Taste verändern kann. Auch möchte ich zeigen, wie man eine beliebige Stelle im Speicher manipulieren kann. Bei der physikalischen Adresse 0417h befindet sich das Statusbyte des Keyboards. Bit 5 ist für Num-Lock zuständig. Ist es gesetzt, ist Num-Lock an und die Signallampe auf der Tastatur leuchtet.
Programm als COM-Datei:

 
                      .MODEL TINY                       ;Speichermodell fuer COM Dateien
                      .CODE                            
                      ORG 100h
                                
Start:                mov  ax,0040h       
                      mov  es,ax                        ;Segmentadresse = 40h (Segmentoverwrite)
                      xor  byte ptr ES:[17h],00100000b  ;Bit 5 "umpolen" 
                      mov  ah,4Ch
                      int  21h                          ;Programm beenden.
                      END  Start            


Gleiches Programm etwas anders (Adressierung etw. anders):


                      .MODEL TINY                        ;Speichermodell fuer COM Dateien
                      .CODE                            
                      ORG 100h
                                
Start:                mov  ax,0000h       
                      mov  es,ax                         ;Segmentadresse = 0h (Segmentoverwrite)  
                      xor  byte ptr ES:[0417h],00100000b ;Bit 5 "umpolen".
                      mov  ah,4Ch
                      int  21h                          ;Programm beenden.
                      END  Start        

Info:
Was bedeutet xor byte ptr ES:[17h] ? Byte ptr sagt dem Assembler, das er ein Byte berarbeiten soll, WORD PTR würde ein Word bearbeiten. Beispiel: Man möchte an die Adresse 3000 den Wert 40h speichern. Mit mov [3000],40h weiss der Assembler noch nicht, ob er ein Word oder ein Byte kopieren soll. Mit Byte / Word PTR muss man also die Breite angeben:
mov byte ptr [3000],40h. Die eckige Klammer signalisiert, dass der Inhalt einer Speicherstelle gemeint ist. ES:[17h] zeigt den genauen Speicherort an, welcher aus Segmentadresse und Offset- adresse besteht. Man könnte anstatt des Extrasegmentes hier auch das Datensegment zur Adressierung verwenden.

Info´s zur indirekten/indizierten Adressierung:
Bei der indirekten Registeradressierung wird die Offsetadresse durch ein oder mehrere der folgenden Register gebildet: BX, BP, DI, und SI. Es gibt folgende Kombinationsmöglichkeiten: [bx] ; [bp] ; [di] ; [si] ; [bx+di] ; [bx+si] ; [bp+di] ; [bp+si] .
Bei der indizierten Adressierung kommt zu den Registern noch ein konstanter Wert hinzu (z.B. der eines Labels). Es gibt dann folgende Kombinationen:
[Label+bx] ; [Label+bp] ; [Label+di] ; [Label+si] ; [Label+bx+di] ; [Label+bx+si] ;
[Label+bp+di] ; [Label+bp+si] .
Diese beiden Adressierungsarten haben den Vorteil, dass der Wert veräderbar ist und erst während des Programmablaufes festgelegt wird. Man kann damit zum Beispiel auf Tabellen zugreifen und so weiter. Standartmässig wird als Segmentregister das Datensegment verwendet ist bp beteiligt wird das Stacksegment verwandt. Diese beiden Adressierungsarten sind für den Anfang jedoch noch nicht so wichtig.


Weiter geht es mit einem weiteren Programm.

Zurück Weiter Inhalt