Assembler_odnomer_massive

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
skorpi
Сообщения: 7
Зарегистрирован: 31 окт 2009, 17:39

Алгоритм нахождения и замены минимального числа в одномерном массиве на максимальное в этом же массиве.
Минимальное и максимальное найти смог, а перестановку сделать не могу.
При нахождении каждого из чисел приходится загружать эффективный адрес массива по отдельности,
т.е : при нахождении минимума - загрузка массива, эффективного адреса, к примеру, в SI, далее нахожу это минимальное число, сохраняю в регистре, допустим DX.
Далее опять загружаю массив по такой же схеме, нахожу максимум, сохраняю в другой регистр.
В третий раз - также загрузка массива и уже обмен минимум на максимум.
Пробовал работать с сохранением данных по в адресах, например:
минимум - в [BX], а максимум в [BP] - не выходит.

Может все эти действия нужно делать вместе при одной загрузке, в одном внешнем цикле разбитом на несколько циклов. Подскажите, кто знает.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

покажите код, нужно искать не само число, а индекс в массиве
icq:3(один)7748666
mail:airyashov( а)inbox.ru
skorpi
Сообщения: 7
Зарегистрирован: 31 окт 2009, 17:39

airyashov писал(а):покажите код, нужно искать не само число, а индекс в массиве

Какой именно код?
У меня загвоздка именно в том, что я не могу занести искомые данные по нужному адресу.
При работе с индексами нахожу и минимум и максимум также, но дальше тишина....
Вот фрагмент моей программы:

asm
@1: lea si,a ;где а - это массив
mov cx,n ;где n - количество цифр в массиве
mov bx,[si+2]
@2: mov ax,[si]
cmp ax,bx
jge @3
xchg ax,bx
@3: add si,2
loop @2

Минимальный элемент находится в BX.
Максимальный нахожу по такому же алгоритму.
А дальше - пока застрял.
Начало и конец программы выполнены в Pascal, а основная часть в Assembler.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

допустим пусть адреса будут в si и di после поиска
тогда ваш алгоритм (переработан), ищем индекс минимального (максимального аналогично)

Код: Выделить всё

@1: lea bx,a ;где а - это массив
mov cx,n ;где n - количество цифр в массиве 
mov si,bx
@2: mov ax,[bx]
cmp ax,[si]
jge @3
mov si ,bx
@3: add bx,2
loop @2
...
;обмен
mov ax,[si]
xchg ax,[di]
mov [si],ax
icq:3(один)7748666
mail:airyashov( а)inbox.ru
skorpi
Сообщения: 7
Зарегистрирован: 31 окт 2009, 17:39

Большое спасибо!
А задание у меня было такое:

Создать массив М[1..24]. Определить минимальное значение среди первых 10 чисел. Максимальное всего массива заменить в массиве на это минимальное значение.

После вашего ответа сразу доработал программу и она заработала.

program obmen;
uses crt;
const n=24;
var
M:array [1..n] of integer;
i,p,k:integer;
begin
clrscr; randomize;
for i:=1 to n do begin m:=random(100);
write(m:3);
end;
asm
@1: lea bx,m
mov cx,10
mov si,bx
@2: mov ax,[bx]
cmp ax,[si]
jge @3
mov si,bx
@3: add bx,2
loop @2
cmp cx,0
jne @1
mov dx,[si]
mov p,dx

@4: lea bx,m
mov cx,n
mov di,bx
@5: mov ax,[bx]
cmp ax,[di]
jle @6
mov di,bx
@6: add bx,2
loop @5
cmp cx,0
jne @4
mov bp,[di]
mov k,bp
mov ax,[si]
mov [di],ax
end;
writeln;
writeln('min[1..10]=',p:3);
writeln('max[1..24]=',k:3);
writeln;
for i:=1 to n do write(m:3);
readkey;
end.
Ответить