|
Методические указания по Организации ЭВМ и систем
Лабораторная работа 6. Пример решения 1:
(* Лабораторная работа № 6 *)
(* 2204 Орлов С.В. 972526 *)
{17.06.99}
uses crt;
var
a:array [1..7] of integer;
z,i,j:integer;
(* функция вычисления x^y *)
function stepen(x_st,y_st:integer):longint;
var i_st,temp_st:integer;
begin
temp_st:=1;
for i_st:=1 to y_st do temp_st:=temp_st*x_st;
stepen:=temp_st
end;
Begin
clrscr;
randomize;
writeln('Массив A[]:');
for z:=1 to 7 do
begin
a[z]:=random(4)+1;
writeln('a[',z,']= ',a[z])
end;
z:=0;
for i:=1 to 7 do
z:=z+stepen(a[i],i);
writeln('Решение на Паскале: ',z);
asm
pusha
xor bp,bp { здесь будем сохранять результат }
mov ax,ds
mov es,ax
lea di,a { в ES:DI адрес начала массива a }
add di,12 { переходим на последний элемент }
mov cx,7 { всего сумма семи элементов }
@1:
push cx
mov ax,es:[di] { в AX i-ый элемент массива a[i] }
dec cx { при степени количество умножений равно n-1 }
je @3 { если степень равна 1, то в степень не вводим }
mov bx,ax { в BX теперь то же самое }
@2:
mul bx { находим степень элемента массива }
loop @2
@3:
add bp,ax { сохраняем результат }
sub di,2 { сдвигаемся на 2 байта влево на предыдущий элемент массива }
pop cx
loop @1 { повторяемся }
mov z,bp
popa
end;
writeln('Решение на Ассемблере: ',z);
readkey;
clrscr;
End.
|