Program lab10_1; {Se cere un program care apeleaza o functie scrisa in limbaj de asamblare care: - primeste un sir de integi pe 16 biti cu semn - tipaereste, pe rand, fiecare numar din sir; pentru aceasta va apela o procedura scrisa in pascal - calculeaza si returneaza suma numerelor Programul principal va tipari suma returnata de functie } Type tablou=array[0..200] of integer; Procedure tipareste(v:integer); begin writeln(v); end; Function suma(var t:tablou; n:integer):integer;assembler; var i, s:integer; asm { Parametrii: ; bp+0 -> bp salvat ; bp+2 -> adr. revenire ; bp+4 -> n ; bp+6 -> @t ; Var. locale: ; bp-2 -> indexul elementului curent (i) ; bp-4 -> suma partiala (s) } mov ax, 0 mov s, ax {s := 0} mov i, ax ; {i := 0} jmp @@test_bucla @@bucla: { adunam elementul curent la suma partiala} 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 { tiparim elementul curent} push ax call TIPARESTE { trecem la elementul urmator} mov ax, word ptr ss:[bp-2] { ax := i} inc ax mov word ptr ss:[bp-2], ax @@test_bucla: { testam daca mai avem elemente in sir; aici ax=i} cmp ax, word ptr ss:[bp+4] { cmp i, n} jb @@bucla { punem valoare de returnat in ax si revenim la apelant} mov ax, word ptr ss:[bp-4] mov sp, bp end; Var i,n:integer; x:tablou; Begin write('n='); readln(n); for i:=0 to n-1 do begin write('x[',i,']='); readln(x[i]); end; i:=suma(x,n); writeln('Suma=',i); End.