I am playing around with x86 assembly for the first time and I can't figure out how to sort an array (via insertion sort).. I understand the algorithm, but assembly is confusing me as I primarily use Java & C++. Heres all I have so far
int ascending_sort( char arrayOfLetters[], int arraySize )
{
 char temp;
 __asm{
     push eax
     push ebx
      push ecx
     push edx
    push esi
    push edi
//// ???
    pop edi
    pop esi
       pop edx
    pop ecx
     pop ebx
    pop eax
 }
}
Ok, this is just going to make me sound like a total idiot, but I can't even change any of the array's values in _asm
Just to test it out, I put:
mov temp, 'X'
mov al, temp
mov arrayOfLetters[0], temp
And this gave me an error C2415: improper operand type
so I tried:
mov temp, 'X'
mov al, temp
mov BYTE PTR arrayOfLetters[0], al
This complied, but it didn't change the array...
This code is in now way tested. I wrote it in notepad, which doesn't have a very good debugger, off the top of my head. It should be a good starting place however:
mov edx, 1                                  // outer loop counter
outer_loop:                                 // start of outer loop
  cmp edx, length                           // compare edx to the length of the array
  jge end_outer                             // exit the loop if edx >= length of array
  movzx eax, BYTE PTR arrayOfLetters[edx]   // get the next byte in the array
  mov ecx, edx                              // inner loop counter
  sub ecx, 1
  inner_loop:                               // start of inner loop
    cmp eax, BYTE PTR arrayOfLetters[ecx]   // compare the current byte to the next one
    jg end_inner                            // if it's greater, no need to sort
    add ecx, 1                              // If it's not greater, swap this byte
    movzx ebx, BYTE PTR arrayOfLetters[ecx] // with the next one in the array
    sub ecx, 1
    mov BYTE PTR arrayOfLetters[ecx], bl
    sub ecx, 1                              // loop backwards in the array
    jnz inner_loop                          // while the counter is not zero
  end_inner:                                // end of the inner loop
  add ecx, 1                                // store the current value
  mov BYTE PTR arrayOfLetters[ecx], al      // in the sorted position in the array
  add edx, 1                                // advance to the next byte in the array
  jmp outer_loop                            // loop
end_outer:                                  // end of outer loop
This would have been MUCH easier if you were sorting DWORD values (int) instead of BYTE values (characters).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With