Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами - Assembler
Формулировка задачи:
Здравствуйте!
Задача следующая: Необходимо из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами (1,4,9,16....).
Вот что я написал:
Программа работает, но она просто дублирует все элементы массива А в массив В. Например,Я знаю, что проблема где то в цикле, но никак не могу ее найти и исправить. Надеюсь на Вашу помощь!
program dfkhdk;
uses crt;
const N=10;
var A,B: array[1..N] of shortint;
i,j:1..N;
begin
Randomize;
for i:=1 to N do
A[i]:=Random(10);
writeln('MASSIV A:');
write(A[i]:4);
writeln;
writeln('MASSIV B:');
asm
LEA SI,A
LEA DI,B
mov BX,0
mov CX,N
mov AL,1
@l: mov DL,[SI+BX]
mov [DI+BX],DL
inc BX
imul bX
inc AL
loop @l
end;
for j:=1 to N do
write(B[j]:4);
readln;
end.МАССИВ А: 1 2 3 4 5 МАССИВ В: 1 2 3 4 5
Решение задачи: «Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами»
textual
Листинг программы
program dfkhdk;
uses
crt;
const
N = 10;
var
A, B: array[1..N] of shortint;
i, j: 1..N;
begin
Randomize;
writeln('MASSIV A:');
for i := 1 to N do
begin
A[i] := Random(10);
Write(A[i]: 4);
end;
writeln;
writeln('MASSIV B:');
asm
LEA SI,A
LEA DI,B
MOV BX,0 {bx - индекс элемента массива}
MOV CX,N {cx - индекс последнего элемента массива}
SUB CX,1
MOV DX,3 {слагаемое, для получения следующего квадрата}
@@Copy:
MOV AL,[SI+BX]
MOV [DI+BX],AL
ADD BX,DX
ADD DX,2
CMP BX,CX
JBE @@Copy
end;
for j := 1 to N do
Write(B[j]: 4);
readln;
end.
Объяснение кода листинга программы
- Объявляются переменные:
A, B: array[1..N] of shortint;- массивы A и B, каждый размером N элементов типа shortint.i, j: 1..N;- переменные-счетчики для циклов, от 1 до N.
- Генерируется случайный массив A:
Randomize;- инициализация генератора случайных чисел.for i := 1 to N do- цикл повторяется N раз для каждого элемента массива A.A[i] := Random(10);- элементу массива A[i] присваивается случайное число от 0 до 9.Write(A[i]: 4);- выводится значение элемента массива A[i] на экран.
- Выводится сгенерированный массив A.
- Используется инлайн-ассемблер для переписывания элементов массива A в массив B, индексы которых являются полными квадратами:
LEA SI,A- загрузка адреса массива A в регистр SI.LEA DI,B- загрузка адреса массива B в регистр DI.MOV BX,0- инициализация индекса массива.MOV CX,N- сохранение длины массива в регистр CX.SUB CX,1- уменьшение CX на 1.MOV DX,3- инициализация значения для получения следующего квадрата.- Цикл копирования элементов:
MOV AL,[SI+BX]- загружается значение из массива A.MOV [DI+BX],AL- сохраняется значение в массив B.ADD BX,DX- увеличение индекса на значение для получения следующего квадрата.ADD DX,2- увеличение значения для получения следующего квадрата.CMP BX,CX- сравнивается индекс с длиной массива.JBE @@Copy- переход к метке @@Copy, если меньше или равно.
- Выводится полученный массив B.
- Осуществляется ожидание ввода пользователя. Замечание: Код написан на языке Pascal, а не Assembler, и использует инлайн-ассемблер для выполнения операций на уровне ассемблера.