Консультация № 159881
07.02.2009, 19:56
0.00 руб.
0 1 1
Уважаемые эксперты.
Если вас не затруднит, прокоментируйте построчно прогу! И что она делает!?

Приложение:
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
x db 0
.code
mov ax,@data
mov ds,ax
mov es,ax

lea si,mas
mov cx,n
mov si,0
Vivod:
mov ah,02h
mov dl,mas[si]
add dl,30h
int 21h
inc si
loop Vivod
;-----------ЏҐаҐе®¤ ­ б«Ґ¤ бва®Єг-----
xor dl,dl
mov dl,0ah
mov ah,02h
int 21h

xor ax,ax
xor dx,dx

mov cx,n-1
mov si,1
cyc11:
push cx
mov cx,n
sub cx,si
push si
mov si,n-1
cyc12:
mov al,mas[si-1]
cmp mas[si],al
ja m1
mov x,al
mov al,mas[si]
mov mas[si-1],al
mov al,x
mov mas[si],al
m1:
dec si
loop cyc12
pop si
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

;-----------„Ґ«Ґ­ЁҐ ­ 3---------------

mov bh,4
mov di,0
mov si,0
mov cx,n

wer:
xor ax,ax
mov al,[si]
div bh
cmp ah,0
je wer_vv
jmp wer_end
wer_vv:
mov ax,ax
mov al,[si]
push ax
inc di
jmp wer_end
wer_end:
inc si
loop wer

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

Обсуждение

давно
Посетитель
7438
7205
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 ;надо указывать точку входа
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа