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