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

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

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

Здравствуйте! Нужна небольшая помощь с массивами в Assembler. Задача в следующем: Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец. Я написал следующее, но она работает не совсем так, как нужно.
Листинг программы
  1. program Buten;
  2. uses crt;
  3. const N=5;
  4. var A:array[1..N] of shortint;
  5. i,x: integer;
  6. begin
  7. Randomize;
  8. for i:=1 to N do
  9. A[i]:=-100+Random(200);
  10. writeln('Massiv A:');
  11. writeln;
  12. read;
  13. asm
  14. LEA SI,A
  15. mov CX,N
  16. mov BX,4
  17. mov x,0
  18. @1: CMP x,BX
  19. JGE @2
  20. xor AX,AX
  21. mov AX,[SI+x]
  22. CMP AX,0
  23. JGE @3
  24. JMP @4
  25. @3: mov DX,[SI+BX]
  26. mov [SI+x],DX
  27. mov [SI+BX],AX
  28. dec BX
  29. JMP @1
  30. @4: inc x
  31. loop @1
  32. @2: NOP
  33. end;
  34. writeln('Massiv A IZM:');
  35. for i:=1 to N do
  36. write(A[i],' ');
  37. writeln;
  38. readln;
  39. end.
Программа работает, но выводит те же самые элементы, помогите разобраться.

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

textual
Листинг программы
  1. program test;
  2.  
  3. const
  4.   N = 5;
  5. type
  6.   TArray = array[1..N] of integer;
  7.  
  8.   procedure BubbleSort(var A: TArray; N: integer);
  9.   var
  10.     i, j: integer;
  11.     x: integer;
  12.     R: integer;
  13.   begin
  14.     for i := 1 to N - 1 do
  15.     begin
  16.       j := N;
  17.       while (j > i) do
  18.       begin
  19.         R := ((not (A[j - 1])) and (A[j]));
  20.         if {(A[j - 1] > A[j])}R < 0 then
  21.         begin
  22.           x := A[j];
  23.           A[j] := A[j - 1];
  24.           A[j - 1] := x;
  25.         end;
  26.         Dec(j);
  27.       end;
  28.     end;
  29.   end;
  30.  
  31. var
  32.   i: integer;
  33.   A: TArray;
  34. begin
  35.   randomize;
  36.   writeln('Massiv A:');
  37.   for i := 1 to N do
  38.   begin
  39.     A[i] := -100 + Random(200);
  40.     Write(A[i]: 4);
  41.   end;
  42.   writeln;
  43.  
  44.   asm
  45.     LEA BX,A
  46.     MOV CX,N
  47.     DEC CX
  48.     MOV SI,0          {for i:=1 to N-1 do}
  49.   @@ForI:
  50.     MOV DI,N          {  j:=N}
  51.     DEC DI
  52.     SHL DI,1
  53.   @@ForJ:             {  repeat}
  54.     MOV AX,[BX+DI-2]  {    R := ((not (A[j - 1])) and (A[j]));}
  55.     NOT AX
  56.     AND AX,[BX+DI]
  57.     JNS @@NextJ       {    if R<0 then}
  58.     XCHG AX,[BX+DI]   {      temp:=A[j]}
  59.     XCHG AX,[BX+DI-2] {      A[j]:=A[j-1]}
  60.     XCHG AX,[BX+DI]   {      A[j-1]:=A[j]}
  61.   @@NextJ:
  62.     SUB DI,2          {    dec(j)}
  63.     CMP DI,SI         {  until j<=i;}
  64.     JA @@ForJ
  65.     ADD SI,2          {  end; for i равноценно inc(i)}
  66.     LOOP @@ForI
  67.   end;
  68.  
  69.   writeln('Massiv A IZM:');
  70.   for i := 1 to N do
  71.     Write(A[i]: 4);
  72.   writeln;
  73. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы