16.01.2011, 02:18
общий
это ответ
Здравствуйте, Ситкин Александр Викторович!
1) данные вводятся, как числовая строка максимальной длины 128 байт с проверкой на код цифры.
Конец ввода - клавиша Enter или ровно 128 байт.
2) данные представляют собой байты-числа 0-9
[code h=200];Отсортировать по возрастанию элементы массива чисел, кратные 3.
model small ;модель памяти
.stack 512 ;стек
.data
array DB 128 dup (?) ;массив
n equ $-array ;max длина массива
len dw 0 ;реальная длина массива
sArray db 'Array: $'
sSorted db 0dh,0ah,'Sorted: $'
press db 0dh,0ah,'Press any key$'
.code
start: ;точка входа
mov ax, @data ;зададим сенменты данных
mov ds, ax
mov es, ax
lea dx, sArray
mov ah, 9
int 21h ;строка приглашения для ввода array
mov len, 0 ;будем считать длину введенной строки
lea di, array ;адрес массива array
mov cx, n ;максимальная длина массива array
c1: mov ah, 8 ;функция ввода кода без отображения
c2: int 21h
cmp al, 0dh ;по Enter-у прекращаем ввод
je sort ;на сортировку
cmp al, '0' ;проверка на цифру
jb c2 ;нецифру игнорируем
cmp al, '9'
ja c2
mov dl, al ;сохраним для вывода
and al, 0fh ;превратим в число
stosb ;сохраним
mov ah, 2 ;функция вывода символа из dl
int 21h
inc len ;считаем длину массива
loop c1 ;по всем
;попадаем сюда, если введем все 128 кодов
;отсортируем массив методом пузырька
sort:
xor si, si ;индекс элемента в массиве
mov cx, len ;число сортируемых элементов
cmp cx, 2 ;если не ввели ни одного или один
jbe result ; то нечего и сортировать - на вывод результата
dec cx ;число сравнений
mov bl, 3 ;будем делить на 3
SortLoop: ;цикл по поиску очередного минимального
mov al, array[si] ;текущий максимальный по адресу [si]
call div3 ;проверим, делится ли на 3
jne ExternalNext ;нет - обходим - на увеличение индекса текущего элемента
mov ah, al ;считаем минимальным, сохраним в ah
lea di, [si+1] ;начинаем со следующего
push cx ;сохраним счетчик
SearchMinLoop: ;цикл по всем последующим
;сравниваем текущий со всеми последующими
mov al, array[di] ;очередной последующий
call div3 ;проверим, делится ли на 3
jne InternalNext ;нет - обходим - на увеличение индекса последующего элемента
cmp ah, al ;если текущий минимальный <= последующего,
jle InternalNext ; то обходим обмен
;меняем местами элементы
xchg ah, array[di] ;ah=array[di], array[di]=ah=array[si]
mov array[si], ah ;array[si]=ah=array[di]
;по адресу array[si] и в ah новый минимальный
InternalNext:
inc di ;на следующий последующий
loop SearchMinLoop ;по всем последющим элементам
pop cx ;восстановим счетчик сравнений
ExternalNext:
inc si ;на следующий текущий
loop SortLoop ;по всем текущим элементам
result: ;массив отсортирован
lea dx, sSorted ;выводимая строка перед массивом
call print ;выведем
lea dx, press
mov ah, 9
int 21h ;press any key
mov ah, 8
int 21h ;подождем нажатия на клавишу, чтобы окно сразу не уходило :)
mov ax, 4c00h
int 21h ;выход в ДОС
print proc ;вывод массива чисел 0-9 на экран
mov ah, 9
int 21h ;выведем строку, адрес которой в dx
lea si, array ;адрес массива
mov cx, len ;число элементов
jcxz PrintRet ;если ничего не было введено, то нечего и выводить
mov ah, 2 ;функция вывода символа
PrintLoop:
mov dl, [si] ;очередной байт
or dl, '0' ;делаем символ
inc si ;на следущий байт
int 21h ;выводим
loop PrintLoop ;по всем байтам
PrintRet:
ret
print endp
;проверка деления на 3, при этом должно быть bl=3
;результат в флаге FZ: установлен - делится нацело
div3 proc
push ax ;сохраним и al и ah в стеке
mov ah, 0 ;подготовимся к делению
div bl ;ax:bl
cmp ah, 0 ;ah - остаток от деления = 0 -> разделилось нацело
pop ax ;восстановим al и ah
ret
div3 endp
end start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен