Всем доброго времени суток. У меня есть задание: даны числа а, 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
|
Думал задать элемент границы моего промежутка и сравнивать его с числами массива.
------------------------------------------------------------------------------------- пока написал то что выше, понял что я делаю не то что думаю ) -------------------------------------------------------------------------------------
Так как же организовать поиск элементов с заданным промежутком ? А то я что-то не сильно понимаю асм. Заранее спасибо. |