Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск элемента 
:(
    Опции темы
Tiglon
Дата 20.5.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Всем доброго времени суток.
У меня есть задание: даны числа а, b (0 < a < b) и набор из десяти элементов. Найти минимальный и максимальный из элементов что находятся в интервале (a, b)

Вот мой код
Код

.model small
.stack 100h
.386
.data
  txtbuff    db    7,0,0,0,0,0,0,0
  inparray    dw    10 dup (?)
  CRLF        db    0Dh, 0Ah, '$'
  outbuff    db    6 dup (?),'$'
  d        dw    10
 

  TextMassege1    db    "Input array:" ,13,10,13,10,"$"
  TextMassege2    db    " element: $"
  TextMassege3    db    13,10,"Input error. Try again!",13,10,"$"
  TextMassege4    db    13,10,"MAX : $"
  TextMassege5    db    13,10,"MIN : $"
  TextMassege6    db    "  element#: $"

  Max        dw    ?
  Min        dw    ?

  MaxNo        dw    ?
  MinNo    dw    ?

.code
begin:
   mov   AX,@DATA
   mov   DS,AX
   mov   ES,AX                ;ініціалізація сигменту данних

   mov   DX, offset TextMassege1       ;Вивід тексту TextMassege1
   mov   AX,0900h
   int   21h

;*** Введення 10 значень ***
   mov   CX,10
   mov   DI, offset inparray
   cld
elp:
   mov   AX,10
   sub   AX,CX

   call  NumberPrint              ;виклик процедури "вивід номеру елементу"

   mov   DX, offset TextMassege2    ;Вивід тексту TextMassege2
   mov   AX,0900h
   int   21h

   mov   DX,offset txtbuff
   mov   AX,0A00h
   int   21h                ;Ввод текста с клавиатуры в буфер

   call  StrToInt            ;виклик процедура "String to Integer"

   cmp   BL,2
   jnz   inploop               ;якщо вірно, то
   mov   DX, offset TextMassege3        ;Вивід тексту TextMassege3
   mov   AX,0900h
   int   21h

   jmp   elp
inploop:
   stosw
   call  NextLine            ;наступна стрічка
   loop  elp
;*** Пошук максимального елементу ***
   mov   CX,10
   mov   SI,offset inparray
   mov   DI,SI
   ;mov   BX,-23
   ;-32768
max1:
   lodsw
   cmp AX,BX
   jle nxt1 ;jle
   mov BX,AX
   mov MaxNo,CX
   mov DI,SI
   mov Max,BX
nxt1:
   loop max1;

   mov Max,BX

;*** Пошук мінімального елементу ***
   mov   CX,10
   mov   SI,offset inparray
   mov   DI,SI
   ;mov   BX,15
min1:
   lodsw
   cmp AX,BX
   jge nxt2 ;jge
   mov BX,AX
   mov MinNo,CX
   mov DI,SI
nxt2:
   loop min1;
   mov Min,BX

   mov   DX, offset TextMassege4    ;Вивід тексту TextMassege4
   mov   AX,0900h
   int   21h

   mov   AX,Max

   call  NumberPrint

   mov   DX, offset TextMassege6    ;Вивід тексту TextMassege6
   mov   AX,0900h
   int   21h

   mov   AX,10
   sub   AX,MaxNo

   call  NumberPrint

   mov   DX, offset TextMassege5    ;Вивід тексту TextMassege5
   mov   AX,0900h
   int   21h

   mov   AX,Min

   call  NumberPrint

   mov   DX, offset TextMassege6    ;Вивід тексту TextMassege6
   mov   AX,0900h
   int   21h

   mov   AX,10
   sub   AX,MinNo

   call  NumberPrint

   mov   AX,0800h
   int   21h                  ;"readkey"

   mov   AX,4c00h             ;Вихід
   int   21h

StrToInt PROC
   push DX
   push CX
   push SI
   mov  SI,offset txtbuff[1]
   mov  BL, 3
   mov  CL, byte ptr [SI]
   cmp  CL, 0
   jz   RCGN2
   mov  CH, 0
   mov  AX, 0
   mov  DH, 0
RecognLoop:
   inc  SI
   mul  d
   jb   RCGN2
   mov  DL, byte ptr [SI]
   cmp  BL, 3
   jnz  notfirst
   cmp  DL, "-"
   jz   RCGN1
   mov  BL, 0   ; if +
notfirst:
   cmp  DL, "0"
   jb   RCGN2;
   cmp  DL, "9"
   ja   RCGN2;
   sub  DL, "0"
   add  AX, DX
RCGNLoop:
   loop RecognLoop;
   cmp  BL,1
   jz  RCNeg
   jmp RCRet
RCGN2:
   mov BL,2
   jmp RCRet
RCGN1:
   mov  BL,1
   jmp  RCGNLoop
RCNeg:
   neg AX
RCRet:
   pop SI
   pop CX
   pop DX
   ret
StrToInt ENDP

;*** Процедура друку номера ***
NumberPrint PROC
   push SI
   mov SI,offset outbuff[6]        ;Останній символ, який був введений

   push DX
   push BX

   xor BL,BL
   test AX,8000h            ;10000000 00000000
   jz qwe                      ;якщо він додатній тоді goto на qwe
   mov BL,255
   neg AX
qwe:
   dec SI
   xor DX,DX                    ;0 -> DX
   div d                        ;AX / 10;  остаток -> DX
   add DX,'0'
   mov byte ptr [SI], DL
   test AX, 65535
   jnz qwe

   test BL,255
   jz sout
   dec SI
   mov byte ptr [SI], '-'
sout:
   mov DX,SI
   mov AX,0900h             ;Вивід стороки
   int 21h

   pop BX
   pop DX
   pop SI
   ret
NumberPrint ENDP

NextLine proc
   push DX
   push AX
   mov DX,offset CRLF
   mov AX,0900h
   int 21h
   pop AX
   pop DX
   ret
NextLine endp

end begin



С поиском мин и макс все ок, если делать задание без заданного промежутка.
Решил сделать вот так

Код

  mov   CX,10
   mov   SI,offset inparray
   mov   DI,SI
   mov   BX,-23

max1:
   lodsw
   cmp AX,BX
   jle nxt1 ;jle
   mov BX,AX
   mov MaxNo,CX
   mov DI,SI
   mov Max,BX

nxt1:
   loop max1;

   mov Max,BX


Думал задать элемент границы моего промежутка и сравнивать его с числами массива.

-------------------------------------------------------------------------------------
пока написал то что выше,  понял что я делаю не то что думаю )
-------------------------------------------------------------------------------------

Так как же организовать поиск элементов с заданным промежутком ?
А то я что-то не сильно понимаю асм.
Заранее спасибо.

Это сообщение отредактировал(а) Tiglon - 20.5.2013, 19:59
PM MAIL   Вверх
LeonidPr
Дата 4.6.2013, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Цитата(Tiglon @  20.5.2013,  19:59 Найти цитируемый пост)
С поиском мин и макс все ок, если делать задание без заданного промежутка.

Дык тогда дальше все просто, перед поиском Мин и Макс делайте проверку на вхождение в промежуток (a,b) и если не входит то JMP-пом перепрыгивайте код поиска мин и макс. вот вроде и все.
Цитата(Tiglon @  20.5.2013,  19:59 Найти цитируемый пост)
А то я что-то не сильно понимаю асм.

Сначала надо задачу понять, разобрать её на маленькие кусочки, а потом уже нужно понимание асма. Я когда асм изучал, иногда помогало написание алгоритма на С (или Паскале, впрочем не важно на чем), но без использования всяких хитрых конструкций, как можно проще, потом этот код распечатывал и пытался полученное закодить на асме. Для некоторых задач получалось очень удобно.

Это сообщение отредактировал(а) LeonidPr - 4.6.2013, 12:19
--------------------
pkunzip.zip
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.