; Пример выполнения курсового проекта МОЯ спец. ЭВМз
%nolist
include mac.lib; подключение файла с макросами –библиотека макросов mac.lib
%list
a_data segment para;отмечаем начало сегмента данных
n dw?; Поле для числа элементов массива X
m dw?; Поле для числа элементов массива Y
X DW 10 dup (?);Поле для массива X из 10 элементов
Y DW 8 dup(?);Поле для массиваY из 8 элементов
kolX dw?; поле для числа четных элементов массива X
kolY dw?; поле для числа четных элементов массива Y
; Сообщения программы
mesa db 10, 13, ' VVOD MASSIVA X [1..N] $'
mesb db 10, 13, ' VVOD MASSIVA Y [1..M] $'
mes1 db 10, 13,' Vvedite kolichestvo elementov massiva X [1..10] N=$';
mes2 db 10, 13, 'Vvedite kolichestvo elementov massiva Y [1..8] M =$';
mesch db 10,13,'? $'
mes3 db 10,13,10,13, ' MASSIV X: $'
mes4 db 10,13, ' MASSIV Y: $'
mes5 db 10,13,' CHETNIX ELEMENTOV: $'
inform db 10,13,' FAMOILIA IMiA Variant Group $';!Замените на свое
task db 10,13,' USLOVIE ZADACHI $'
a_data ends
; отмечаем начало сегмента стека
a_stack segment para stack
db 128 dup(?)
a_stack ends
; отмечаем начало сегмента кодов
a_code segment para
assume ds:a_data, cs:a_code, ss:a_stack
; Тексты процедур
; Вывод информации ОБ авторе и задании....
about proc near
message inform
message task
crlf
ret
about endp
; Процедура Вывод целого числа со знаком из регистра AX
print proc near
print_number
ret
print endp
; Ввод с консоли целого числа со знаком в регистр AX
; При вводе ошибочного символа повторный ввод
vvod1 proc near
er: message mesch
key_$2bin; При ошибке ввода флаг CF устанавливается в 1
jnc vozvrat; Если флаг CF=1, то переход на повторный ввод
jmp er
vozvrat: ret
vvod1 endp
; Ввод элементов одномерного массива целых чисел со знаком
vvod_mas proc near
; bx- адрес массива cx-количество элементов
mov si,0
cikl1:
call vvod1
mov [bx]+[si],ax
add si,2;
loop cikl1
ret
vvod_mas endp
; Вывод элементов одномерного массива целых чисел со знаком
print_mas proc near
; параметры
; bx- адрес массива
; cx-количество элементов
;
mov si,0
cikl2:
mov ax,[bx]+[si]
call print
add si,2
loop cikl2
ret
print_mas endp
; Процедура подсчета четных элементов массива
SCHET PROC NEAR
; передача параметров через регистры
; bx- смещение массива или адрес первого элемента массива
; cx- число элементов в массиве
; ax- возвращаемый результат вычисления(число четных элементов)
;
; использование регистров:
; SI-содержит делитель(2) для проверки четности
; DI – накапливает количество четных чисел
; CX – счетчик повторений цикла
; ВХ –для обращения к элементу переданного массива [BX] базовая;;адресация
mov si,2; Подготовка делителя =2
mov di,0; Нуль в счетчик четных элементов
cmp CX, 0; проверка, не равен ли CX нулю
jz SHET_Exit; если нуль, то на выход
L1:
mov ax,[bx]; загрузка элемента массива а регистр AX косвенная адрес-я
cwd; подготовка к делению(расширение до двойного слова DX:AX
idiv si; деление со знаком на 2 для получения признака четности
cmp dx,0; сравнение остатка с нулем
jnz next; если не нуль, перейти к следующему элементу
add di,1; иначе увеличить счетчик четных элементов на 1
next:
add bx, 2; подготовка в регистре BX адреса следующего элемента
loop L1; Управление циклом по CX: cx=cx-1; cx<>0 на метку L1
SHET_Exit:
mov ax,di; пересылка счетчика DI в регистр AX
ret;
SCHET ENDP; Конец процедуры SCHET
; Главная программа
begin: mov AX, a_data; инициализация регистра
mov DS, AX; сегмента данных DS
cls; очистка экрана
call about; вызов проц. about вывод информации о проекте
; Ввод значения N
message mes1
call vvod1; вызов проц. vvod1 для ввода кол-ва элементов массива X
mov n,ax
; Ввод значения M
message mes2
call vvod1; вызов проц. vvod1 для ввода кол-ва элементов массива Y
mov m,ax
message mesa
lea bx,X
mov cx,n
call vvod_mas; вызов процедуры vvod_mas для ввода массива X
message mesb
lea bx,Y
mov cx,m
call vvod_mas; вызов процедуры vvod_mas для ввода массива Y
; Нахождение числа четных чисел в массиве X
lea BX, X;заносим в BX начало массива X
mov CX, n;в СХ заносим число элементов массива X
call SCHET;вызов процедуры SCHET для подсчета четных чисел в массиве X
mov kolX, ax; пересылка в ячейку kolX
; Нахождение числа четных чисел в массиве Y
lea BX, Y;заносим в BX начало массива Y
mov CX, m;в СХ заносим число элементов массива Y
call SCHET;вызов процедуры SCHET для подсчета четных чисел в массиве Y
mov kolY,ax; из АХ -> в ячейку kolB
cls; Макрос очистки экрана
call about;вызов проц. вывода информации о проекте
message mes3
lea bx, X
mov cx,n
call print_mas;вызов процедуры print_mas для вывода массива X
; Вывод количества четных чисел массива X макрокомандой print_number
message mes5
mov ax, kolX
print_number
;
message mes4
lea bx,Y
mov cx,m
call print_mas;вызов процедуры print_mas для вывода массива Y
; Вывод количества четных чисел массива Y макрокомандой print_number
message mes5
mov ax, kolY
print_number
;
inkey;пауза до нажатия клавиши
mov AX,4C00h;выход
int 21h;из программы
a_code ends; конец сегмента кода
end begin