Prof. Dr. K. Wüst Fachhochschule Gießen-Friedberg Fachbereich MNI Klausur zu "Maschinennahe Programmierung", 9.7.1998 --------------------------------------------------- Nachname: . . . . . . . . . . . . Vorname: . . . . . . . . . . Matrikelnummer: . . . . . . . . . mögliche Punkte erreicht --------------------------------------------------------------- Aufgabe 1 4 Aufgabe 2 5 Aufgabe 3 4 Aufgabe 4 6 Aufgabe 5 5 ---------------------------------------------------------------- Summe 24 erreicht: Note: Sie können die Rückseiten der Aufgabenblätter benutzen. Wenn Sie zusätzliche Blätter benutzen, bitte Ihren Namen draufschreiben! 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: xor dx,dx inc dx mov eax,20432h mov bx,10h div bx mov cx,bx marke: dec ax loop marke dec cx AX = ....... BX = ....... CX = ....... DX = ....... Aufgabe 2 ========= Schreiben Sie eine Prozedur, die eine 32 Bit-Zahl untersucht und die Position des höchstwertigen Bit das eine "1" enthält, zurückgibt. ------ Wenn gar kein Bit eine "1" enthält, soll der Rückgabewert FFFFh, d.h. -1 sein. Benutzen Sie 8086- oder 80386-Befehle! Schnittstellenbeschreibung: Eingabeparameter: DX-AX : zu untersuchende Zahl Rückgabewerte: SI : Position des ersten "1"-Bit (LSB = Bit 0) Zero Flag gesetzt, wenn DX-AX=0 Veränderte Register: keine (ausser SI) Beispiel: DX=00FFh, AX=007Fh, Rückgabe der Prozedur: SI=23 Klausur zu "Maschinennahe Programmierung", 9.7.98 - Seite 2 Aufgabe 3 ========= Der INT 11h (ein BIOS-Aufruf) gibt Auskunft über die Ausstattung Ihres PC. Nach seinem Aufruf findet man im Register AX auf dem Feld von Bit 9 bis Bit 11 die Anzahl der vorhandenen RS232- Schnittstellen. Schreiben Sie eine Assembler-Prozedur, die diese Anzahl im Register AX zurückgibt! Aufgabe 4 ========= Schreiben Sie in Assembler eine Prozedur, die einen Speicherdump, d.h. eine Darstellung des Inhalts eines bestimmten Speicherabschnitts auf den Bildschirm ausgibt. Der Speicherinhalt soll byteweise in Form von ASCII-Zeichen dargestellt werden, nach 40 Byte soll ein Umbruch auf eine neue Zeile erfolgen. Das Speichermodell soll SMALL sein, die Schnittstelle der Funktion soll sein: Proc ASCDump ; Vor Aufruf: ES : Zeiger auf den Beginn des Speicherabschnitts ; CX : Anzahl der auszugebenden Zeichen ; ; Rückgabe: - ; ; Veränderte Register: Keine Die Bildschirmausgabe kann mit der DOS-Funktion 02h gemacht werden: Vor Aufruf: AH = 02h (Funktionsnr) DL = auszugebendes Zeichen Nach Aufruf: - Klausur zu "Maschinennahe Programmierung", 9.7.98 - Seite 3 Aufgabe 5 ========= Das untenstehende Assemblerprogramm wurde durch Kompilierung eines kleinen C-Programmes in einer 32-Bit-Umgebung (z.B. WIN95, WIN NT) erzeugt. Die C-Befehle sind noch als Kommentar entahlten. Beantworten Sie die eingefügten Fragen! TITLE C:\Eigene Dateien\codebsp3\ASMKL798.cpp .386P .model FLAT ; Frage1: Was bedeutet diese Anweisung? ; ; ; ; .................................................... PUBLIC _main EXTRN _printf:NEAR EXTRN _strlen:NEAR _DATA SEGMENT $SG733 DB 'Viel Erfolg bei der Klausur!', 00H ORG $+3 $SG734 DB 'Zeichenkette %s hat die Laenge %i', 0aH, 00H _DATA ENDS _TEXT SEGMENT _laenge$ = -36 _zeichenkette$ = -32 _main PROC NEAR ; 4 : main() { push ebp mov ebp, esp sub esp, 36 ; 00000024H push esi push edi ; 5 : int laenge; ; 6 : char zeichenkette[] = "Viel Erfolg bei der Klausur!"; mov ecx, 7 mov esi, OFFSET FLAT:$SG733 lea edi, DWORD PTR _zeichenkette$[ebp] rep movsd movsb ; Frage2: Wieviele Bytes werden durch diese 5 Befehle transportiert? ; ; ; ..................... Klausur zu "Maschinennahe Programmierung", 9.7.98 - Seite 4 ; 7 : ; 8 : laenge=strlen(zeichenkette); lea eax, DWORD PTR _zeichenkette$[ebp] push eax call _strlen add esp, 4 mov DWORD PTR _laenge$[ebp], eax ; 9 : printf("Zeichenkette %s hat die Laenge %i\n",zeichenkette, laenge); mov ecx, DWORD PTR _laenge$[ebp] push ecx lea edx, DWORD PTR _zeichenkette$[ebp] push edx push OFFSET FLAT:$SG734 call _printf ; Frage3: Wie muss der folgende Assemblerbefehl lauten? ; ; ; ........................ ; 10 : ; 11 : return 0; ; Frage4: Wie muss der folgende Assemblerbefehl lauten? ; ; ; ........................ ; 12 : } pop edi pop esi mov esp, ebp ; Frage5: Wie muss der folgende Assemblerbefehl lauten? ; ; ; ......................... ret 0 _main ENDP _TEXT ENDS END