Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами - 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.

Объяснение кода листинга программы

  1. Объявляются переменные:
    • A, B: array[1..N] of shortint; - массивы A и B, каждый размером N элементов типа shortint.
    • i, j: 1..N; - переменные-счетчики для циклов, от 1 до N.
  2. Генерируется случайный массив A:
    • Randomize; - инициализация генератора случайных чисел.
    • for i := 1 to N do - цикл повторяется N раз для каждого элемента массива A.
    • A[i] := Random(10); - элементу массива A[i] присваивается случайное число от 0 до 9.
    • Write(A[i]: 4); - выводится значение элемента массива A[i] на экран.
  3. Выводится сгенерированный массив A.
  4. Используется инлайн-ассемблер для переписывания элементов массива 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, если меньше или равно.
  5. Выводится полученный массив B.
  6. Осуществляется ожидание ввода пользователя. Замечание: Код написан на языке Pascal, а не Assembler, и использует инлайн-ассемблер для выполнения операций на уровне ассемблера.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы