Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Массивы - промежутки монотонности

Вопрос:
Дан массив размера 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

   Вперёд
   Содержание