08.02.2009, 01:03
общий
это ответ
Здравствуйте, Козлов Вячеслав !
Прграмма сначала выводит массив, потом сортирует по возрастанию, выводит отсортированный массив.
После чего ищет числа, делящиеся на 4, и, наконец, выводит найденные числа на экран.
Причем выводит их в обратном порядке.
Программа с комментариями в приложении
Приложение:
MASM
.model small ;модель памяти
.stack 100h ;стек
.data ;сегмент данных
mas db 1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1,0
n = $ - mas ;длина mas ($ - текущий адрес)
x db 0 ;переменная для обмена
.code ;сегмент кода
start:
mov ax,@data ;иницируем сегментные регистры DS и ES
mov ds,ax ; адресом сегмента данных
mov es,ax
;lea si,mas ;адрес массива (лишняя команда ...)
mov cx,n ;длина массива
mov si,0 ;индекс в массиве mas
Vivod: ;цикл вывода на экран
mov ah,02h ;функция вывода символа на экран
mov dl,mas[si] ;очередной код
add dl,30h ;превраим код 0-9 в символ '0'-'9'
int 21h ;отработаем
inc si ;на следующий сивол
loop Vivod ;cx=cx-1, повторим, пока cx не 0
;-----------Переход на след строку-----
;xor dl,dl ;лишняя команда...
mov dl,0ah ;код перехода на следующую строку
mov ah,02h ;функция вывода символа
int 21h
;Сортируем по возрастанию методом пузырька
;xor ax,ax ;лишняя команда...
;xor dx,dx ;лишняя команда...
mov cx,n-1 ;число элементов - 1
mov si,1 ;индекс второго элемента - текущий1
cyc11:
push cx ;сохраним счетчик в цикле
mov cx,n
sub cx,si ;число элементов от текущего1 до конца
push si ;сохраним индекс текущего1
mov si,n-1 ;будем идти с конца, si - текущий1 - индекс последнего элемента
cyc12: ;цикл поиска минимального от последнего до текущего1-1
mov al,mas[si-1];элемент перед текущим2
cmp mas[si],al ;если текущий2 больше предыдущего,
ja m1 ;то идем на следующий
mov x,al ;иначе меняем местами
mov al,mas[si]
mov mas[si-1],al
mov al,x
mov mas[si],al
m1:
dec si ;индекс следующего текущего2
loop cyc12 ;до текущего1
pop si ;востановим текущего1
inc si ;на следующий
pop cx ;восстановим счетчик
loop cyc11 ;по всем элементам
;выводим после сортировки
mov cx,n ;число элементов
mov si,0 ;индекс
Vivod1:
mov ah,02h ;ф-я вывода
mov dl,mas[si] ;элемент массива
add dl,30h ;в виде символа
int 21h
inc si ;на следующий
loop Vivod1
;-----------Переход на след строку-----
;xor dl,dl
mov dl,0ah ;код перехода на следующую строку
mov ah,02h
int 21h
;-----------Деление на 4--------------- (а не на 3)
;Поиск чисел, делящихся на 4
mov bh,4 ;будем делить на 4
mov di,0 ;счетчик чисел, которые делятся на 4
mov si,0 ;индекс в массиве
mov cx,n ;счетчик элементов
wer:
xor ax,ax ;ah=0
mov al,[si] ;очередной байт
div bh ;делим на 4
cmp ah,0 ;нацело?
je wer_vv ;продолжаем
jmp wer_end ;на следующий
wer_vv: ;число разделилось нацело на 4
mov ax,ax
mov al,[si] ;еще раз прочитаем
push ax ;сохраним в стеке
inc di ;посчитаем
;jmp wer_end ;лишнее
wer_end:
inc si ;на следующий элемент
loop wer ;циклим по всем
;выведем найденные элементы, делящиеся на 4
;причем в обратном порядке
;xor ax,ax ;лишнее
;xor dx,dx ;лишнее
mov cx,di ;счетчик чисел в стеке
Vivod2:
mov ah,02h ;ф-я вывода
pop dx ;восстановим число из стека
add dl,30h ;сделаем символом
int 21h ;выведем
loop Vivod2 ;по всем
;xor dx,dx ;лишнее
mov dl,0ah ;перевод строки
mov ah,02h
int 21h
exit:
mov ax,4c00h ;выход в ДОС
int 21h
end start ;надо указывать точку входа
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен