Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами - 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, и использует инлайн-ассемблер для выполнения операций на уровне ассемблера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д