model small
n equ 10
stack 100h
.data
a dw n dup(?)
dbEnter db 10,13,'Enter a('
numb db '0):$'
dbResult db 10,13,'Result:$'
.code
;настраиваем сегментные регистры
begin: mov ax,@data
mov ds,ax
mov es,ax
;устанавливаем количество элементов и адрес массива
mov cx,n
lea di,a
;в цикле вводим один элемент
@@01: call InputNumber
stosw;записываем введенное число в память
;изменяем индекс массива
inc byte ptr[numb]увеличиваем выводимый индекс массива
loop @@01
;устанавливаем исходные данные
;для сортировки убыванию
lea bx,a+n-2;устанавливаем базовый адрес
mov di,-n;устанавливаем индекс
mov dx,2;устанавливаем напрвление движения
call sort
;устанавливаем исходные данные
;для сортировки возрастанию
lea bx,a+n;устанавливаем базовый адрес
mov di,n;устанавливаем индекс
mov dx,-2;устанавливаем напрвление движения
call Sort
;выводдим сообщение о выполненой работе
mov ah,9
lea dx,dbResult
int 21h
;устанавливаем количество элементов и адрес массива
mov cx,n
lea si,a
;выводим в цикле весь массив
@@04: lodsw
call OutputNumber
loop @@04
;ждем любую клавишу и выходим
xor ax,ax
int 16h
mov ax,4c00h
int 21h
;подпрограмма сортировки
;проверяем первый индекс массива
Sort: add di,dx;добавляем шаг
jz S_2;ноль сортировка закончилась
;загружаем значение текущего элемента
mov ax,[bx+di];провряемое значение
mov si,di;текущий указатель
;проверяем второй индекс массива
S_1: or si,si;ноль - заканчиваем проверку
jz Sort
add si,dx;следующее значение
;проверяем с текущим элементом
cmp ax,[bx+si];проверяем с очередным значением
ja S_1
;производим замену элементов
xchg ax,[bx+si]
mov [bx+di],ax
jmp short S_1
S_2: ret
;
;вывод одного числа
OutputNumber: push cx
mov bx,10;система счисления
xor cx,cx;счетчик цифр в числе
;делим на 10 и остаток помещаем в стек
O_N: xor dx,dx
div bx;получаем остаток от деления
push dx;запоминаем в стеке
inc cx;считаем число запомненый цифр
or ax,ax;продолжаем пока АХ не равно нулю
jnz O_N
;30h-10h=20h, код символа пробел
mov ax,-10h
;добавляем в стек символы разделители
O_N_1: push ax;запомнаем в стеке служебный код пробела
inc cx;увеличиваем счетчик
cmp cx,5;выравниваем счетчик до 5-ти цифр
jb O_N_1
;извлекаем из стека в нужном порядке цифры
@@O_N: pop ax;извдекаем из стека цифру
add ax,'0';добавляем код символа "ноль"
int 29h;выводим на экран
loop @@O_N;в цикле пока СХ больше нуля
pop cx
ret
;
;подрограмма ввода одного числа
;приглашаем ввести одно число
InputNumber: lea dx,dbEnter
mov ah,9
int 21h
;устанавливаем введеное число в ноль и систему счисления
xor si,si;тут будет суммироватся вводимое число
mov bx,10;система счисления
;считываем один символ без отображения на экране
I_N: xor ax,ax
int 16h
;проверяем клавишу ВВОД и цифровые, остальные игнорируем
cmp al,13;клавиша ввод
jz @@i_N
cmp al,'0';меньше 0 игнорируем
jb I_N
cmp al,'9';больше 9 игнорируем
ja I_N
;цивровая клавиша - выводим символ
int 29h
;умножаем ранее веденное значение на 10-ть
and ax,0fh;АХ=0-:-9
xchg ax,si;si:=0-:-9, AX=ранее веденное число
xor dx,dx
mul bx;АХ умножаем на ВХ, т.е. АХ=АХ*10
;суммируем с последней введенной цифрой
add si,ax;;si:=(0-:-9) + АХ*10
jmp short I_N;продолжаем ввод текущего числа
;выход результат в АХ
@@I_N: mov ax,si;ввод закончен, в АХ- текущее число
ret
end begin
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.