Сдвиг массива действительных чисел - Assembler

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

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

Есть задача, нужен сдвиг массива действительных чисел на k позиций влево на tasm под ДосБокс. Я знаю, как сдвинуть массив целых чисел вправо,
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
но не знаю как реализовать сдвиг действительных чисел на k позиций влево. Буду рад если поможете

Решение задачи: «Сдвиг массива действительных чисел»

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.

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

Список действий в коде:

  1. Объявление типа массива и переменных.
  2. Инициализация массива A значениями 10*i + i + 1 для каждого элемента.
  3. Вывод значений массива A с шагом 20.
  4. Ввод нового значения переменной k = 3.
  5. Использование ассемблерного блока для выполнения операции сдвига массива A на один элемент.
  6. Вывод значений массива A с шагом 20. Список действий в ассемблерном блоке:
  7. Загрузка адреса массива A в регистр SI.
  8. Загрузка количества элементов массива (12) в регистр CX.
  9. Использование команды FINIT для подготовки к выполнению операций с плавающей точкой.
  10. Начинается цикл, который выполняет сдвиг массива на один элемент.
  11. Команда FLD используется для загрузки значения из памяти в регистр FPU.
  12. Команда PUSH SI используется для сохранения регистра SI в стеке.
  13. Команда MOV используется для копирования регистра SI в регистр DI.
  14. Команда ADD используется для увеличения регистра SI на 4.
  15. Команда CLD используется для установки регистра CLD в состояние 1.
  16. Команда PUSH CX используется для сохранения регистра CX в стеке.
  17. Команда MOV используется для загрузки значения 4*11 в регистр CX.
  18. Команда REP MOVSB используется для копирования 12 элементов из памяти в регистр SI.
  19. Команда POP CX используется для восстановления регистра CX из стека.
  20. Команда POP SI используется для восстановления регистра SI из стека.
  21. Команда MOV используется для копирования регистра DI в регистр SI.
  22. Команда ADD используется для увеличения регистра SI на 4*11.
  23. Команда FST используется для сохранения значения в памяти по адресу, равному регистру DI.
  24. Команда LOOP используется для повторения цикла. Обратите внимание, что номер 13 соответствует шагу 20 в списке действий в начале.

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

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