Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2015, 10:28   #1
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
Сообщение Поиск максимального и минимального элементов массива

На ассемблере MASM нужно написать процедуры нахождения максимального и минимального элементов массива четырехбайтовых целых чисел. Процедуры принимают 2 параметра (адрес первого элемента массива, количество элементов массива).
Написал процедуру нахождения максимального элемента, помогите найти минимальный:
Код:
getmax PROC x                                ;
   mov bl, 0                                 ; максимальное значение массива в bl, изначально ноль
   mov esi, x                                ; адрес начала массива
   cld                                       ; esi будет увеличиваться
Next:                                        ;
   lodsd                                     ; поместить байт по адресу esi в al, esi увеличится на один
   cmp al, 0                                 ; проверка на "последний байт"
   je Exit                                   ; если он то переход по метке
   cmp  al, bl                               ; сравнить с предыдущим результатом
   jb Next                                   ; если полученный байт меньше перейти к повторному чтению массива (следующего байта)
   mov bl, al                                ; сохранить новое значение как большее
   jmp Next                                  ; перейти к повторному чтению массива (следующего байта)
Exit:         
   mov max, bl
   mov eax, 0
   mov al, max
   ret 1                                     ;
getmax ENDP                                  ;
Ти6ка вне форума Ответить с цитированием
Старый 23.12.2015, 17:53   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Ти6ка Посмотреть сообщение
Написал процедуру нахождения максимального элемента:
Код:
   cmp  al, bl             ; сравнить с предыдущим результатом
   jb Next                 ; если полученный байт меньше перейти к повторному чтению массива (следующего байта)
Цитата:
Сообщение от Ти6ка Посмотреть сообщение
..помогите найти минимальный:
Код:
   cmp  al, bl              ; сравнить с предыдущим результатом
   ja Next                  ; если полученный байт больше перейти к повторному чтению массива (следующего байта)
.. JB применил, теперь юзай JA.
По-буржуйский - переходы именуются так:

Код:
  equal - равно  (JE)        zero - ноль   (JZ)
  above - выше (JA)       greater - больше (JG) 
  below - ниже   (JB)        less - меньше (JL)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 24.12.2015, 11:40   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Ти6ка, ты говоришь про 4-байтные числа, а проверка у тебя однобайтная..
Код в приложении выводит MAX/MIN двойных слов. Просто добавляй в массив любые числа, но не затери маркер конца(0) в хвосте массива.

Числа - беззнаковые, параметры передаются: SI = адресс первого элемента, длинна вычисляется автоматом по маркеру конца(0). Компилятор FASM. Можеш просто выдернуть из кода функцию "findMax_Min":
Код:
USE16
ORG 100h
JMP start

mess0  DB  13,10,' FIND MAX & MIN ELEMENT OF THE ARRAY(R)'
       DB  13,10,' ---------------------------------------'
       DB  13,10,' Current array..: $'
mess1  DB  13,10,10,' Max element ...: $'
mess2  DB  13,10,07,' Min element ...: $'

array  DD  187861300, 10887, 823745501, 3294967295, 10125594, 864410, 0   ;<--| нуль - маркер конца
max    DD  0
min    DD  0

start:
   MOV   AH,9                   ; покажем шапку программы
   MOV   DX,mess0
   INT   21h

   MOV   SI,array     ;<========; Выведем весь массив на экран ==================================//
write:                          ; настроим SI на для LODSD
   LODSD                        ; берём первые/4 байта с массива
   OR    EAX,EAX                ; это последнее число?! (маркер конца)
   JZ    findMax_Min            ; да - переходим к сортировке..
   MOV   EBX,10                 ; нет - выводить число будем в DEC
   CALL  HEX2ASC                ; зовём функцию перевода числа в символы
   MOV   AL,' '                 ; вставим пробел/разделитель
   INT   29h
   LOOP  write                  ; берём следующее/двойное слово...

findMax_Min:                    ; массив показали на экране! Теперь поиск..
   MOV   SI,array               ; SI указывает на начало массива
   LODSD                        ; читаем в EAX первый элемент массива
   MOV   [max],EAX              ; кидаем его в переменные MAX/MIN
   MOV   [min],EAX
kastrator:                      ; кастрируем лишние элементы..
   LODSD                        ; берём следующий элемент
   OR    EAX,EAX                ; это маркер конца?!
   JZ    print                  ; да - заканчиваем сортировку
   CMP   EAX,[min]              ; нет - сравниваем его с переменными
   JAE   @1                     ; больше/равно? записываем его в переменную(MAX)
   MOV   [min],EAX              ; иначе - пишем в переменную(MIN)
@1:
   CMP   EAX,[max]              ; теперь проверяем на MAX
   JBE   @2                     ; меньше/равно? Не трогаем..
   MOV   [max],EAX              ; иначе - пишем его в переменную(MAX)
@2:
   LOOP  kastrator              ; берём следующий элемент массива..

print:                          ; всё проверили!
   MOV   AH,9                   ; покажем мессагу MAX
   MOV   DX,mess1
   INT   21h
   MOV   EAX,[max]              ; возьмём MAX-число с переменной
   MOV   EBX,10                 ; выводить на экран будем в 10-тичной СС
   CALL  HEX2ASC                ; покажем число!

   MOV   AH,9                   ; покажем мессагу MIN
   MOV   DX,mess2               ; ^^.. и всё-тоже..
   INT   21h
   MOV   EAX,[min]
   MOV   EBX,10
   CALL  HEX2ASC


exit:
   XOR   AX,AX                  ; ждём клавишу и на выход
   INT   16h
   INT   20h

;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;//==========; Процедура переводит число в символы и выводит их на экран ==========|
;//==========; на входе принимает: АХ = число, BX = система счисления =============| 
HEX2ASC:
   PUSHA                   
   XOR   CX,CX
isDiv:
   XOR   EDX,EDX
   DIV   EBX
   PUSH  EDX
   INC   CX
   OR    EAX,EAX
   JNZ   isDiv
isOut:
   POP   EAX
   CMP   AL,9
   JLE   noHex
   ADD   AL,7
noHex:
   ADD   AL,30h
   INT   29h
   LOOP  isOut
   POPA
RET
Изображения
Тип файла: gif 8971.gif (8.4 Кб, 710 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти разность максимального и минимального элементов в массивах С(14) и Т(8). Amaday Паскаль, Turbo Pascal, PascalABC.NET 0 09.12.2012 15:36
Поиск максимального (минимального) элемента массива в Delphi ICE1589 Помощь студентам 0 08.04.2011 13:32
Поиск максимального и минимального элемента массива(с существенным дополнением) Dayterius Паскаль, Turbo Pascal, PascalABC.NET 6 20.05.2009 11:37
Поиск минимального (максимального) элемента массива Radamant Помощь студентам 10 24.12.2008 17:44