Произвести попарные перестановки элементов одномерного массива

PeterStrog

Помогите пожалуйста с таким заданием Задание: Произвести попарные перестановки элементов одномерного массива: первый элемент поменять местами с последним, второй элемент – с предпоследним и т.д. Нужно с ассемблерными вставками в Паскале, написать цикл, который бы менял местами элементы одномерного массива Цикл, который меняет элементы местами
begin
 
                for i := 1 to n div 2 do
             begin
               j := a[i];
               a[i] := a[n - i + 1];
               a[n - i + 1] := j;
             end;
Программа, которая создает и выводит одномерный массив в Паскале с ассемблерными вставками
program laba9;
 label m, m1, m2, m3, m4;
 var
 B:array [1..50] of integer;
 n,t, k, i, si: integer;
 begin
 
   Write ('Vedite n= ');
   Readln(n);
   Writeln ('ARRAY = ');
   asm
 
   mov cx, n
 
   lea si, B
   m: push cx
      push si
        end;
        read (t);
  asm
     pop si
     pop cx
     mov ax, t
     mov [si], ax
     add si, 2
 
     loop m
     mov cx, n
     dec cx
     lea si, B+2
 
     mov ax, 1
       m1: mov bx, [si]
       sub bx,[si-2]
       imul bx
       add si, 2
       loop m1
 
       mov t, ax
       end;
     { Writeln ('Production = ', t); }
       asm
         mov ax, t
         end;
          writeln ('Result array = ');
          writeln;
           asm
             mov cx, n
             lea si, B
             m4: mov ax, [si]
             mov t, ax
             push si
             push cx
             end;
               write (t:4);
               asm
                  pop cx
                  pop si
                  add si, 2
 
                  loop m4
 
       end;
end.
1 ответ

PeterStrog

с ассемблерными вставками в Паскале, написать цикл, который бы менял местами элементы одномерного массива
const n=10;
var
  a: array [0..n-1] of Integer;
...
  asm
    lea  si,a
    mov  di,si
    add  di,2*n-2
  @1:
    mov  ax,[si]
    xchg ax,[di]
    mov  [si],ax
    inc  si
    inc  si
    dec  di
    dec  di
    cmp  si,di
    jb   @1
  end;
Ну и "обвязка" для демонстрации работы цикла:
...
var
  i: Integer;
...
begin
  for i:=0 to n-1 do a[i]:=i;
  for i:=0 to n-1 do Write(' ',a[i]); WriteLn;
...
  for i:=0 to n-1 do Write(' ',a[i]); WriteLn;
end.
Другой вариант цикла обмена (завершение по cx):
  asm
    lea  si,a
    mov  di,si
    add  di,2*n-2
    mov  cx,n
    shr  cx,1
    jcxz @2
  @1:
    mov  ax,[si]
    xchg ax,[di]
    mov  [si],ax
    inc  si
    inc  si
    dec  di
    dec  di
    loop @1
  @2:
  end;