Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец - Assembler

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

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

Здравствуйте! Нужна небольшая помощь с массивами в Assembler. Задача в следующем: Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец. Я написал следующее, но она работает не совсем так, как нужно.
program Buten;
uses crt;
const N=5;
var A:array[1..N] of shortint;
i,x: integer;
begin
Randomize;
for i:=1 to N do
A[i]:=-100+Random(200);
writeln('Massiv A:');
writeln;
read;
asm
LEA SI,A
mov CX,N
mov BX,4
mov x,0
@1: CMP x,BX
       JGE @2
       xor AX,AX
       mov AX,[SI+x]
       CMP AX,0
       JGE @3
       JMP @4
@3: mov DX,[SI+BX]
      mov [SI+x],DX
      mov [SI+BX],AX
      dec BX
      JMP @1
@4: inc x
      loop @1
@2: NOP
end;
writeln('Massiv A IZM:');
for i:=1 to N do
write(A[i],' ');
writeln;
readln;
end.
Программа работает, но выводит те же самые элементы, помогите разобраться.

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

textual
Листинг программы
program test;
 
const
  N = 5;
type
  TArray = array[1..N] of integer;
 
  procedure BubbleSort(var A: TArray; N: integer);
  var
    i, j: integer;
    x: integer;
    R: integer;
  begin
    for i := 1 to N - 1 do
    begin
      j := N;
      while (j > i) do
      begin
        R := ((not (A[j - 1])) and (A[j]));
        if {(A[j - 1] > A[j])}R < 0 then
        begin
          x := A[j];
          A[j] := A[j - 1];
          A[j - 1] := x;
        end;
        Dec(j);
      end;
    end;
  end;
 
var
  i: integer;
  A: TArray;
begin
  randomize;
  writeln('Massiv A:');
  for i := 1 to N do
  begin
    A[i] := -100 + Random(200);
    Write(A[i]: 4);
  end;
  writeln;
 
  asm
    LEA BX,A
    MOV CX,N
    DEC CX
    MOV SI,0          {for i:=1 to N-1 do}
  @@ForI:
    MOV DI,N          {  j:=N}
    DEC DI
    SHL DI,1
  @@ForJ:             {  repeat}
    MOV AX,[BX+DI-2]  {    R := ((not (A[j - 1])) and (A[j]));}
    NOT AX
    AND AX,[BX+DI]
    JNS @@NextJ       {    if R<0 then}
    XCHG AX,[BX+DI]   {      temp:=A[j]}
    XCHG AX,[BX+DI-2] {      A[j]:=A[j-1]}
    XCHG AX,[BX+DI]   {      A[j-1]:=A[j]}
  @@NextJ:
    SUB DI,2          {    dec(j)}
    CMP DI,SI         {  until j<=i;}
    JA @@ForJ
    ADD SI,2          {  end; for i равноценно inc(i)}
    LOOP @@ForI
  end;
 
  writeln('Massiv A IZM:');
  for i := 1 to N do
    Write(A[i]: 4);
  writeln;
end.

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

  1. Создание константы N со значением 5 и типа массива TArray из 5 целочисленных элементов.
  2. Создание процедуры BubbleSort для сортировки массива, принимающей ссылку на массив A и размерность массива N.
  3. В процедуре BubbleSort инициализация переменных i, j, x, R типа integer для использования в цикле.
  4. Цикл сортировки массива, где происходит сравнение и перестановка отрицательных элементов массива A в начало и положительных в конец массива.
  5. Инициализация переменной i типа integer.
  6. Создание массива A, заполненного случайными числами от -100 до 100.
  7. Встроенный ассемблерный код для реализации алгоритма сортировки непосредственно в процедуре на языке Assembler.
  8. Вывод массива A до и после сортировки.

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

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