Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец - 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 до и после сортировки.