Übung 3 am 12.05.2003 - Abgabe am 16.06.2003 - in RZ2/3

Die dritte Übung besteht aus zwei Teilen, zwischen denen jedoch zahlreiche Synergieeffekte bestehen. Dennoch wird der übliche Aufwand für eine Assembler-Übung überschritten; daher gilt mit dem 16.06.2003 ein verlängerter Abgabetermin. Die fünfte und sechste Übung wird dagegen jeweils derart gestaltet, das die Abnahme im Rahmen der beiden Übungsstunden erfolgt.

Erster Teil der dritten Assembler-Übung

Entwickle ein Unterprogramm zur Addition zweier Matrizen, deren Elemente aus vorzeichenbehafteten 16-Bit ganzen Zahlen bestehen. Das Unterprogramm besitzt folgende Schnittstelle : Die Parameterübergabe erfolgt über den Stack, wobei beim Referenzaufruf sowohl die Segment- als auch die Offsetadresse des Operanden übergeben wird.

Das Unterprogramm zur Matrizenaddition soll in ein Hauptprogramm folgenden Ablaufs eingebettet werden :

Bei der Dialoggestaltung ist für die einzelnen Ein- und Ausgaben auf eine übersichtliche Textwüste (z.B. aussagekräftige Eingabeaufforderungen) zu achten. Das Einlesen und Ausgeben erfolgt über die Standardeingabe bzw. -ausgabe. Die Reservierung von Speicherplatz für maximal 10x10 dimensionale Matrizen ist ausreichend. Zahlenbereichsüberläufe dürfen wie bereits in der vorherigen Übung erneut weitgehend ignoriert werden.

Zweiter Teil der dritten Assembler-Übung

Übersetze das nachfolgende Pascal-Programm MATRIX möglichst bedeutungstreu in ein 8086-Assembler-Programm (EXE-Format). Gemäß den Konventionen von Turbo-Pascal erfolgt die Parameterübergabe (Wert- und Referenzaufruf) über den Stack, die Ablage lokaler Variablen auf dem Stack und die Rückgabe eines booleschen- bzw. Integer-Wertes via AL- bzw. AX-Register.
Type Dimension = (Zeile,Spalte);
     Matrix = Array [1..10,1..10] Of Integer;

Var Dims : Array[1..3,Dimension] Of Word;
    Mats : Array[1..3] Of Matrix;

Function ReadKey:Char; Assembler;

Asm
  mov ah,8
  int 21h
End;

Function IntRead:Integer;

Var Result:Integer;
    Signed:Boolean;
    Digit:Char;
    First:Boolean;

Begin
  Result := 0;
  Signed := False;
  First := True;
  Repeat
    Digit := ReadKey;
    If (Digit='-') And First Then Begin
      Signed := True;
      First := False;
      Write(Digit)
    End;
    If (Digit>='0') And (Digit<='9') Then Begin
      First := False;
      Result := Result*10+(Ord(Digit)-Ord('0'));
      Write(Digit)
    End
  Until Digit=#13;
  If Signed Then
    Result := -1*Result;
  IntRead := Result
End;

Procedure MatRead(DimX,DimY:Word;Var Mat:Matrix);

Var X,Y:Integer;

Begin
  For Y := 1 to DimY Do
    For X := 1 To DimX Do Begin
      Write('[',Y,',',X,'] = ');
      Mat[X,Y] := IntRead;
      WriteLn
    End
End;

Procedure MatWrite(DimX,DimY:Word; Var Mat:Matrix);

Var X,Y:Integer;

Begin
  For Y := 1 To DimY Do Begin
    For X := 1 to DimX Do
      Write(Mat[X,Y]:8);
    WriteLn
  End
End;

Function MatMult(DimAx,DimAy,DimBx,DimBy:Word;
                 Var DimCx,DimCy:Word;
                 Var MatA,MatB,MatC:Matrix):Boolean;

Var I,X,Y:Word;
    Skalar:Integer;

Begin
  If DimAx = DimBy Then Begin
    MatMult := True;
    DimCx := DimBx;
    DimCy := DimAy;
    For X := 1 To DimCx Do
      For Y := 1 To DimCy Do Begin
        Skalar := 0;
        For I := 1 To DimAx Do
          Skalar := Skalar+MatA[I,Y]*MatB[X,I];
        MatC[X,Y] := Skalar
      End
  End Else
    MatMult := False
End;

Begin
  WriteLn('MATRIZENMULTIPLIKATION');
  Repeat
    Write('Zeilenanzahl 1.Matrix : ');
    Dims[1,Zeile] := IntRead;
    WriteLn
  Until Dims[1,Zeile] In [1..10];
  Repeat
    Write('Spaltenanzahl 1.Matrix & Zeilenanzahl 2.Matrix : ');
    Dims[1,Spalte] := IntRead;
    Dims[2,Zeile] := Dims[1,Spalte];
    WriteLn
  Until Dims[1,Spalte] In [1..10];
  Repeat
    Write('Spaltenanzahl 2. Matrix : ');
    Dims[2,Spalte] := IntRead;
    WriteLn
  Until Dims[2,Spalte] In [1..10];
  WriteLn('1.Matrix :');
  MatRead(Dims[1,Spalte],Dims[1,Zeile],Mats[1]);
  WriteLn('2.Matrix :');
  MatRead(Dims[2,Spalte],Dims[2,Zeile],Mats[2]);
  If MatMult(Dims[1,Spalte],Dims[1,Zeile],
             Dims[2,Spalte],Dims[2,Zeile],
             Dims[3,Spalte],Dims[3,Zeile],
             Mats[1],Mats[2],Mats[3]) Then Begin
    WriteLn('Ergebnismatrix :');
    MatWrite(Dims[3,Spalte],Dims[3,Zeile],Mats[3])
  End Else
    WriteLn('Unexpected Severe Error')
End.