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