Учебное пособие 903
.pdf
|
|
|
4.1. Текст программы |
|
|
|
|
(файл prim3.asm) |
|
%nolist |
|
|
|
|
include mac.lib |
|
|
||
%list |
|
|
|
|
a_datasegment |
para |
|
||
;отмечаемначалосегментаданных |
||||
; |
|
|
|
|
n |
dw |
? |
|
|
m |
dw |
? |
|
|
X |
DW |
10 dup (?) |
;описание массива A из |
|
10 элементов |
|
|
||
Y |
DW |
8dup(?) |
;описание массива B из 8 |
|
элементов |
|
|
|
|
kolX |
dw |
? |
; Для числа четных элементов |
|
массива X |
|
|
|
|
kolY |
dw |
? |
; Для числа четных элементов |
|
массива Y |
|
|
|
;Сообщения программы
mesa |
db |
10, 13, |
|
' Ввод массива |
X$' |
|
mesb |
db |
10, 13, ' |
Ввод массива |
Y $' |
||
mes1 |
db |
10, 13,' Введите число элементов |
||||
массиваX=$'; |
|
|
|
|
||
mes2 |
db |
10, 13, 'Введите число элементов |
||||
массиваY=$'; |
|
|
|
|
||
mesch db |
10,13,' |
? |
$' |
|
|
|
mes3 |
db |
10,13,10,13, ' |
МассивX : $' |
|||
mes4 |
db |
10,13, ' МассивY: $' |
|
|||
mes5 |
db |
10,13,' |
четных элементов:$' |
|||
informdb |
10,13,' Фамилия имя вар-т группа $' ; |
|||||
!Замените на свое |
|
|
|
|
||
task |
db |
10,13,' |
Условие задачи |
$' |
||
a_data |
ends |
|
|
|
|
;отмечаем начало сегмента стека
a_stack |
segment |
para stack |
db |
128 dup(?) |
|
a_stack |
ends |
|
; отмечаем начало сегмента кодов a_code segment para assumeds:a_data, cs:a_code, ss:a_stack
19
;Тексты процедур
;Вывод информации ОБ авторе и задании ....
about proc near message inform
message task crlf
ret about endp
; Процедура Вывод целого числа со знаком из регистра AX
printproc near print_number ret
print endp
;Ввод с консоли целого числа со знаком в регистр
AX
;При вводе ошибочного символа повторный ввод vvod1proc near
er: message |
mesch |
|
key_$2bin |
; При ошибке ввода флаг CF |
|
устанавливается в 1 |
||
jncvozvrat |
; |
Если флаг CF=1, то переход на |
повторный ввод |
|
|
jmper |
|
|
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 |
;параметры
20
;bxадрес массива
;cx-количество элементов
mov si,0 cikl2:
mov ax,[bx]+[si] call print
add si,2
loop cikl2 ret
print_mas endp
;Процедура подсчета четных элементов массива
Vech PROC NEAR
;передача параметров через регистры
;bxсмещение массива
;cxчисло элементов в массиве
;axрезультат вычисления( число четных элементов)
|
mov |
si,2 |
|
; Подготовка делителя =2 |
mov |
di,0 |
; Нуль в счетчик четных элементов |
||
|
cmp |
CX, 0 |
|
; проверка, не равен ли CX |
нулю |
|
|
|
|
|
jzVecHExit |
; |
если нуль, то на выход |
|
L1: |
|
|
|
|
|
mov |
ax,[bx] ; загрузка элемента массива а |
||
регистр AX косвенная адрес-я |
||||
cwd |
; подготовка к делению( расширение до двойного |
|||
слова DX:AX |
|
|
||
|
idiv |
si ; деление со знаком на 2 для |
||
получения признака четности |
||||
|
cmp |
dx,0 |
|
; сравнение остатка с нулем |
|
jnz |
next |
; если не нуль, перейти к |
|
следующему элементу |
|
|||
|
add |
di,1 |
; иначе увеличить счетчик |
четных элементов на 1 next:
addbx, 2 ; подготовка в регистре BX адреса следующего элемента
21
loop L1 |
; Управление циклом по CX : cx=cx-1; cx<>0 |
|||
на метку |
L1 |
|
|
|
VecHExit: |
|
|
|
|
mov |
ax,di ; пересылка счетчика DI в регистр AX |
|||
|
ret |
; |
|
|
VecH ENDP |
|
; Конец процедуры |
VecH |
|
; |
Главная программа |
|
|
|
begin: mov AX, a_data |
;инициализация регистра |
|||
|
mov DS, AX |
; сегмента данных |
DS |
cls call about
message mes1 call vvod1
mov n,ax
message |
mes2 |
|
||
call |
vvod1 |
|
|
|
|
mov |
m,ax |
|
|
message |
mesa |
|
||
lea |
bx,a |
|
|
|
mov |
cx,n |
|
|
|
|
callvvod_mas |
|||
message |
mesb |
|
||
lea |
bx,b |
|
|
|
|
mov |
cx,m |
|
|
call |
vvod_mas |
|
|
|
; |
|
|
|
|
|
leaBX, |
A |
;заносим в BX начало массива А |
|
|
mov CX, n |
;в СХ заносим количество |
||
итераций |
|
|
|
|
|
callvech |
;вызов процедуры |
||
|
movkolA,ax |
; пересылка в ячейку kolA |
||
; |
|
|
|
|
|
lea |
BX, b ;заносим в BX начало массива B |
||
|
mov CX, m |
;в СХ заносим количество |
||
итераций |
|
|
|
22
callVecH ;вызов процедуры VecH movkolB,ax ; пересылка вячейкуkolB
call about message mes3 lea bx,a
mov cx,n callprint_mas message mes5
mov ax,kolA print_number
; |
|
|
|
|
message |
mes4 |
|
lea |
bx,b |
|
|
mov |
cx,m |
|
|
|
callprint_mas |
|
|
message |
mes5 |
|
|
mov |
ax, kolB |
|
|
|
print_number |
|
|
; |
|
|
|
inkey |
;паузадонажатияклавиши |
||
|
movAX,4C00h |
;выход |
|
|
int 21h |
;изпрограммы |
|
a_code |
ends |
|
|
end |
begin |
|
|
23
5. ЗАДАНИЯ КУРСОВОЙ РАБОТЫ
5.1. Общая часть
Заданы два массива X[10] и Y[12], состоящих из целых чисел со знаком в формате слова. Выполнить над массивами действия согласно индивидуальному заданию.
Программа должна иметь модульную структуру. Выделить процедуры: ввода массива с консоли, вывода массива, вывода информации об авторе и условии решенной задачи. Выполнить вывод массивов на экран до обработки и после обработки согласно варианту.
5.2.Индивидуальные варианты заданий
1.Составить процедуру, которая вычисляет сумму неотрицательных элементов в массиве. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений (число неотрицательных элементов).
2.Составить процедуру вычисления числа элементов в массиве, по абсолютной величине меньших 100. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
3.Составить процедуру вычисления суммы элементов массива, значения которых кратны 3 или 7. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений).
24
4.Составить процедуру, которая уменьшает в два раза элементы с положительными значениями и заменяет нулевые элементы на -10. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве.
5.Составить процедуру нахождения наибольшего по абсолютной величине элемента массива. Передача параметров через регистры:
ВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
6.Составить процедуру, которая меняет знаки на обратный у элементов, больших по абсолютной величине 100. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве.
7.Составить процедуру подсчета количества элементов, значения которых четные отрицательные числа. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
8.Составить процедуру, которая находит номер наибольшего элемента массива. Передача параметров через регистры
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – искомый номер элемента.
9.Составить процедуру, которая подсчитывает элементы, значения которых простые числа. Передача параметров через регистры:
вВХ – смещение массива;
25
вСХ – число элементов в массиве
вАХ – результат вычислений.
10.Составить процедуру вычисления суммы тех элементов в массиве, чьи значения кратны 7. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
11.Составить процедуру, которая вычисляет сумму неотрицательных нечетных чисел в массиве. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
12.Составить процедуру подсчета элементов в массиве, по абсолютной величине меньших 80. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений (число искомых элементов).
13.Составить процедуру подсчета элементов массива, значения которых заключены в пределах от -10 до 10. Передача параметров через регистры:
вВХ – смещение массива;
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений (число искомых элементов).
26
14.Составить процедуру подсчета числа элементов массива, значения которых являются степенью 2. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
15.Составить процедуру подсчета суммы элементов массива, значения которых положительны и не делятся на 3. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений (сумма элементов
массива).
16.Составить процедуру количества повторения значения первого элемента в массиве. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
17.Составить процедуру, которая находит наименьший элемент и делит на него все элементы. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве.
18.Составить процедуру, которая уменьшает вдвое отрицательные элементы массива. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве.
27
19.Составить процедуру поиска элемента массива, значение которого наибольшее по абсолютной величине. Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве;
вАХ – результат вычислений.
20.Составить процедуру, которая сортирует элементы в массиве по возрастанию методом «пузырька». Передача параметров через регистры:
вВХ – смещение массива;
вСХ – число элементов в массиве.
5.3.Контрольные вопросы
1.Что такое модульное программирование? Дайте определение понятию модуль.
2.Какие есть разновидности модулей? Как они функционируют?
3.Из чего состоит структурный подход к программированию?
4.Какие средства используются во избежание дублирования фрагментов программного кода?
5.Дайте определение понятию подпрограмма. Зачем она используется?
6.Каким образом оформляется синтаксис процедур?
7.Как осуществляется вызов процедур? Какие существуют виды обращения к процедурам?
28