Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Задание к работе. Порядок выполнения. Варианты заданий 1-7 Вариант Система счисления Выполняемая операция над байтами ASCII числа Ввод с клавиатуры Вывод на экран





ВАРИАНТЫ 1-7 (табл. 4.3).

Таблица 4.3

Варианты заданий 1-7

Вариант Система счисления Выполняемая операция над байтами ASCII числа
Ввод с клавиатуры Вывод на экран
  восьмеричная 16-разрядный двоичный код, восьмеричная, десятичная Циклический сдвиг вправо на 1 байт
  восьмеричная 16-разрядный двоичный код, восьмеричная, шестнадцатеричная Циклический сдвиг влево на 1 байт
  десятичная 16-разрядный двоичный код, десятичная, восьмеричная Определить байт с наибольшим ASCII-кодом
  десятичная 16-разрядный двоичный код, десятичная, восьмеричная Определить байт с наименьшим ASCII-кодом
  десятичная 16-разрядный двоичный код, десятичная, шестнадцатеричная Произвести реверс байтов ASCII числа
  шестнадцатеричная 16-разрядный двоичный код, шестнадцатеричная, восьмеричная Расположить цифры числа по возрастанию
  шестнадцатеричная 16-разрядный двоичный код, шестнадцатеричная, десятичная Расположить цифры числа по убыванию

 

Последовательность действий для выполнения задания.

1. Вводится в буфер памяти знаковое ASCII- число в заданной системе счисления (в диапазоне эквивалентному представлению от –32768 до 32767) с последующим преобразованием его в 16-разрядный двоичный дополнительный код (внутреннее представление целочисленных данных).

2. Рассматривая исходное ASCII- число в буфере как некоторую последовательность байт, выполните над ними заданное преобразование (операцию). Результат операции (новую последовательность байт) вывести на экран.

3. Двоичный дополнительный код преобразуется в числовой ASCII -формат для различных оснований с последующим выводом на экран.

ВАРИАНТЫ 8-14 (табл. 4.4).

Ввести последовательно, по запросу программы, два числа в заданной системе счисления. Отдельной строкой вывести перечень выполняемых операций (операторов). Ввод пользователем оператора из предложенного списка инициирует программу на вывод результата для введённых чисел. Необходимо предоставить возможность пользователю в дальнейшем либо ввести другую операцию, либо следующую пару чисел с последующим выбором оператора.

Таблица 4.4

Варианты заданий 8-14

Вари-ант Система счисления для ввода чисел Выполняемые операторы и форма вывода результата
  восьмеричная + - * десятичная EQ True/false
  восьмеричная / + - шестнадцатеричная NE True/false
  десятичная - * / двоичная GE True/false
  десятичная * / + восьмеричная GT True/false
  десятичная - * / шестнадцатеричная GE True/false
  шестнадцатеричная + - * восьмеричная LT True/false
  шестнадцатеричная / + - десятичная LE True/false

 

Реализацию арифметических операторов выполнить на основе использования соответствующих арифметических команд (add, sub, imul, idiv, cwd), а логических операторов – команды cmp в сочетании с необходимыми командами условных переходов. Формат результата операции умножения при 16-раз-рядных входных сомножителях – 32 бита; внутренний формат делимого при
16-разрядных входных числах перед выполнением операции деления должен быть подвергнут расширению со знаком до 32 бит.

Соглашения (обязательные требования к разработке для всех 14 вариантов).

· Программа должна включать один основной и несколько вспомогательных модулей (см. п. 9.2.5);

· Диапазон вводимых знаковых чисел от –32768 до 32767, диапазон выводимых чисел такой же за исключением результата от выполнения операции умножения – увеличивается в два раза;

· Ввод числа осуществляется по запросу программы. Первым вводится символ знака " –" (если число отрицательное), затем число старшими разрядами вперёд. Ввод числа заканчивается нажатием клавиши < Enter >.

· " 8" -, " 10" - и " 16" -тeричные вводимые и выводимые числа представляются в естественном виде (т.е. значащими цифрами модуля с указанием знака для отрицательных чисел), а двоичные – 16-разрядным дополнительным кодом. Числа должны представляться соответствующими сообщениями на экране дисплея и заканчиваться (кроме десятичных) спецификаторами оснований.

· Ошибки ввода числа выявляются в процессе преобразования введённого числа в двоичный дополнительный код. К ним относятся:

– ошибка переполнения, когда введённое число не укладывается в диапазон знаковых чисел 16-разрядного компьютера или, например, когда произошло переполнение при выполнении операций сложения или вычитания;

– ввод недопустимого символа при изображении данного числа.

· Если в ходе преобразования была обнаружена ошибка, то выводится сообщение о характере этой ошибки.

· Если при выполнении арифметической операции произошло переполнение, то выводится соответствующее сообщение, а сам результат не выводится.

· В конце каждого цикла преобразования программа выдаёт запрос на продолжение работы или её завершение. Управление осуществляется функциональными клавишами.

Вопросы построения многомодульных программ

Модульный подход в программировании позволяет как упростить разработку задачи, так и произвести её модернизацию в процессе эксплуатации. Кроме того, модульный подход при разработке сложных программ создаёт идеальные условия для совместной работы коллектива авторов.

Каждая из программ лабораторной работы может быть структурно разделена на следующие функционально законченные блоки (модули):

· преобразование чисел с произвольным основанием (8-, 10-, 16-теричное), представленных в ASCII -формате, в двоичное число (в дальнейшем будем применять более короткое выражение " ASCII -число с основанием P ");

· преобразование двоичного числа в ASCII -число с P основанием;

· вычислительный модуль или модуль преобразования введённых данных по заданному алгоритму.

Каждый такой модуль оформляется в виде подпрограммы или процедуры, допускающей автономное ассемблирование (трансляцию в объектный код). В результате после трансляции будут получены объектные модули, которые объединяются в единую многомодульную программу с помощью " системообразующего" главного модуля, по ходу исполнения которого осуществляется передача управления на обработку информации от одного модуля к другому. Укажем на три основных синтаксических отличия в организации главного модуля. Только в главном модуле выполняется:

– инициализация сегмента стека директивой Stack;

– инициализация сегмента данных

Start: mov ax, @data

mov ds, ax

– каждый из модулей заканчивается директивой End, но только в главном модуле после этой директивы должна помещаться метка первой команды программы Start, с которой начинается её исполнение.

Исходный текст модуля должен иметь заголовок, в котором указывается:

– назначение и особенности функционирования модуля;

– описание входных данных;

– описание выходных данных.

Все имена, описанные в модуле, локализуются в нём. Это значит, что в разных модулях программы можно пользоваться одинаковыми именами и никаких конфликтов из-за этого не будет. В то же время некоторые идентификаторы переменных или процедур могут быть общими для некоторых модулей. Через эти общие идентификаторы и осуществляется интерфейс модулей в процессе исполнения программы.

Каждый модуль может оперировать двумя типами идентификаторов: внутренними и внешними, которые определены или инициализированы в другом модуле. Все внешние имена переменных и процедур вводятся директивой

Extrn < имя>: < тип>, …, < имя >: < тип>.

Перечислим возможные значения типов.

– Для переменных: byte, word, dword, … tbyte

– Для числовых констант: abs (определяются через директиву присваивания =)

– Для меток: near, far

– Для процедур: proc

Однако, все внешние переменные (процедуры) для данного модуля, должны быть определены в каком-то другом модуле в качестве общедоступных с помощью директивы

Public < имя>, , < имя>

В качестве примера рассмотрим структуру многомодульной программы, реализующей ввод с клавиатуры десятичного знакового числа с последующим выводом на экран соответствующего ему 16-разрядного двоичного кода и восстановленного из последнего десятичного числа. В начале приводятся вспомогательные модули, в тексте которых отражается лишь их функциональное назначение.

%Title " #dec_bin.asm"

; Модуль ввода 10-тичного ASCII- числа с последующим его преобразованием в 16- разряд-

; ный двоичный дополнительный код.

; Вход: Вводимое с клавиатуры по запросу программы ASCII-число с основанием " 10" в

; диапазоне от -32768 до 32767. Число вводится старшими разрядами вперёд с вводом знака " -

; " для отрицательных чисел. Ввод числа заканчивается спецификатором d.

; Выход: АХ- 16- разрядный двоичный дополнительный код,

; CF- ошибка ввода: выход из диапазона -32768...32767, либо ввод ошибочного символа.

Ideal

Model small

Dataseg

In_buf db 8,?, 8 dup(?); 5- разрядов +" знак " + " спецификатор " +" CR"

Codeseg

public ASCIIdec_bin

proc ASCIIdec_bin

……………..

ret

endp ASCIIdec_bin

End

%Title " Bin_#bin.asm"

; Модуль для преобразования дополнительного кода двоичного числа из рег. АХ в ASCII-

; строку двоичных символов.

; Вход: АХ- дополнительный код двоичного числа.

; Выход: АХ- дополнительный код двоичного числа,

; Буфер Bin_buf – 16 байтная ASCII- строка двоичных символов.

Ideal

Model small

Dataseg

public Bin_buf

Bin_buf DB 16 dup(?)

Codeseg

public Bin_ASCIIbin

proc Bin_ASCIIbin

……………..

endp Bin_ASCIIbin

End

%Title " Bin_#dec.asm"

; Модуль для преобразования дополнительного кода двоичного числа в ASCII- число с

; основанием " 10" и спецификатором d.

; Вход: АХ- дополнительный код двоичного числа.

; Выход: АХ- дополнительный код двоичного числа,

; 7-байтный буфер Dec_buf с восстановленным из рег. АХ десятичным числом (знак +

; 5цифр + спец-тор).

Ideal

Model small

Dataseg

public Dec_buf

Dec_buf db 7 dup(?); Буфер с пробелами

Codeseg

public Bin_ASCIIdec

proc Bin_ASCIIdec

……………….

endp Bin_ASCIIdec

End

Ниже приводится один из возможных вариантов главного модуля, использующего вышеприведённые вспомогательные модули. В программе используется простой экранный интерфейс, основанный на материале лабораторной работы № 2. Вы можете его усовершенствовать на основе использования функций BIOS. Кроме того, с целью облегчения понимания работы программы объединены в одну две различные ошибки ввода – переполнение и неправильно введённый разряд числа.

%Title" #10bin10.asm"

; Демонстрационная программа ввода и преобразования десятичных знаковых чисел

; (диапазон -32768...32767) в двоичные и их обратное восстановление. Особенности

; работы с программой регламентируются сообщениями, выводимыми программой на экран.

Ideal

Model small

Stack 256

%nomacs; Исключить из листинга макрорасширения

Macro out_str$ mes; Макрос вывода строки mes

……………..

Endm out_str$

Macro out_buf buf, number; Макрос вывода содержимого buf с числом байтов

; number

……………………..

Endm out_buf

Dataseg

extrn Bin_buf: byte: 16, Dec_buf: byte: 7

mes1 DB 13, 10, 'Введите знаковое десятичное число со специфика-'

DB 13, 10, 'тором d в диапазоне от -32768d до 32767d: $'

mes2 DB 13, 10, 'Ошибка ввода: переполнение или недопустимый символ $'

mes3 DB 13, 10, 'Преобразованное двоичное число в дополнительном коде: $'

mes4 DB 13, 10, 'Восстановленное из двоичного кода десятичное число: $'

mes5 DB 13, 10, 'Продолжаем работу < F1>, или выходим < F10>? $'

Codeseg

extrn ASCIIdec_bin: proc, Bin_ASCIIbin: proc, Bin_ASCIIdec: proc

Start: mov ax, @data; Установка в ds адреса

mov ds, ax; сегмента данных

call screen; Очистка экрана с установкой курсора

; в левый верхний угол (см. лаб. раб. №3)

Again: out_str$ mes1; Вывод сообщения mes1

call ASCIIdec_bin; Ввод десятичного числа с последующим преобразо-

; ванием его в двоичный дополнительный код

jc Abort; Допущена ошибка при вводе?

call Bin_ASCIIbin; Нет. Преобразовать двоичный код в ASCII- строку; из двоичных цифр

out_str$ mes3; Вывод сообщения mes3

out_buf Bin_buf, 16; Вывод на экран двоичного кода введённого числа

call Bin_ASCIIdec; Преобразовать двоичный код в ASCII- строку из; десятичных цифр

out_str$ mes4; Вывод сообщения mes4

out_buf Dec_buf, 7; Вывод на экран восстановленного из двоичного кода; десятичного числа

; Блок управления программой. Продолжение работы – < F1>, выход -< F10>.

…………………

Exit mov ax, 4C00h; Функция DOS 4Сh: выход из программы

int 21h; Вызов DOS. Останов

Abort: out_str$ mes2; Вывод сообщения mes2

jmp Again; Повторим ввод

END Start; Конец программы/точка входа

9.2.6. Ассемблирование и компоновка отдельных модулей в программу.
Создание библиотеки объектных модулей

Выше, в параграфе п. 9.2.5 нами была рассмотрена структура программных модулей, допускающих независимое ассемблирование с помощью команды tasm в том же формате, который первоначально был рассмотрен в первой лабораторной работе. Например, пускай имеется главный модуль main.asm и два вспомогательных x.asm и y.asm. Производим последовательное ассемблирование (порядок произвольный):

tasm main.asm

tasm x.asm

tasm y.asm

Если в вашем рабочем каталоге находятся только эти модули с расширеним .asm, то ассемблирование можно произвести одной командой tasm *.asm. Следующим шагом на пути получения единого исполняемого файла программы является сборка полученных объектных модулей с помощью команды компоновщика tlink. Если мы хотим, чтобы имя исполняемого файла совпадало с именем главного модуля (типовой случай), то он должен быть первым в списке объектных модулей (разделяются пробелами или знаком плюс):

Tlink main.obj x.obj y.obj

Для определения другого имени программы, например, calculator – имя добавляется в конце после запятой:

Tlink main.obj x.obj y.obj, calculator

¨ ¨ ¨

Перейдём теперь к вопросу создания библиотеки объектных модулей. Если Вы в процессе разработки ассемблерных программ создали несколько хороших процедур, которые могут использоваться в других ваших программах, то данные процедуры (однородные по своему функциональному назначению) можно скомпоновать в ассемблерные модули, допускающие независимое ассемблирование. Полученный таким образом объектный модуль может быть с помощью утилиты tlib (Turbo Library) загружен в библиотеку объектных модулей (БОМ). БОМ – это дисковый файл с расширением.lib, содержащий объектные модули, прошедшие стадию ассемблирования и включающие процедуры, часто используемые при создании новых программ. Чтобы воспользоваться процедурой, входящей в состав БОМ, надо вызвать её из вашей программы командой Call, предварительно определив её в качестве внешней процедуры директивой Extrn. В процессе компоновки tlink самостоятельно просмотрит БОМ и подсоединит к программе объектный код того модуля, в котором содержится соответствующая процедура. Библиотекарь можно вызвать, набрав команду tlib в командной строке. Общая форма вызова следующая:

TLIB 4.00 Copyright (c) 1987, 1996 Borland International

Syntax: TLIB libname [/C] [/E] [/P] commands, listfile

Libname Имя создаваемой или существующей библиотеки (полный путь)

/C Устанавливает чувствительность к регистру в именах

/E Создаёт расширенный словарь библиотечных имён. Помещается в

конце файла библиотеки и служит для облегчения поиска компонов-

щиком нужной процедуры

/Psize Устанавливает размер библиотечной страницы

Commands Последовательность операторов (опций) для исполнения

+ Добавить имя модуля в библиотеку

– Удалить имя модуля из библиотеки

* Извлечь имя модуля без удаления

–+ или +– Заменить имя модуля в библиотеке

–* или *– Извлечь имя модуля и удалить

listfile Имя для файла листинга

Рассмотрим примеры работы с библиотекарем Turbo Library

· Создание библиотеки mylib.lib из двух модулей x.obj и y.obj:

Tlib/E mylib +x.obj +y.obj

· Создание библиотеки mylib.lib и получение листинга. Листинг – это алфавитный список модулей вместе с общими переменными (процедурами), которые в них объявлены:

Tlib/E mylib +x.obj +y.obj, mylib.lst

· Получение листинга mylib.lst существующей библиотеки mylib.lib:

Tlib mylib, mylib.lst

· Замена модуля x.obj на новую копию и удаление из библиотеки модуля y.obj: Tlib mylib –+x.obj –y.obj

В случае, если модули x.obj и y.obj и есть те самые вспомогательные модули программы, главный модуль которой является main.obj, то исполняемый файл с именем main можно создать командой (обратите внимание на три запятые после имени главного модуля):

Tlink main.obj,,, mylib.lib

В общем случае в команде формирования исполняемого файла указываются все необходимые объектные модули, которые не вошли в библиотеку. Если программа использует несколько библиотек, то они записываются через пробелы:

Tlink main.obj,,, mylib1.lib mylib2.lib

Контрольные вопросы

1. Изложите алгоритм преобразования ASCII-кода числа с произвольным основанием в двоичное число.

2. Изложите алгоритм преобразования двоичного числа в ASCII-строку числа с произвольным основанием.

4. В чём заключается концепция модульного программирования?

5. Укажите основные синтаксические различия в организации программных модулей, принадлежащих одной программе?

6. Как вы понимаете принцип локализации переменных в модуле и деление переменных модуля на внутренние и внешние.

7. Как экспортировать из модуля процедуры, числовые константы и переменные в другие модули?

8. Как импортировать в модуль процедуры, числовые константы и переменные из других модулей?

9. Напишите команду, создающую библиотеку mta.lib из объектных модулей a.obj, b.obj и c.obj.

10. Напишите команду создания исполнительного файла программы с главным модулем main.obj, вспомогательные модули которого находятся в библиотеке mylib.







Дата добавления: 2014-11-10; просмотров: 776. Нарушение авторских прав; Мы поможем в написании вашей работы!




Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Весы настольные циферблатные Весы настольные циферблатные РН-10Ц13 (рис.3.1) выпускаются с наибольшими пределами взвешивания 2...

Хронометражно-табличная методика определения суточного расхода энергии студента Цель: познакомиться с хронометражно-табличным методом опреде­ления суточного расхода энергии...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Роль органов чувств в ориентировке слепых Процесс ориентации протекает на основе совместной, интегративной деятельности сохранных анализаторов, каждый из которых при определенных объективных условиях может выступать как ведущий...

Лечебно-охранительный режим, его элементы и значение.   Терапевтическое воздействие на пациента подразумевает не только использование всех видов лечения, но и применение лечебно-охранительного режима – соблюдение условий поведения, способствующих выздоровлению...

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия