Отсортировать слова по возрастанию - 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

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы