Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort an array via x86 Assembly (embedded in C++)?? Possible?

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
 }
}

Basically nothing :( Any ideas?? Thanks in advance.

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...

like image 415
VV. Avatar asked Nov 06 '22 14:11

VV.


1 Answers

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).

like image 153
Sparafusile Avatar answered Nov 12 '22 19:11

Sparafusile