Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Задача следующая: Необходимо из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами (1,4,9,16....). Вот что я написал:
Листинг программы
  1. program dfkhdk;
  2. uses crt;
  3. const N=10;
  4. var A,B: array[1..N] of shortint;
  5. i,j:1..N;
  6. begin
  7. Randomize;
  8. for i:=1 to N do
  9. A[i]:=Random(10);
  10. writeln('MASSIV A:');
  11. write(A[i]:4);
  12. writeln;
  13. writeln('MASSIV B:');
  14. asm
  15. LEA SI,A
  16. LEA DI,B
  17. mov BX,0
  18. mov CX,N
  19. mov AL,1
  20. @l: mov DL,[SI+BX]
  21. mov [DI+BX],DL
  22. inc BX
  23. imul bX
  24. inc AL
  25. loop @l
  26. end;
  27. for j:=1 to N do
  28. write(B[j]:4);
  29. readln;
  30. end.
Программа работает, но она просто дублирует все элементы массива А в массив В. Например,
Листинг программы
  1. МАССИВ А: 1 2 3 4 5
  2. МАССИВ В: 1 2 3 4 5
Я знаю, что проблема где то в цикле, но никак не могу ее найти и исправить. Надеюсь на Вашу помощь!

Решение задачи: «Из массива А переписать в массив В те элементы массива А, индексы которых являются полными квадратами»

textual
Листинг программы
  1. program dfkhdk;
  2.  
  3. uses
  4.   crt;
  5.  
  6. const
  7.   N = 10;
  8. var
  9.   A, B: array[1..N] of shortint;
  10.   i, j: 1..N;
  11. begin
  12.   Randomize;
  13.   writeln('MASSIV A:');
  14.   for i := 1 to N do
  15.   begin
  16.     A[i] := Random(10);
  17.     Write(A[i]: 4);
  18.   end;
  19.   writeln;
  20.   writeln('MASSIV B:');
  21.   asm
  22.     LEA SI,A
  23.     LEA DI,B
  24.     MOV BX,0   {bx - индекс элемента массива}
  25.     MOV  CX,N  {cx - индекс последнего элемента массива}
  26.     SUB CX,1
  27.     MOV DX,3  {слагаемое, для получения следующего квадрата}
  28.     @@Copy:
  29.       MOV AL,[SI+BX]
  30.       MOV [DI+BX],AL
  31.       ADD BX,DX
  32.       ADD  DX,2
  33.       CMP BX,CX
  34.     JBE @@Copy
  35.   end;
  36.   for j := 1 to N do
  37.     Write(B[j]: 4);
  38.   readln;
  39. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы