|
Ассемблер в примерах - Массивы - промежутки монотонности
- Вопрос:
- Дан массив размера N. Определить количество его промежутков монотонности (то есть участков, на которых его элементы возрастают или убывают).
- Ответ:
- Программа в приложении.
.186
.model tiny
.code
ORG 100h
;количество элементов
n equ 10
;переходим в 3-ий текстовый режим
start: mov ax,3
int 10h
;готовимся к циклу проверки
mov cx,n-2
mov si,offset mass
cld
;проверяем первый элемент
lodsb
mov bx,1
cmp al,[si]
;если ниже переходим
jl findLoop
;ставим маркер большей монотонности
mov bh,-1
;считываем следующие число
findLoop: lodsb
;проверяем числа
cmp al,[si]
;если они равны, то пропускаем
jz noChange
;если меньше, то п переходим
jl isNize
;проверяем флаг монотонности
or bh,bh
;если не равно 0,то переходим, т.к. монотонность не изменилась
jnz noChange
;меняем направление монотонности
mov bh,-1
jmp short yesChange
;проверяем монотонность
isNize: or bh,bh
jz noChange
xor bh,bh
;увеличиваем счетчик
yesChange: inc bl
noChange: loop findLoop
;выводим число в 10-ой системе
xor ah,ah
mov al,bl
mov bx,10
;получаем остаток от деления на 10
isDiv: xor dx,dx
div bx
;запоминаем его в стеке
push dx
;считаем количество цифр в стеке
inc cx
;продолжаем пока АХ не равно 0
or ax,ax
jnz isDiv
;из стека извлекаем цифры в нужном порядке и выводим из на экран в цикле
isOut: pop ax
or al,30h
int 29h
loop isOut
;ожидаем нажатие любой клавиши
xor ax,ax
int 16h
;выходим в дос
ret
;сам массив
mass db 1,2,5,3,4,6,5,7,3,2
END start
| |