Информатика КОНТРОЛЬНАЯ РАБОТА № 2 РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ. контролная 2. Томский государственный университет
![]()
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра компьютерных систем в управлении и проектировании (КСУП) Контрольная работа № 2 по дисциплине «Информатика» Выполнил студент: специальности 2021 г. КОНТРОЛЬНАЯ РАБОТА № 2 РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ Вариант 9. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием . Программа выводит эти же числа на экран в порядке возрастания величины числа, причем в «девятеричной» системе счисления. Перед началом написания программы запишем: -e 500 c; в ячейку памяти 500 заносим число С, (ограничитель на 12 вводимых с клавиатуры символов, включая пробелы) пробелов, в ячейке памяти 501 будет находиться счетчик введенных с клавиатуры символов, поэтому первый введенный c клавиатуры символ будет находиться по адресу [502] -e 580 0d 0a 24; в ячейку памяти 580 заносим данные: начало новой строки, каретку в начло строки, конец строки. Внесем в ячейку памяти трехзначные числа используя функцию DOS 0Ah ![]() В ячейке памяти [502] находится символ ASCII, который необходимо преобразовать в шестнадцатеричное число (сотни) ![]() С помощью команды CALL 400 вызываем процедуру преобразования символ ASCII в сотни шестнадцатеричного числа. ![]() Команда RET возвращает из подпрограммы в основную программу ![]() С помощью команды CALL 420 вызываем процедуру преобразования символ ASCII в десятки шестнадцатеричного числа ![]() ![]() С помощью команды CALL 440 вызываем процедуру преобразования символ ASCII в еденицы шестнадцатеричного числа ![]() Заносим полученное трехзначное шестнадцатеричное число в ячейку памяти по адресу [550] ![]() Подпрограмма CALL 460 обнуляет регистры AX,BX,CX,DX с помощью команды XOR. ![]() Повторяем вышеперечисленные действия для двух других чисел. ![]() ![]() Все трехзначные шестнадцатеричные числа хранятся в ячейках памяти [550], [560], [570]. Перенесем их в регистры памяти AX, BX,CX, для дальнейшей операцией сравнения и ранжирования. ![]() Сравнение будем производить с помощью команды CMP. Для ранжирования будем использовать команду JB-переход если меньше и команду XCHG-обмен содержимым регистров. ![]() Теперь содержимое ячеек отсортировано [570]наименьшее, [560] , [550]наибольшее. ![]() Подпрограмма CALL 200 преобразует шестнадцатеричное число, находящееся в ячейке памяти [570] в девятеричное и выведем его на экран ![]() ![]() ![]() Подпрограмма CALL 230 выводит пробел на экран ![]() Повторим подпрограмму преобразования и вывода на экран для чисел находящихся в ячейках памяти [560] , [550] ![]() Завершим программу вектором прерывания INT 20. Протестируем программу ![]() Программа корректно преобразуем шестнадцатеричные числа в девятеричную систему счисления и выводит на их на экран в порядке возрастания. MAIN ![]() ![]() ![]() ![]() CALL 400 CALL 420 CALL 440 CALL 460 CALL 200 CALL 230 CALL 240 CALL 220 1. CALL 400 - преобразование первого символа ASCII (сотни в десятичном исчислении) в шестнадцатеричное число 2.CALL 420 - преобразование первого символа ASCII (десятки в десятичном исчислении) в шестнадцатеричное число 3.CALL 440 - преобразование первого символа ASCII (единицы в десятичном исчислении) в шестнадцатеричное число 4.CALL 460 - процедура обнуления регистров 5.CALL 200 - процедура перевода шестнадцатеричного числа в девятеричное число 6.CALL 240 - процедура определения символа необходимого вывести на экран 7.CALL 220 - процедура вывода символа на экран 8.CALL 230 - процедура вывода пробела на экран Б Начало подпрограммы лок-схема алгоритма преобразования символов ASCII в шестнадцатеричное число. извлекаем символ ASCII из ячейки памяти al - 30 регистров ax,bx преобразования символа ASCII в сотню шестнадцатеричного числа 64 в bl регистров ax,bx извлекаем символ ASCII из ячейки памяти ![]() al*bl регистров ax,bx . помещаем ax в dx преобразования символа ASCII в десятки шестнадцатеричного числа al - 30 регистров ax,bx 0А в bl регистров ax,bx извлекаем символ ASCII из ячейки памяти ![]() al*bl регистров ax,bx ax + dx→ax преобразования символа ASCII в единицы шестнадцатеричного числа al - 30 регистров ax,bx ax + dx→ax перемещаем содержимое регистра аx (трехзначное шестнадцатеричное число) в ячейку памяти конец подпрограммы Блок-схема алгоритма ранжирования чисел начало подпрограммы сравниваем ax д ![]() ![]() меняем местами содержимое регистров ax,bx сбрасываем флаг переноса CF регистров ax,bx ![]() сравниваем bx меняем местами содержимое регистров сx,bx ![]() ![]() сбрасываем флаг переноса CF регистров ax,bx нет ![]() сравниваем ax меняем местами содержимое регистров ax,bx ![]() ![]() сбрасываем флаг переноса CF регистров ax,bx ![]() помещаем данные в ячейку памяти регистров ax,bx конец подпрограммы Блок-схема алгоритма преобразования шестнадцатеричного числа в девятеричное счисление и его вывод на экран. начало подпрограммы cx←0 разделить число на 9 ![]() записать остаток в стек cx←cx+1 частное =0 ![]() взять цифру из стека ![]() вывод цифры cx←cx-1 сx=0 ![]() конец |