Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here is the (almost 1:1) working code you posted for a standalone assembly.</p> <p>binsearch.cpp</p> <pre><code>extern "C" { bool BinSearch(int searchNum, int myArray[], int arraySize); }; // This is the inlined version. bool BinSearchInline(int searchNum, int myArray[], int arraySize) { int middle; int first; int last; char found; _asm { push ebx push esi push edi mov first,0 mov eax, arraySize sub eax,1 mov last ,eax mov found,0 LocalLoop: mov eax, first cmp eax, last jg NotFound mov eax, first add eax, last cdq sub eax,edx sar eax,1 mov middle,eax mov eax,middle mov ecx,myArray mov edx,searchNum cmp edx, dword ptr [ecx+eax*4] jle MaybeLower mov eax, middle add eax,1 mov first, eax jmp WhileLoop MaybeLower: mov eax, middle mov ecx, myArray mov edx, searchNum cmp edx,dword ptr [ecx+eax*4] jge Found mov eax, middle sub eax,1 mov last, eax jmp WhileLoop Found: mov al,1 jmp Done WhileLoop: jmp LocalLoop NotFound: xor al,al Done: pop edi pop esi pop ebx }; } int main(int argc, char*arg[]) { int testvalues[7]; for(int i = 0; i &lt; 7; i++) testvalues[i] = i; bool b = BinSearch(8, testvalues, 7); // false, value not in array b = BinSearch(3, testvalues, 7); // true, value is in array. b = BinSearchInline(8, testvalues, 7); // false b = BinSearchInline(3, testvalues, 7); // true return 0; } </code></pre> <p>binsearch.asm</p> <pre><code>.486 .model flat, C option casemap :none .code BinSearch PROC, searchNum:DWORD, myArray:PTR DWORD, arraySize:DWORD LOCAL first:DWORD LOCAL middle:DWORD LOCAL last:DWORD LOCAL found:BYTE push ebx push esi push edi ; This block is only for debugging stack errors and should be removed. ; lea edi,[ebp-0F0h] ; mov ecx,3Ch ; mov eax,0CCCCCCCCh ; rep stos dword ptr es:[edi] mov dword ptr [first],0 mov eax,dword ptr [arraySize] sub eax,1 mov dword ptr [last],eax mov byte ptr [found],0 ; not even used. @@Loop: mov eax,dword ptr [first] cmp eax,dword ptr [last] jg @@NotFound mov eax,dword ptr [first] add eax,dword ptr [last] cdq sub eax,edx sar eax,1 mov dword ptr [middle],eax mov eax,dword ptr [middle] mov ecx,dword ptr [myArray] mov edx,dword ptr [searchNum] cmp edx,dword ptr [ecx+eax*4] jle @@MaybeLower mov eax,dword ptr [middle] add eax,1 mov dword ptr [first],eax jmp @@WhileLoop @@MaybeLower: mov eax,dword ptr [middle] mov ecx,dword ptr [myArray] mov edx,dword ptr [searchNum] cmp edx,dword ptr [ecx+eax*4] jge @@Found mov eax,dword ptr [middle] sub eax,1 mov dword ptr [last],eax jmp @@WhileLoop @@Found: mov al,1 jmp @@Done @@WhileLoop: jmp @@Loop @@NotFound: xor al,al @@Done: pop edi pop esi pop ebx ret BinSearch ENDP END </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload