.model tiny
.data
s_array db 'Array ', '$'
s_length db ' (length ', '$'
s_end db '):', 0ah, '$'
; Данные для генератора случайных чисел
rndseed dw ?
rndmod dw 32749
rnd_1 dw ?
rnd_2 dw ?
rndcur dw 1
; Массив
cnt dw 2
arrlen dw ?
maxarrlen equ 50
arr dw maxarrlen dup(?)
SSEG segment stack
db 400h dup(?)
SSEG ends
.code
pnewline proc
push dx
mov dx, 0ah
mov ah, 6h
int 21h
pop dx
ret
pnewline endp
pspace proc
push dx
mov dx, ' '
mov ah, 6h
int 21h
pop dx
ret
pspace endp
pdig proc
push ax
push dx
or ax, 30h
mov dx, ax
mov ax, 0
mov ah, 6h
int 21h
pop dx
pop ax
ret
pdig endp
pnum proc
push bx
push cx
push dx
mov cx, 0
digloop:
mov dx, 0
mov bx, 10
div bx
push dx
inc cx
cmp ax, 0
je pdigloop
jmp digloop
pdigloop:
pop ax
call pdig
loop pdigloop
pop dx
pop cx
pop bx
ret
pnum endp
rndgenseed proc
push ax
push bx
push cx
push dx
mov ah, 2Ch
int 21h
mov ax, dx
mov dx, 0
div rndmod
inc dx
mov rndseed, dx
mov ax, rndmod
mov dx, 0
div rndseed
mov rnd_1, ax
mov rnd_2, dx
pop dx
pop cx
pop bx
pop ax
ret
rndgenseed endp
rndnum proc
push ax
push bx
push cx
push dx
mov ax, rndcur
mov dx, 0
idiv rnd_1
push ax;
mov ax, rndseed
imul dx
mov bx, ax
mov ax, rnd_2
pop dx
imul dx
sub bx, ax
cmp bx, 0
jge pos
add bx, rndmod
pos:
cmp bx, 0
jne notzero
inc bx
notzero:
mov rndcur, bx
pop dx
pop cx
pop bx
pop ax
ret
rndnum endp
rndarr proc
push ax
push bx
push cx
push dx
; Генерация случайного числа для длины массива
call rndnum
mov ax, rndcur
cmp ax, maxarrlen
jle shortenough
mov dx, 0
mov bx, maxarrlen
div bx
mov ax, dx
shortenough:
mov arrlen, ax
; Заполнение массива случайными числами
mov bx, offset arr
mov cx, arrlen
arrloop:
call rndnum
mov ax, rndcur
mov [bx], ax
add bx, 2
loop arrloop
pop dx
pop cx
pop bx
pop ax
ret
rndarr endp
; Подпрограмма вывода массива
parray proc
mov dx, cx
printloop:
mov ax, [bx]
add bx, 2
call pnum
call pspace
mov ax, dx
sub ax, cx
push bx
push dx
mov dx, 0
mov bx, 5
div bx
cmp dx, 4
pop dx
pop bx
je ifeq
jmp ifend
ifeq:
call pnewline
ifend:
loop printloop
call pnewline
ret
parray endp
; Основная программа
main proc
; Установка регистров сегмента данных и стека
push cs
pop ds
; Генерация random seed
call rndgenseed
mov ax, rndseed
mov cx, cnt
mainloop:
; Генерация массива
call rndarr
; Вывод информации о массиве
mov ah, 9h
mov dx, offset s_array
int 21h
mov ax, cnt
sub ax, cx
inc ax
call pnum
mov ah, 9h
mov dx, offset s_length
int 21h
mov ax, arrlen
call pnum
mov ah, 9h
mov dx, offset s_end
int 21h
; Вывод массива
push cx
mov bx, offset arr
mov cx, arrlen
call parray
call pnewline
pop cx
loop mainloop
; Завершение работы программы
mov ah, 4ch
int 21h
main endp
end main