Übung 3 am 18.05.2005 - (späteste) Abgabe am 30.05.2005 - in RZ2
Zum Ende der Übungsstunden am 18.05.2005 ist das bis dahin entstandene Programmlisting abzugeben.
Ü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.
Bedenke: Referenzparameter bestehen aus einem 16-Bit-Segment- und einem 16-Bit-Offsetanteil.
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;
Str_ : String;
Const StrS1 : String = 'Spaltenanzahl 1.Matrix';
StrS2 : String = 'Spaltenanzahl 2.Matrix';
StrZ1 : String = 'Zeilenanzahl 1.Matrix';
StrZ2 : String = 'Zeilenanzahl 2.Matrix';
StrDP : String = ' : ';
StrKU : String = ' & ';
Procedure StrConcat(Var StrQuelle1,StrQuelle2,StrZiel:String);
Begin
StrZiel := StrQuelle1+StrQuelle2
End;
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
StrConcat(StrZ1,StrDP,Str_);
Write(Str_);
Dims[1,Zeile] := IntRead;
WriteLn
Until Dims[1,Zeile] In [1..10];
Repeat
StrConcat(StrS1,StrKU,Str_);
StrConcat(Str_,StrZ2,Str_);
StrConcat(Str_,StrDP,Str_);
Write(Str_);
Dims[1,Spalte] := IntRead;
Dims[2,Zeile] := Dims[1,Spalte];
WriteLn
Until Dims[1,Spalte] In [1..10];
Repeat
StrConcat(StrS2,StrDP,Str_);
Write(Str_);
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.