Сортировка строки на Assembler

Помогите пожалуйста с заданием:

Необходимо написать программу на Assembler которая выполняет чтение строк из файла txt, сортирует слова в каждой строке по алфавиту (по 1-ой букве, потом по 2-ой и т.д.),после обработки массива строк программа должна записать результат в созданный файл out.txt. При этом результат обработки каждой строки должен находиться в отдельной строке, а вначале строки должен быть указан номер строки. При работе необходимо использовать команды Assembler для работы массивами строковых данных (цепочные команды: LODS, STOS, MOVS, CMPS).

На данном этапе у меня написан только код копирования строки из исходного файла в конечный, но я не могу придумать как реализовать сортировку.

.386
.model flat, stdcall
option casemap :none

include includes\windows.inc
include includes\masm32.inc
include includes\kernel32.inc

includelib includes\masm32.lib
includelib includes\kernel32.lib

buf_s equ 128

.data
input_file db "F:\LabsAsm\prog7\input.txt", 0
output_file db "output.txt",0
inHandle dd ?
outHandle dd ?
consHandle dd ?
read dd ?
written dd ?
read_buffer db buf_s dup (?)
line_buffer db buf_s dup (?)
line_len dd ?
sort_buffer dd buf_s dup (?)
line_end db 0Ah, 0Dh
strnum db ?
point dd ?
buf_p dd ?
buf db 1 dup(?)
newstr db 13,10


.code
start:
invoke GetStdHandle, -11
mov consHandle, eax
invoke CreateFileA, offset input_file, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
mov inHandle, eax
invoke CreateFileA, offset output_file, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
mov outHandle, eax

invoke ReadFile, inHandle, addr buf, buf_s, offset read, 0
invoke WriteConsoleA, consHandle,addr buf, sizeof buf_s, written, 0

mov buf_p, offset buf
mov strnum, 31h
cycle:
mov edi, offset read_buffer
call BufClear
mov edi, offset line_buffer
call BufClear

mov esi, buf_p
mov edi, offset read_buffer
call CopyString
mov eax, edi
sub eax, offset read_buffer
mov line_len,eax
mov buf_p, esi
mov ecx, line_len
mov esi, offset read_buffer
mov edi, offset line_buffer
cld
sort_loop:
lodsw
stosw
loop sort_loop
invoke WriteFile, outHandle,offset strnum,2,addr written,0
invoke WriteFile, outHandle,addr line_buffer,buf_s,offset written,0
mov ecx, buf_p
sub ecx, offset buf
mov ebx, read
sub ebx, ecx
cmp ebx, 1
jle EndPart
inc strnum
jmp cycle
EndPart:
invoke CloseHandle, inHandle
invoke CloseHandle, outHandle
invoke ExitProcess, 0
CopyString PROC
cld
CopyStringLoop:
lodsb
cmp al, 0Ah
je CopyStringLoop
stosb
cmp al, 00h
je OutCopy
cmp al, 0Dh
jne CopyStringLoop
OutCopy:
ret
CopyString ENDP

BufClear PROC
cld
xor ecx,ecx
mov cx, buf_s
xor ax, ax
rep stosb
ret
BufClear ENDP

end start 

Ответы (0 шт):