Информатика КОНТРОЛЬНАЯ РАБОТА № 2 РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ. контролная 2. Томский государственный университет
Скачать 115.21 Kb.
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра компьютерных систем в управлении и проектировании (КСУП) Контрольная работа № 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 нет конец |