Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец - 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.
Объяснение кода листинга программы
- Создание константы N со значением 5 и типа массива TArray из 5 целочисленных элементов.
- Создание процедуры BubbleSort для сортировки массива, принимающей ссылку на массив A и размерность массива N.
- В процедуре BubbleSort инициализация переменных i, j, x, R типа integer для использования в цикле.
- Цикл сортировки массива, где происходит сравнение и перестановка отрицательных элементов массива A в начало и положительных в конец массива.
- Инициализация переменной i типа integer.
- Создание массива A, заполненного случайными числами от -100 до 100.
- Встроенный ассемблерный код для реализации алгоритма сортировки непосредственно в процедуре на языке Assembler.
- Вывод массива A до и после сортировки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д