выложу образец программы на ассемблере, если сможете по данному образцу чем-то помочь по моей задаче, буду благодарен
Код:
; Двоичный поиск в массиве Arr значения Y
.model tiny ; модель памяти, используемая для COM
.code ; начало сегмента кода
org 100h ; начальное значение счетчика - 100h
start:
lea di,Arr ; в di адрес начала массива
Mov Bx, Y ; в Bx искомое значение
Xor Cx,Cx ; Cx=0 -- не нашли
Cmp Bx,[di] ; Y <=Arr[1] ?
Ja Chk_last ; нет, сравнить с последним
Je Eq_1 ; равно первому?
jmp Output ; нет в массиве -- вывод результата
Eq_1:
inc Cx ; Cx=1 --нашли
jmp Output ;
Chk_last:
Mov Si,n ; в Si количество элементов массива
dec Si
Shl Si,1 ; в Si длина массива в байтах
Add Si,di ; в Si адрес последнего элемента
Cmp bx,[si] ; Arr[n]>=Y?
Jb search ; нет, искать в середине
Je Eq_n ; равно последнему
jmp Output ; нет в массиве, больше последнего
Eq_n:
inc Cx ; нашли = последнему
jmp Output;
;поиск внутри массива
search:
Mov Si, n ; в si смещение на половину массива
Iven_inx:
Test Si,1 ; проверка на четность
Jz Add_inx ;
Inc Si ; сделать четным
Add_inx:
Add di,si ; в di адрес очередного элемента
Compare:
Cmp Bx,[di] ; Arr[i] = Y?
Je All_done ; нашли
Ja Higer ; выбрать отрезок для продолжения поиска
; искать в левой части
Cmp Si,2 ; не закончились элементы?
Jne inx_ok ;
no_match:
jmp Output ;не нашли
inx_ok:
Shr Si,1 ; разделить индекс на 2
Test Si,1 ; проверить на четность Si
Jz Sub_inx
Inc Si ; сделать четным
Sub_inx:
Sub di,si ; в di адрес очередного элемента
Jmp Compare
; искать в правой части
Higer:
Cmp Si,2 ; не закончились элементы?
je no_match ; да - выход
Shr Si,1 ; разделить индекс на 2
Jmp Iven_inx
All_done :
inc Cx ; нашли
; вывод результата
Output:
mov ah,9 ;
Test Cx,1 ;
Jz Send_no ;
Send_yes:
mov dx,offset Res_yes ;
Jmp Print
Send_no:
mov dx,offset Res_no ;
Print:
int 21h ;
ret ;
Arr dw 1,12,33,41,55
Y dw 33
n dw 5
Res_yes db 'Value exist'
db 0Dh,0Ah,'$'
Res_no db 'Value not found'
db 0Dh,0Ah,'$'
end start