Prof. Dr. K. Wüst Fachhochschule Gießen-Friedberg Fachbereich MNI Klausur zu "Maschinennahe Programmierung", 8.7.97 ------------------------------------------------- Nachname: . . . . . . . . . . . . Vorname: . . . . . . . . . . Matrikelnummer: . . . . . . . . . Studiensemester: . . . . mögliche Punkte erreicht ---------------------------------------------------------- Aufgabe 1 4 Aufgabe 2 4 Aufgabe 3 6 Aufgabe 4 5 Aufgabe 5 5 ---------------------------------------------------------- Summe 24 Note: Benutzen Sie die Rückseiten der Aufgabenblätter, falls der Platz auf der Vorderseite nicht reicht! Falls Sie Befehle verwenden, die über den 8086-Befehlssatz hinausgehen, bitte kennzeichnen! Aufgabe 1 ========= Geben Sie bitte in hexadezimaler Schreibweise an, welchen Inhalt die Register AX, BX, CX und DX nach dem Durchlaufen des folgenden Programmstückes haben: mov dx,0FFFEh add dl,1 add dx,1 mov bx,0 rcr bx,1 mov al,20h mov cl,10h mul cl mov cx,1234h or cx,6543h AX = .......h BX = .......h CX = .......h DX = .......h Aufgabe 2 ========= Auf dem Speicherplatz 40:17h steht das sog. Tastatur-Status-Byte; dieses enthält die Information, ob die NUM-Taste (NUM-LOCK) aktiviert ist: Bit 5=1 : NUM-Taste aktiv Bit 5=0 : NUM-Taste nicht aktiv Schreiben Sie eine Assemblerprozedur "NUM_Taste", deren Schnittstelle wie folgt aussieht (CF=Carryflag): Vor Aufruf: keine Parameter Nach Aufruf: CF=1, wenn NUM-Taste aktiviert CF=0, wenn NUM-Taste nicht aktiviert Klausur zu "Maschinennahe Programmierung", 8.7.97 - Seite 2 Aufgabe 3 ========= Bei gepackten BCD-Zahlen, wird jede Dezimalziffer durch ein Nibble (4 Bit-Gruppe) dargestellt. Schreiben Sie in Inline-Assembler eine C-Funktion "BCD_Byte_to_Bin", die eine gepackte zweiziffrige BCD-Zahl in eine 8-Bit Binärzahl wandelt. Zum Beispiel soll 43h (d.h. 0100 0011b) in die Zahl 43d (d.h. 2Bh bzw. 00101011b) gewandelt werden. Die Funktion soll wie folgt definiert sein: unsigned int BCD_Byte_to_Bin( unsigned char BCD_Zahl); "BCD_Zahl" ist die übergebene zweiziffrige BCD-Zahl, das ermittelte binäre Ergebnis wird als Funktionswert zurückgegeben. Aufgabe 4 ========= Schreiben Sie in Assembler eine externe Funktion, die von C/C++ Programmen (Speichermodell SMALL) aufgerufen werden kann. An die Funktion sollen zwei Zeiger auf jeweils eine int-Zahl übergeben werden. Der Rückgabewert soll das Maximum der beiden int-Zahlen sein. Die Funktion sei also wie folgt definiert: int Maximalwert( int near *p1, int near *p2); Aufgabe 5 ========= Die Informationen zu einem Verzeichniseintrag sind unter DOS in einer sog. File-Info-Struktur abgespeichert. So steht dort an Position 30d in einem ASCIIZ-String der Name des Eintrags, an Position 21d steht ein Attribut-Byte. Bit 4 des Attribut-Bytes gibt Auskunft über die Art des Eintrags: Bit 4 = 1 : Eintrag ist ein Unterverzeichnis Bit 4 = 0 : Eintrag ist kein Unterverzeichnis Schreiben Sie eine Assemblerprozedur, die auf eine File-Info-Struktur zugreift und, falls es sich um ein Unterverzeichnis handelt, in dieses Unterverzeichnis wechselt (entsprechend DOS-Befehl "ChangeDir"). Setzen Sie voraus, dass bei Aufruf der Prozedur ein Zeiger auf die File-Info-Struktur in ES:BX übergeben wird. Zum Verzeichniswechsel soll DOS-Funktion 3Bh ("Change Directory") benutzt werden. Diese verlangt folgende Aufrufparameter: Vor Aufruf: AH = 3Bh DX = Offset eines Zeigers auf den Namen des Unterverzeichnis (ASCIIZ-String) DS = Segment eines Zeigers auf den Namen des Unterverzeichnis (ASCIIZ-String) Vereinfachend soll eine Fehlerbehandlung hier entfallen!