{Schreiben Sie ein Programm, das eine Assembler Funktion aufruft, die: - bekommt eine Folge von, auf 16 Bits dargestellte, (vorzeichenbehaftete) ganzen Zahlen - zeigt jede Zahl der Folge nacheinander an, dafuer ruft eine Pascal Prozedur - rechnet die Summe der Zahlen aus und gibt es als Rueckgabewert zurueck Das Hauptprogramm zeigt am Bildschirm das zurueckgeliefertes Ergebnis an. } Type Block=array[0..200] of integer; Procedure ausgeben(v:integer); begin writeln(v); end; Function summe(var t:Block; n:integer):integer;assembler; var i, s:integer; asm { Parameter ; bp+0 -> bp gespeichert ; bp+2 -> Ruecksprungsadresse ; bp+4 -> n ; bp+6 -> @t ; lokale Variablen: ; bp-2 -> Index des aktuellen Elementes (i) ; bp-4 -> partielle Summe (s) } mov ax, 0 mov s, ax {s := 0} mov i, ax ; {i := 0} jmp @@test_schleife @@schleife: { wir addieren das aktuelle Element zur partielle Summe } mov si, word ptr ss:[bp-2] { si := i} shl si, 1 les bx, dword ptr ss:[bp+6] { es:bx = @t} mov ax, word ptr es:[bx+si] { ax := t[i]} add word ptr ss:[bp-4], ax { wir zeigen das aktuelle Element an} push ax call ausgeben { wir treten zum nächsten Element } mov ax, word ptr ss:[bp-2] { ax := i} inc ax mov word ptr ss:[bp-2], ax @@test_schleife: { wit testen ob wir noch Elemente in der Folge haben; hier ax=i} cmp ax, word ptr ss:[bp+4] { cmp i, n} jb @@schleife { wir speichern den Rückgabewert in ax und kehren ins Ruferprogramm zurück} mov ax, word ptr ss:[bp-4] mov sp, bp end; Var i,n:integer; x:Block; Begin write('n='); readln(n); for i:=0 to n-1 do begin write('x[',i,']='); readln(x[i]); end; i:=summe(x,n); writeln('Summe=',i); End.