Осуществить сортировку нескольких сторок методом вставки в алфавитном порядке. каждая строка не превышает 100 символов .количество строк не более 20.
;осуществить сортировку нескольких сторок методом вставки в алфавитном порядке
; каждая строка не превышает 100 символов .количество строк не более 20
format mz
begin:
mov ax,cs
mov ds,ax
mov es,ax
call vvods
push ax
call sort
mov ah,9
mov dx,otsortmsg
int 21h
pop ax
call vuvod
mov ah,0x4C ;эта функция завершает программу
mov al,0 ;код возврата 0
int 0x21 ;вызываем ядро операционной системы
;;;;;;;;;;;;;;;;;;;;;;;;;;
;=========================
endl db 10,13,'$'
buf db 2020 dup (0) ;100 * 20 +20(конец строки)=2020 символов
temp db 101 dup (0); для обмена
vveditemsg db "Vvedite stroku:$"
otsortmsg db "Otsortirovanie strki:",10,13,'$'
sort:
;aх= количество строк
;берем элемент и сравниваем его с передыдущими элементами
;если нашли что элемент меньше за предыдущее то все сдигаем
;и оставляем место чтоб вставить туда элемент
;сравнение начинаем с первого элемента
cld ;flag
mov cx,ax
dec cx
xor bx,bx
mov bx,100
.cikl:
push cx
push bx ;???????????????????????????
mov di,buf
mov si,di ;???????????????????????????
add si,bx
;-------------------
@@:
;mov si,di ;строка которую будем со всеми сравнивать
push si
push di
mov cx,100
repe CMPSB
;jle .bolshe ;по убыванию
jge .bolshe ;по возрастанию
;je .bolshe
;вставляем туда а все остальное свигаем вправо
pop di ;куда нужно положить
pop si ;какую строчку берем
mov ax,di;сохраняем чтоб не потерять
;с si помещяем в переменную и затем строка -1 помещяем в si
;а в строку -1 помещяем все с переменои и так пока si не будет равен ах
.start:
cmp ax,si
ja .exitobmen
je .exitobmen
push si
; si->temp
mov di,temp ;???????????????????????????
mov cx,100 ;???????????????????????????
rep MOVSB
;si-100>si
pop si
mov di,si
sub si,100 ;???????????????????????????
push si
mov cx,100
rep MOVSB
;temp>si-100
pop si
push si
mov di,si
mov si,temp
mov cx,100 ;???????????????????????????
rep MOVSB
pop si
jmp .start
.exitobmen:
;call vuvmes
;конец обменан(смещения)
jmp .exitcikl
.bolshe:
pop di
pop si
add di,100 ;???????????????????????????
cmp si,di
je .exitcikl
jmp @r
.exitcikl:
;--------------------
;--------------------
pop bx
pop cx
add bx,100
loop .cikl
ret
vvods:
;воодим строки до пустой строки или уже ввели 20 строк
mov cx,20
xor bx,bx
@@:
push cx
push bx
mov ah,9
mov dx,vveditemsg
int 21h
pop bx
pop cx
push cx
push bx
;============
mov dx, buf
add dx,bx
mov ah,3Fh
mov bx,0
mov cx,99; максимум символов
int 21h
;===============
pop bx
pop cx
add bx,100
cmp ax,99
je .next
sub ax,2
.next:
add dx,ax ;???????????????????????????
mov ah,'$' ;???????????????????????????
mov si,dx ;???????????????????????????
mov [si],ah ;???????????????????????????
cmp al,0
je .ext2 ;если ничего не ввели
loop @r
mov ax,20 ;???????????????????????????
jmp @f
.ext2:
mov ax,21
@@:
sub ax,cx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vuvod:
xor bx,bx
mov cx,ax
;inc cx
.cikl:
push cx
push bx
mov ah,9
mov dx,buf
add dx,bx
int 21h
mov ah,9
mov dx,endl
int 21h
pop bx
pop cx
add bx,100 ;???????????????????????????
loop .cikl
ret;
;;;;;;;;;;;;
|