Сдвиг массива действительных чисел - Assembler
Формулировка задачи:
Есть задача, нужен сдвиг массива действительных чисел на k позиций влево на tasm под ДосБокс. Я знаю, как сдвинуть массив целых чисел вправо,
но не знаю как реализовать сдвиг действительных чисел на k позиций влево. Буду рад если поможете
mov cx,a loopexte: push cx mov si,offset massiv mov di,offset buffer add si,n dec si mov cx,10 onetime: mov al,[si] mov [di],al dec si dec di loop onetime mov di,offset buffer mov si,offset massiv mov al,[di] mov [si],al pop cx loop loopexte
Решение задачи: «Сдвиг массива действительных чисел»
textual
Листинг программы
program tak; type TArray = array [0..11] of single; var i,k: integer; A: TArray; begin for i := low(A) to high(A) do A[i] := 10 * i + i + 1; for i := low(A) to high(A) do writeln(A[i]: 20: 10); writeln('------------'); k:=3; asm lea si, A mov cx, 12 finit {rotate by one element} mov cx, k @@ForI: fld dword ptr[si] push si mov di, si add si, 4 cld push cx mov cx, 4*11 rep movsb pop cx pop si mov di, si add di, 4*11 fst dword ptr[di] loop @@ForI end; for i := low(A) to high(A) do writeln(A[i]: 20: 10); end.
Объяснение кода листинга программы
Список действий в коде:
- Объявление типа массива и переменных.
- Инициализация массива A значениями 10*i + i + 1 для каждого элемента.
- Вывод значений массива A с шагом 20.
- Ввод нового значения переменной k = 3.
- Использование ассемблерного блока для выполнения операции сдвига массива A на один элемент.
- Вывод значений массива A с шагом 20. Список действий в ассемблерном блоке:
- Загрузка адреса массива A в регистр SI.
- Загрузка количества элементов массива (12) в регистр CX.
- Использование команды FINIT для подготовки к выполнению операций с плавающей точкой.
- Начинается цикл, который выполняет сдвиг массива на один элемент.
- Команда FLD используется для загрузки значения из памяти в регистр FPU.
- Команда PUSH SI используется для сохранения регистра SI в стеке.
- Команда MOV используется для копирования регистра SI в регистр DI.
- Команда ADD используется для увеличения регистра SI на 4.
- Команда CLD используется для установки регистра CLD в состояние 1.
- Команда PUSH CX используется для сохранения регистра CX в стеке.
- Команда MOV используется для загрузки значения 4*11 в регистр CX.
- Команда REP MOVSB используется для копирования 12 элементов из памяти в регистр SI.
- Команда POP CX используется для восстановления регистра CX из стека.
- Команда POP SI используется для восстановления регистра SI из стека.
- Команда MOV используется для копирования регистра DI в регистр SI.
- Команда ADD используется для увеличения регистра SI на 4*11.
- Команда FST используется для сохранения значения в памяти по адресу, равному регистру DI.
- Команда LOOP используется для повторения цикла. Обратите внимание, что номер 13 соответствует шагу 20 в списке действий в начале.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д