; Да се напише подпрограма, която да връща в регистър EAX индекса на подадената ; в RDI дума в сортирания във възходящ ред масив от думи със знак с начален ; адрес и брой елементи съответно в RSI и RDX, а ако не е намерена, -1. ;int binarySearch(int t, int *x, unsigned n)/* Из книгата "Бисери на програ- */ ;{ /* мирането" от Джон Луис Бентли */ ; unsigned l = 0, u = n - 1, m; /* (там n, l, u и m са тип int). */ ; while (l <= u) { ; m = (l + u) / 2; /* Опасност от препълване (JDK-5045582)! */ ; if (x[m] < t) ; l = m + 1; ; else if (x[m] == t) ; return m; ; else /* x[m] > t */ ; u = m - 1; ; } ; return -1; ;} ; Търсената дума t е в RDI, адресът на масива x е в RSI, размерът n в RDX; ; долният индекс l е в RCX, горният u е в RDX, а средният m е в RAX (по избор). option prologue:none, epilogue:none .code binsrch proc _binsrch proc .for (RCX = 0, RDX--: RCX <= RDX: ) LEA RAX,[RDX+RCX]; m = (l + u) SHR RAX,1 ; / 2; // без знак CMP [RSI+8*RAX],RDI .break .if (equal?); if (x[m] == t) return m; .if (less?) ; if (x[m] < t) LEA RCX,[RAX+1]; l = m + 1; .else ; else /* x[m] > t */ LEA RDX,[RAX-1]; u = m - 1; .endif .endfor .if (!equal?) MOV RAX,-1 ; return -1; .endif RET _binsrch endp binsrch endp end