- •Введение
- •1. Краткие теоретические сведения по ассемблеру мп к1801вм1
- •1.1. Регистровая модель
- •1.2. Адресное пространство
- •1.3. Методы адресации
- •1.3.1. Методы прямой адресации
- •1.3.2. Методы косвенной адресации
- •1.3.3. Методы адресации, использующие в качестве рон r7
- •2. Алгоритмы сортировки
- •2.1. Оценка алгоритма сортировки
- •2.2. Классификация алгоритмов сортировки
- •2.3. Сортировка пузырьком
- •3. Определение четности чисел
- •3.1. Определение чисел кратных двум
- •3.2. Определение числа единиц в числе
- •4. Определение кратности любому числу
- •5. Определение модуля числа
- •6. Многословное умножение
- •Заключение
- •Приложения Приложение 1. Оформление отчета по курсовой работе
- •Результаты работы программы
- •Приложение 2. Список команд
- •Приложение 3. Эмулятор Ersatz-11
Заключение
Методическое указание направлено на внедрение в головы студентов дополнительных полезных мыслей по поводу написания курсовой работы.
Ни одна из предложенных программ не является догмой, однако все программы рабочие.
Оптимизация разработанного кода – отдельная большая и интересная глава в программировании.
Приложения Приложение 1. Оформление отчета по курсовой работе
Отчет по курсовой работе выполняется каждым студентом индивидуально в машинописном виде на листах формата А4 и включает в себя титульный лист, задание, необходимую для курсовой работы теоретическую часть, алгоритмы и листинги программ, разработанных в процессе выполнения курсовой работы, таблицы исследования результатов работы программы и список используемой литературы. Листы отчета скрепляются при помощи степлера или вкладываются в файл или папку. Также при сдаче курсовой работы студент сдает преподавателю электронные варианты отчета и программы.
В исключительных случаях отчеты выполняются в рукописном виде с сохранением остальных требований по оформлению отчетов.
Ниже представлен пример написания отчета по курсовой работе.
Задание: Из массива 15 чисел выделить числа, у которых средний байт кратен 3 и эти числа расположить в порядке возрастания. Для остальных чисел найти среднеарифметическое.
Исходный массив: с адреса 1000, в младшем адресе младшее слово, по 2 слова на число
Массив 1 – для чисел, у которых средний байт кратен 3: начиная с адреса 2000
Массив 2 – для чисел, у которых средний байт не кратен 3: начиная с адреса 3000
Используемые ячейки памяти:
776) указатель для исходного массива;
774) размер массива 1 (указывает на последний его элемент);
772) размер массива 2 (указывает на последний его элемент);
770) указатель для массива 1;
766) указатель для массива 2;
764) флаг изменений (используется при сортировке);
762) и 760) временное хранение данных при обмене (используется при сортировке);
756) здесь временно хранится указатель массива (используется при сортировке);
754) размер массива 2, делитель;
752) сумма (старшее слово);
750) сумма (младшее слово), остаток от деления;
746) частное (старшее слово);
744) частное (младшее слово);
742) средний байт, остаток от деления на проверку кратности.
Блок-схема алгоритма.
Блок-схема алгоритма сортировки массива 1 по возрастанию.
Блок-схема алгоритма вычисления среднего арифметического чисел массива 2.
Начало программы. Задание начальных значений |
||
3662) 012701 3664) 17 |
MOV #17, R1 |
обнуление массива 1 |
3666) 012700 3670) 2000 |
MOV #2000, R0 |
|
3672) 005010 |
CLR @R0 |
|
3674) 062700 3676) 2 |
ADD #2, R0 |
|
3700) 005301 |
DEC R1 |
|
3702) 001373 |
BNE 3672 |
|
3704) 012701 3706) 17 |
MOV #17, R1 |
обнуление массива 2 |
3710) 012700 3712) 3000 |
MOV #3000, R0 |
|
3714) 005010 |
CLR @R0 |
|
3716) 062700 3720) 2 |
ADD #2, R0 |
|
3722) 005301 |
DEC R1 |
|
3724) 001373 |
BNE 3714 |
|
3726) 005037 3730) 754 |
CLR @#754 |
обнуление результатов |
3732) 005037 3734) 752 |
CLR @#752 |
|
3736) 005037 3740) 750 |
CLR @#750 |
|
3742) 012737 3744) 1000 3746) 776 |
MOV #1000, @#776 |
указатели – на начало |
3750) 012737 3752) 2000 3754) 770 |
MOV #2000, @#770 |
|
3756) 012737 3760) 3000 3762) 766 |
MOV #3000, @#766 |
|
3764) 012737 3766) 1774 3770) 774 |
MOV #1774, @#774 |
массивы пусты, |
3772) 012737 3774) 2774 3776) 772 |
MOV #2774, @#772 |
элементов нет |
Разбиение исходного массива на массив 1 и массив 2 |
||
4000) 013705 4002) 776 |
MOV @#776, R5 |
скопировать младшее слово в R0 |
4004) 011500 |
MOV @R5, R0 |
|
4006) 006200 |
ASR R0 |
выделение среднего байта |
4010) 006200 |
ASR R0 |
путем сдвига вправо старшего байта |
4012) 006200 |
ASR R0 |
младшего слова числа |
4014) 006200 |
ASR R0 |
|
4016) 006200 |
ASR R0 |
|
4020) 006200 |
ASR R0 |
|
4022) 006200 |
ASR R0 |
|
4024) 006200 |
ASR R0 |
|
4026) 010037 4030) 742 |
MOV R0, @#742 |
переслать в ячейку памяти 742 |
4032) 023727 4034) 742 4036) 3 |
CMP @#742, #3 |
можно ли ещё вычитать? |
4040) 100404 |
BMI 4052 |
нет - проверить остаток, да - вычитаем |
4042) 162737 4044) 3 4046) 742 |
SUB #3, @#742 |
вычитаем |
4050) 000770 |
BR 4032 |
|
4052) 005737 4054) 742 |
TST @#742 |
проверяем остаток |
4056) 001406 |
BEQ 4074 |
0 – массив 1 |
4060) 000440 |
BR 4162 |
массив 2 |
4062) 023727 4064) 776 4066) 1071 |
CMP @#776, #1071 |
проверка на конец массива |
4070) 100743 |
BMI 4000 |
указатель не вышел за пределы |
4072) 000471 |
BR 4256 |
достигнут конец массива, перейти к сортировке |
4074) 013704 4076) 776 |
MOV @#776, R4 |
скопировать младшее слово |
4100) 013705 4102) 770 |
MOV @#770, R5 |
|
4104) 011415 |
MOV @R4, @R5 |
|
4106) 062737 4110) 2 4112) 776 |
ADD #2, @#776 |
перейти к старшему байту |
4114) 062737 4116) 2 4120) 770 |
ADD #2, @#770 |
|
4122) 013704 4124) 776 |
MOV @#776, R4 |
скопировать старший байт |
4126) 013705 4130) 770 |
MOV @#770, R5 |
|
4132) 111400 |
MOV B @R4, R0 |
расширение знака |
4134) 010015 |
MOV R0, @R5 |
|
4136) 062737 4140) 2 4142) 776 |
ADD #2, @#776 |
перейти к следующему числу |
4144) 062737 4146) 2 4150) 770 |
ADD #2, @#770 |
|
4152) 062737 4154) 4 4156) 774 |
ADD #4, @#774 |
увеличить размер массива 1 |
4160) 000740 |
BR 4062 |
вернуться к проверке на конец |
4162) 013704 4164) 776 |
MOV @#776, R4 |
скопировать младшее слово |
4166) 013705 4170) 766 |
MOV @#766, R5 |
|
4172) 011415 |
MOV @R4, @R5 |
|
4174) 062737 4176) 2 4200) 776 |
ADD #2, @#776 |
перейти к старшему байту |
4202) 062737 4204) 2 4206) 766 |
ADD #2, @#766 |
|
4210) 013704 4212) 776 |
MOV @#776, R4 |
скопировать старший байт |
4214) 013705 4216) 766 |
MOV @#766, R5 |
|
4220) 111400 |
MOV B @R4, R0 |
расширение знака |
4222) 010015 |
MOV R0, @R5 |
|
4224) 062737 4226) 2 4230) 776 |
ADD #2, @#776 |
|
4232) 062737 4234) 2 4236) 766 |
ADD #2, @#766 |
|
4240) 062737 4242) 4 4244) 772 |
ADD #4, @#772 |
увеличить размер массива 2 |
4246) 062737 4250) 1 4252) 754 |
ADD #1, @#754 |
увеличить размер массива 2 |
4254) 000702 |
BR 4062 |
вернуться к проверке на конец |
Сортировка массива 1 по возрастанию |
||
4256) 012737 4260) 2000 4262) 770 |
MOV #2000, @#770 |
установить указатель на 1-й элемент |
4264) 005037 4266) 764 |
CLR @#764 |
очистить флаг изменений |
4270) 023737 4272) 770 4274) 774 |
CMP @#770, @#774 |
проверка: последний элемент или нет |
4276) 100405 |
BMI 4312 |
не последний, продолжаем |
4300) 022737 4302) 1 4304) 764 |
CMP #1, @#764 |
если последний, менялся ли флаг? |
4306) 001763 |
BEQ 4256 |
если менялся, сортируем сначала |
4310) 000533 |
BR 4600 |
если нет, то сортировка завершена, переходим к массиву 2 |
4312) 013705 4314) 770 |
MOV @#770, R5 |
копируем текущее число в пару R1, R2 |
4316) 011502 |
MOV @R5, R2 |
|
4320) 062737 4322) 2 4324) 770 |
ADD #2, @#770 |
|
4326) 013705 4330) 770 |
MOV @#770, R5 |
|
4332) 011501 |
MOV @R5, R1 |
|
4334) 062737 4336) 2 4340) 770 |
ADD #2, @#770 |
и переходим к следующему |
4342) 013705 4344) 770 |
MOV @#770, R5 |
копируем следующее число в пару R3, R4 |
4346) 011504 |
MOV @R5, R4 |
|
4350) 062737 4352) 2 4354) 770 |
ADD #2, @#770 |
|
4356) 013705 4360) 770 |
MOV @#770, R5 |
|
4362) 011503 |
MOV @R5, R3 |
|
4364) 162737 4366) 2 4370) 770 |
SUB #2, @#770 |
возвращаем указатель |
4372) 020301 |
CMP R3, R1 |
сравниваем старшие слова |
4374) 100405 |
BMI 4410 |
следующее < текущего, меняем |
4376) 001401 |
BEQ 4402 |
если равны - сравнивать младшие слова |
4400) 000733 |
BR 4270 |
иначе менять не надо, идём дальше |
4402) 020402 |
CMP R4, R2 |
теперь сравниваем младшие слова |
4404) 100401 |
BMI 4410 |
если следующее < текущего, надо менять |
4406) 000730 |
BR 4270 |
в противном случае менять не надо |
4410) 162737 4412) 4 4414) 770 |
SUB #4, @#770 |
ставим указатель на текущее значение |
4416) 013737 4420) 770 4422) 756 |
MOV @#770, @#756 |
и сохраняем его |
4424) 013705 4426) 770 |
MOV @#770, R5 |
сохраняем младшее слово |
4430) 011537 4432) 762 |
MOV @R5, @#762 |
|
4434) 062737 4436) 2 4440) 770 |
ADD #2, @#770 |
переходим к старшему слову |
4442) 013705 4444) 770 |
MOV @#770, R5 |
сохраняем старшее слово |
4446) 011537 4450) 760 |
MOV @R5,@#760 |
|
4452) 062737 4454) 2 4456) 770 |
ADD #2, @#770 |
770) указывает на следующее слово |
4460) 013704 4462) 770 |
MOV @#770, R4 |
следующее число в текущее |
4464) 013705 4466) 756 |
MOV @#756, R5 |
|
4470) 011415 |
MOV @R4, @R5 |
|
4472) 062737 4474) 2 4476) 770 |
ADD #2, @#770 |
|
4500) 062737 4502) 2 4504) 756 |
ADD #2, @#756 |
|
4506) 013704 4510) 770 |
MOV @#770, R4 |
|
4512) 013705 4514) 756 |
MOV @#756, R5 |
|
4516) 011415 |
MOV @R4, @R5 |
|
4520) 162737 4522) 2 4524) 770 |
SUB #2, @#770 |
и возвращаем указатели |
4526) 162737 4530) 2 4532) 756 |
SUB #2, @#756 |
|
4534) 013705 4536) 770 |
MOV @#770, R5 |
копию текущего в следующее |
4540) 013715 4542) 762 |
MOV @#762, @R5 |
|
4544) 062737 4546) 2 4550) 770 |
ADD #2, @#770 |
|
4552) 013705 4554) 770 |
MOV @#770, R5 |
|
4556) 013715 4560) 760 |
MOV @#760, @R5 |
|
4562) 162737 4564) 2 4566) 770 |
SUB #2, @#770 |
и возвращаем указатель |
4570) 012737 4572) 1 4574) 764 |
MOV #1, @#764 |
ставим флаг изменений |
4576) 000634 |
BR 4270 |
и переходим к следующей паре |
Вычисление среднего арифметического чисел массива 2 |
||
4600) 012737 4602) 3000 4604) 766 |
MOV #3000, @#766 |
ставим указатель массива на начало |
4606) 023737 4610) 772 4612) 766 |
CMP @#772, @#766 |
проверка на конец |
4614) 100421 |
BMI 4660 |
указатель вышел за пределы, делим на размер массива |
4616) 013705 4620) 766 |
MOV @#766, R5 |
|
4622) 061537 4624) 750 |
ADD @R5, @#750 |
прибавить младшее слово |
4626) 005537 4630) 752 |
ADC @#752 |
учесть перенос в старший байт |
4632) 062737 4634) 2 4636) 766 |
ADD #2, @#766 |
|
4640) 013705 4642) 766 |
MOV @#766, R5 |
|
4644) 061537 4646) 752 |
ADD @R5, @#752 |
прибавить старшее слово |
4650) 062737 4652) 2 4654) 766 |
ADD #2, @#766 |
перейти к следующему числу |
4656) 000753 |
BR 4606 |
проверить на конец |
4660) 005037 4662) 746 |
CLR @#746 |
очистить память для частного |
4664) 005037 4666) 744 |
CLR @#744 |
|
4670) 005737 4672)754 |
TST @#754 |
|
4674) 001427 |
BEQ 4754 |
|
4676) 005737 4700) 752 |
TST @#752 |
смотрим старшее слово суммы |
4702) 001007 |
BNE 4722 |
не ноль, делим |
4704) 005737 4706) 750 |
TST @#750 |
смотрим младшее слово суммы |
4710) 100404 |
BMI 4722 |
есть старший бит – делим |
4712) 023737 4714) 754 4716) 750 |
CMP @#750, @#754 |
можно ли вычитать дальше? |
4720) 100415 |
BMI 4754 |
нет – конец, да – делим |
4722) 163737 4724) 754 4726) 750 |
SUB @#754, @#750 |
вычитаем |
4730) 005637 4732) 752 |
SBC @#752 |
корректируем старшее слово |
4734) 005237 4736) 744 |
INC @#744 |
увеличиваем счетчик – младшее слово частного |
4740) 005737 4742) 744 |
TST @#744 |
проверить младшее слово |
4744) 001354 |
BNE 4676 |
не ноль, делим |
4746) 005237 4750) 746 |
INC @#746 |
ноль- корректируем старшее слово частного |
4752) 000751 |
BR 4676 |
делим дальше |
4754) 000000 |
HALT |
конец |