Файл: Отчет контрольная работа 2 по дисциплине Информатика Выполнил студент специальности 2023 г.docx
Добавлен: 10.11.2023
Просмотров: 59
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство науки и высшего образования Российской ФедерацииФедеральное государственное бюджетное образовательное учреждениевысшего образованияТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)Кафедра компьютерных систем в управлении и проектировании (КСУП)ОТЧЕТКонтрольная работа № 2по дисциплине«Информатика»Выполнил студент:специальности:2023 г.КОНТРОЛЬНАЯ РАБОТА № 2 РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕВариант 11Цель работыЦелью выполнения данной работы является комплексная проверка навыков программирования на языке ассемблера. Результаты работы представляются в виде совокупности следующих документов:
Процедура заполнения массива числами из строки FillA:Процедура перевода части строки в число GetN:Процедура вывода массива PrintA:Процедура вывода числа в 8-ой системе счисления Print:Листингфайла MAIN.ASM [ORG 100h]MAIN: ; главная процедура; вывод сообщения на ввод NMOV DX, MS0 MOV AH, 09 INT 21h; ввод числа в буферMOV CX, 4 MOV DX, S MOV BX, 1 MOV AH, 3FhINT 21h; получение численного значенияMOV SI, SCALL GetN; проверка введенного числа NAND AX, AXJZ MAIN ; если введено количество чисел 0 - повтор вводаCMP AX, 25JA MAIN ; если кол-во чисел N > 25 - повтор ввода PUSH AX ; поместить количество чисел в стек; вывод сообщения для ввода строки чиселMOV DX, MS1 MOV AH, 09 INT 21h; ввод строки чисел в буферMOV DX, S MOV CX, 148 MOV BX, 1 MOV AH, 3Fh INT 21h POP CX ; CX <- кол-во чисел; выборка из буфера чисел в массивCLD ; автоинкремент при работе с цепочечными командами MOV SI, S ; загрузить в SI адрес начала строки в буфереMOV DI, A ; загрузить в DI адрес первого элемента массиваCALL FillA ; вызов подпрограммы заполнения массива; вывод массиваMOV DX, MS2 ; вывод сообщенияMOV AH, 09INT 21hMOV SI, A ; загрузить в SI адрес массиваCALL PrintA ; вызов подпрограммы вывода массива; вывод сообщения - Конец работыMOV DX, MS3MOV AH, 09INT 21h; ждать вводаXOR AX, AX INT 16h; выход в DOSINT 20h ; подключение модуля процедур%INCLUDE "PROC.ASM"; сегмент данныхSECTION DATA; выводимые сообщения MS0 DB 13, 10, 'Введите число N = [1..25]: $'MS1 DB 13, 10, 10, 'Введите последовательность 3-значных положит. чисел разделенных пробелом:', 13, 10, '$'MS2 DB 13, 10, 10, 'Эти же числа, записанные в обратном порядке и в 8-ной с.с.:', 13, 10, '$'MS3 DB 13, 10, 10, 'Нажмите клавишу для выхода...$'
S RESB 150 ; буфер под строкуA RESW 25 ; массивЛистинг файла PROC.ASM; Процедура заполнения массива числами; Вход: AX - число; SI - адрес начала буфера; DI - адрес массива; CX - кол-во чиселFillA:PUSH CX ; помещаем в стек значения используемых регистров_fa:CALL GetN ; преобразуем строку в числоSTOSW ; сохраняем его в массив и переходим к следующему элементуINC SI ; пропускаем разделительLOOP _fa ; повторяем пока преобр-ны не все числа из строкиPOP CX ; восстанавливаем CX из стекаRET; Процедура вывода числа в 8-ой системе сч.; Вход: AX - числоPrint:PUSH AX ; помещаем в стек значения используемых регистровPUSH BX PUSH CX PUSH DX MOV BX, AX ; BX <- числоMOV AH, 02 ; AH <- функция вывода символа на экранMOV CX, 0503H ; CH <- кол-во сдвигов, CL - сдвиг на 3 разрядаROL BX, 1 ; сдвиг BX на 1 разрядMOV DL, '0' ; DL <- символ, соответствующий старшейADC DL, 0 ; цифреINT 21h ; вывод цифры на экран_p: ROL BX, CL ; сдвиг BX на 3 разрядаMOV DL, BL ; AX <- Выход от деленияAND DL, 7 ; DL - цифраADD DL, 48 ; DL <- ASCII код цифрыINT 21h ; вывод цифры на экранDEC CH ; уменьшаем счетчик сдвиговJNZ _p ; повторяем пока CH > 0POP DX ; извлекаем регистры из стекаPOP CX POP BX POP AX RET ; возврат из подпрограммы;Процедура вывода массива чисел в обратном порядке; Вход: SI - адрес массива; CX - кол-во чиселPrintA:PUSH CX ; помещаем в стек значения используемых регистровPUSH SI ADD SI, CX ; SI = SI + CX ADD SI, CX ; адрес за последним числом_pa: SUB SI, 2 ; SI <- SI - 2 MOV AX, [SI] ; AX <- текущий эл. массива CALL Print ; вызов п/п вывода числа на экранMOV DL, " " ; загрузка в DL кода пробелаMOV AH, 02INT 21h ; вывод пробелаLOOP _pa ; цикл вывода массиваPOP SI ; восстанавливаем значения регистров из стекаPOP CXRET; Процедура перевода части строки в число; Вход: в SI начальный адрес в буфере ; Выход: AX - числоGetN:PUSH DX ; помещаем в стек значения используемых регистровPUSH BX XOR AX, AX ; AX <- 0 MOV BX, AX ; BX <- 0_gn0: MOV BL, [SI] ; BL <- код символа из буфераSUB BL, 48 ; JC _gn1 ; если код меньше "0" конец переводаCMP BL, 9 ; проверка на цифруJA _gn1 ; если не цифра - конец перевода
MOV DX, 10MUL DX ; умножаем AX на 10ADD AX, BX ; увеличиваем число на текущую цифруINC SI ; переход к очередному символу буфераJMP _gn0 ; повтор тела цикла_gn1:POP BX ; восстанавливаем значения регистров из стекаPOP DX RET ; возврат из подпрограммыРезультаты выполненияВ ходе выполнения контрольной работы была разработана программа согласно варианту задания. Скриншоты окна выполнения программы доказывают правильность и полноту решения задачи и достижения выносимых на контрольную работу целей.
-
титульный лист; -
дерево подпрограмм; -
файловая структура программы; -
блок-схемы алгоритмов процедур; -
исходный файл (файлы) программы; -
загрузочный модуль программы.
Процедура заполнения массива числами из строки FillA:Процедура перевода части строки в число GetN:Процедура вывода массива PrintA:Процедура вывода числа в 8-ой системе счисления Print:Листингфайла MAIN.ASM [ORG 100h]MAIN: ; главная процедура; вывод сообщения на ввод NMOV DX, MS0 MOV AH, 09 INT 21h; ввод числа в буферMOV CX, 4 MOV DX, S MOV BX, 1 MOV AH, 3FhINT 21h; получение численного значенияMOV SI, SCALL GetN; проверка введенного числа NAND AX, AXJZ MAIN ; если введено количество чисел 0 - повтор вводаCMP AX, 25JA MAIN ; если кол-во чисел N > 25 - повтор ввода PUSH AX ; поместить количество чисел в стек; вывод сообщения для ввода строки чиселMOV DX, MS1 MOV AH, 09 INT 21h; ввод строки чисел в буферMOV DX, S MOV CX, 148 MOV BX, 1 MOV AH, 3Fh INT 21h POP CX ; CX <- кол-во чисел; выборка из буфера чисел в массивCLD ; автоинкремент при работе с цепочечными командами MOV SI, S ; загрузить в SI адрес начала строки в буфереMOV DI, A ; загрузить в DI адрес первого элемента массиваCALL FillA ; вызов подпрограммы заполнения массива; вывод массиваMOV DX, MS2 ; вывод сообщенияMOV AH, 09INT 21hMOV SI, A ; загрузить в SI адрес массиваCALL PrintA ; вызов подпрограммы вывода массива; вывод сообщения - Конец работыMOV DX, MS3MOV AH, 09INT 21h; ждать вводаXOR AX, AX INT 16h; выход в DOSINT 20h ; подключение модуля процедур%INCLUDE "PROC.ASM"; сегмент данныхSECTION DATA; выводимые сообщения MS0 DB 13, 10, 'Введите число N = [1..25]: $'MS1 DB 13, 10, 10, 'Введите последовательность 3-значных положит. чисел разделенных пробелом:', 13, 10, '$'MS2 DB 13, 10, 10, 'Эти же числа, записанные в обратном порядке и в 8-ной с.с.:', 13, 10, '$'MS3 DB 13, 10, 10, 'Нажмите клавишу для выхода...$'
S RESB 150 ; буфер под строкуA RESW 25 ; массивЛистинг файла PROC.ASM; Процедура заполнения массива числами; Вход: AX - число; SI - адрес начала буфера; DI - адрес массива; CX - кол-во чиселFillA:PUSH CX ; помещаем в стек значения используемых регистров_fa:CALL GetN ; преобразуем строку в числоSTOSW ; сохраняем его в массив и переходим к следующему элементуINC SI ; пропускаем разделительLOOP _fa ; повторяем пока преобр-ны не все числа из строкиPOP CX ; восстанавливаем CX из стекаRET; Процедура вывода числа в 8-ой системе сч.; Вход: AX - числоPrint:PUSH AX ; помещаем в стек значения используемых регистровPUSH BX PUSH CX PUSH DX MOV BX, AX ; BX <- числоMOV AH, 02 ; AH <- функция вывода символа на экранMOV CX, 0503H ; CH <- кол-во сдвигов, CL - сдвиг на 3 разрядаROL BX, 1 ; сдвиг BX на 1 разрядMOV DL, '0' ; DL <- символ, соответствующий старшейADC DL, 0 ; цифреINT 21h ; вывод цифры на экран_p: ROL BX, CL ; сдвиг BX на 3 разрядаMOV DL, BL ; AX <- Выход от деленияAND DL, 7 ; DL - цифраADD DL, 48 ; DL <- ASCII код цифрыINT 21h ; вывод цифры на экранDEC CH ; уменьшаем счетчик сдвиговJNZ _p ; повторяем пока CH > 0POP DX ; извлекаем регистры из стекаPOP CX POP BX POP AX RET ; возврат из подпрограммы;Процедура вывода массива чисел в обратном порядке; Вход: SI - адрес массива; CX - кол-во чиселPrintA:PUSH CX ; помещаем в стек значения используемых регистровPUSH SI ADD SI, CX ; SI = SI + CX ADD SI, CX ; адрес за последним числом_pa: SUB SI, 2 ; SI <- SI - 2 MOV AX, [SI] ; AX <- текущий эл. массива CALL Print ; вызов п/п вывода числа на экранMOV DL, " " ; загрузка в DL кода пробелаMOV AH, 02INT 21h ; вывод пробелаLOOP _pa ; цикл вывода массиваPOP SI ; восстанавливаем значения регистров из стекаPOP CXRET; Процедура перевода части строки в число; Вход: в SI начальный адрес в буфере ; Выход: AX - числоGetN:PUSH DX ; помещаем в стек значения используемых регистровPUSH BX XOR AX, AX ; AX <- 0 MOV BX, AX ; BX <- 0_gn0: MOV BL, [SI] ; BL <- код символа из буфераSUB BL, 48 ; JC _gn1 ; если код меньше "0" конец переводаCMP BL, 9 ; проверка на цифруJA _gn1 ; если не цифра - конец перевода
MOV DX, 10MUL DX ; умножаем AX на 10ADD AX, BX ; увеличиваем число на текущую цифруINC SI ; переход к очередному символу буфераJMP _gn0 ; повтор тела цикла_gn1:POP BX ; восстанавливаем значения регистров из стекаPOP DX RET ; возврат из подпрограммыРезультаты выполненияВ ходе выполнения контрольной работы была разработана программа согласно варианту задания. Скриншоты окна выполнения программы доказывают правильность и полноту решения задачи и достижения выносимых на контрольную работу целей.