Создан заказ №1769700
23 февраля 2017
КОНТРОЛЬНАЯ РАБОТА №2 Вариант 5 Написать программу с использованием языка Turbo Assembler
Как заказчик описал требования к работе:
Контрольная работа №2 стр 173, вариант 5. Выполнить все рекомендации.
Фрагмент выполненной работы:
КОНТРОЛЬНАЯ РАБОТА №2
Вариант 5
Написать программу с использованием языка Turbo Assembler, в которой пользователь вводит числа, производит с ними какие-либо арифметические или логические операции (в зависимости от варианта) и выводит результат на экран. Программа высылается в составе исполняемого файла и исходных текстов. Каждая строка программы должна сопровождаться подробными комментариями.
Задание
Пользователь вводит два числа А и B в десятичном виде через процедуру, осуществляя передачу результата ввода через общую область памяти. (работа была выполнена специалистами author24.ru) Программа должна:
Посчитать С=(А+В)/4. Сбросить пятый бит числа С, если он установлен. Расчет должен быть выполнен с использованием макроопределения.
Вывести на экран число С и все промежуточные числа в двоичном виде, с использованием процедуры, в которую осуществляется передача параметров через общую область памяти.
Решение:
Разработаем программу для решения задачи которая будет состоять из одного макроса для вычисления выражения, главной процедуры и двух подпрограмм (процедур) – ввода числа в десятичном виде и вывода числа на экран в двоичном виде, которые для достижения передачи параметров через общую область памяти вынесем в отдельный модуль.
Заданием не определяется разрядность чисел или их диапазон, поэтому примем, что все числа A, B, C – целые однобайтовые числа со знаком.
Разработаем блок-схемы для выделенных процедур.
Блок-схема основной процедуры и процедуры ввода числа
Блок-схема процедуры вывода числа в двоичном виде
Исходный код главного модуля программы – файл «CON2.ASM»
;-------------------------------------------------------------------
; Макрос вычисления выражения С=(А+B)/4
; и сброс 5 бита результата С
;-------------------------------------------------------------------
Calc_C macro A, B, C
MOV AL, A; AL <- A
ADD AL, B; AL <- A+B
MOV Sh, AL; запись суммы в общую память
CALL Write; вывод ее на экран
MOV CL, 4; CL <- 4 - делитель
CBW; AX <- AL - расширяем до слова
IDIV CL; AL <- AX / CL = (A+B)/4
MOV Sh, AL; запись результата деления в общую память
CALL Write; вывод его на экран
AND AL, 0DFh; сброс пятого бита, если он был установлен
MOV C, AL; С <- результат
MOV Sh, AL; запись результата в общую память
CALL Write; вывод результата на экран
endm
assume cs: code, ds: data, ss:stk
code segment ; сегмент кода
Extrn Read: Near; внешние процедуры
Extrn Write: Near
Start:; точка входа в программу
MOV AX, data; настройка указателя на
MOV DS, AX; на сегмент данных
MOV DX, offset ms1; DX <- адрес приглашения ввода А
MOV AH, 09; вывод сообщения на экран
INT 21h; через сервис DOS
CALL Read; ввод A через процедуру
MOV AL, Sh; переписываем введенное число
MOV A, AL; в ячейку A
MOV DX, offset ms2; DX <- адрес приглашения ввода B
MOV AH, 09; вывод сообщения на экран
INT 21h; через сервис DOS
CALL Read; ввод B через процедуру
MOV AL, Sh; переписываем введенное число
MOV B, AL; в ячейку B
MOV DX, offset ms3; DX <- адрес сообщения
MOV AH, 09; вывод сообщения на экран
INT 21h; через сервис DOS
Calc_C A, B, C; расчет выражения через макрос
MOV AH, 08; ожидание нажатия на клавишу
INT 21h
MOV AX, 4C00h; выход в DOS с кодом 0
INT 21h
ends
data segment common; данные программы, common указывает что
; сегменты data
; разных модулей будет перекрываться
; и использовать общую память
Sh DB ?; общая память для программы и процедур
A DB ?; переменные
B DB ?
C DB ?
ms1 DB 'Введите A: $'
ms2 DB 13, 10, 'Введите B: $'
ms3 DB 13, 10, 'Промежуточные значения и результат: ', 13, 10,'$'
ends
stk segment stack; начало сегмента стека
db 256 dup (?); резервируем 256 байт под стек
ends; конец сегмента стека
end Start
Исходный код модуля процедур – файл «PR.ASM»
assume cs: code, ds: data
code segment
Public Read; общедоступные имена
Public Write
;-------------------------------------------------------------------
; Процедура ввода однобайтного числа со знаком
; Результат передается в переменной общей памяти Sh
;-------------------------------------------------------------------
Read proc Near
PUSH AX; сохраняем значения
PUSH DX; используемых регистров
PUSH SI; в стеке
PUSH DS
CALL Rtp
Rtp:POP AX; AX <- адрес смещения подпрограммы в коде
MOV DX, CS; настройка указателя данных
MOV DS, DX; на данные процедуры
MOV DX, Ofs;
ADD DX, AX; DX <- адрес буфера
MOV AH, 10; функция ввода строки символов
INT 21h; ввод строки с клавиатуры
MOV SI, DX
ADD SI, 2; SI <- адрес первого символа строки
XOR AL, AL; AL <- 0
MOV DL, [SI]; DL <- код первого символа
POP DS; восстанавливаем сегмент данных
MOV Sh, 1; Sh <- 1 - знак '+'
CMP DL, '-'; проверка на '-'
JNE R0; переход к R0, если не равно
MOV Sh, -1; Sh <- -1 - ...Посмотреть предложения по расчету стоимости
Заказчик
заплатил
заплатил
200 ₽
Заказчик не использовал рассрочку
Гарантия сервиса
Автор24
Автор24
20 дней
Заказчик принял работу без использования гарантии
24 февраля 2017
Заказ завершен, заказчик получил финальный файл с работой
5
КОНТРОЛЬНАЯ РАБОТА №2
Вариант 5
Написать программу с использованием языка Turbo Assembler.docx
2018-12-16 16:00
Последний отзыв студента о бирже Автор24
Общая оценка
5
Положительно
Все по заданию, быстро и качественно, учел мои личные замечания к заданию(редактировал).
Рекомендую!