Отсортировать слова по возрастанию - Assembler
Формулировка задачи:
Добрый день. Нужна помощь, есть задание: Дано 8 слов по 6 символов. В начале каждого слова записан номер из двух символов. Расставить слова по возрастанию номеров. Не могу представить как это сделать, подкиньте идей.
Решение задачи: «Отсортировать слова по возрастанию»
textual
Листинг программы
.586 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\masm32.lib .data aszExit db 0AH,0DH,"Press Enter to Exit",0 aszString db '02верста 00гравий 23курица 15малина 09циклон 37ястреб 05термос 11фольга',0AH,0DH,0 len = $ aszCrLf db 0AH,0DH,0 .data? inbuf db 1 DUP (?) .code start: ;преобразование кодировки символов кириллицы invoke CharToOem,ADDR aszString,ADDR aszString invoke StdOut,ADDR aszString ;указать начальные адреса первого и второго слова lea esi, aszString mov edi, esi add edi, 9 base: ;вычисление числа из первого слова mov al, [esi] sub al, 30h;перевод из ascii в цифру mov bl, 10 mul bl mov bl, [esi+1] sub bl, 30h;перевод из ascii в цифру add al, bl ;сохранение числа из первого слова mov cl, al ;вычисление числа из второго слова mov al, [edi] sub al, 30h;перевод из ascii в цифру mov bl, 10 mul bl mov bl, [edi+1] sub bl, 30h;перевод из ascii в цифру add al, bl ;сравнение чисел из первого и второго слов cmp al, cl jge skip push esi ;обмен слов mov ecx, 8 change: ;получение текущих символов mov al, [esi] mov bl, [edi] ;обмен текущих символов mov [esi], bl mov [edi], al ;изменение адреса на следующий символ в каждом из слов inc esi inc edi loop change ;возвращение адреса первого слова, а адрес второго сдвигается на следующее слово pop esi inc edi jmp chkfin skip: ;адрес второго сдвигается на следующее слово add edi, 9 chkfin: ;проверка прохода всех слов в предложении cmp edi, len jl base ;меняется первое (базовое) слово на следующее, второе (позиционное) тоже на следующее слово за базовым add esi, 9 mov edi, esi add edi, 9 ;вычисление адреса начала последнего слова в предложении mov eax, len sub eax, 8 ;проверка прохода всех слов в положении базового cmp esi, eax jl base ;указание нуля в конце предложения, чтобы предложение можно было вывести на экран mov byte ptr [edi-1],0 invoke StdOut,ADDR aszCrLf invoke StdOut,ADDR aszString Invoke StdOut,ADDR aszExit Invoke StdIn,ADDR inbuf,LengthOf inbuf invoke ExitProcess,0 end start