Министерство образования Российской Федерации Хабаровский государственный технический университет
МИКРОПРОЦЕССОРНЫЕ УСТ...
95 downloads
241 Views
366KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования Российской Федерации Хабаровский государственный технический университет
МИКРОПРОЦЕССОРНЫЕ УСТРОЙСТВА СИСТЕМ УПРАВЛЕНИЯ Методические указания по выполнению лабораторных работ № 6–14 для студентов специальности 210100 «Управление и информатика в технических системах»
Хабаровск Издательство ХГТУ 2002
УДК 681.322 Микропроцессорные устройства систем управления: Методические указания по выполнению лабораторных работ № 6–14 для студентов специальности 210100 «Управление и информатика в технических системах» / Сост. В. Э. Иванов, А. В. Левенец. – Хабаровск: Изд-во Хабар. гос. техн. ун-та, 2000. – 31 с. Методические указания разработаны на кафедре «Автоматика и системотехника». Предназначены для ознакомления с системой команд микропроцессора К1810ВМ86 и получения навыков программирования на языке Ассемблера. Работы 7, 8, 11, 13, 14 составлены В. Э. Ивановым, работы 6, 9, 10, 12 – А. В. Левенцом. Печатается в соответствии с решениями кафедры «Автоматика и системотехника» и методического совета института информационных технологий.
© Издательство Хабаровского государственного технического университета, 2002 2
ЛАБОРАТОРНАЯ РАБОТА № 6 ТЕХНОЛОГИЯ ПОДГОТОВКИ И ВЫПОЛНЕНИЯ ПРОГРАММ НА МАКРОАССЕМБЛЕРЕ ASM-86 Цель работы: изучение последовательности работы при подготовке программ на макроассемблере, их отладке и выполнении в системе программирования TEDASM; изучение функций и последовательности работы с отладчиком программ AFD. Основные сведения Система программирования TEDASM предназнчена для написания и выполнения программ на языке Ассемблера. Основными функциями системы являются: • подготовка исходных файлов на макроассемблере. При создании нового исходного файла, его имя создается по формату name.asm; • трансляция исходного файла с получением загрузочного модуля (name.com); • выполнение программы. Вызов системы выполняется из директории TEDASM, расположенной на диске «С:» запуском на выполнение загрузочного модуля tedasm.com. После загрузки системы на экране появляется главное меню, содержащее перечень команд системы и приглашение (C). Основными командами системы являются: Assem Sourse – ассемблировать исходный файл; Edit Sourse – редактировать исходный файл; Get Sourse – считать исходный файл в буфер системы; Write Sourse – записать исходный файл в текущую директорию; Run Codefile – запустить программу в кодах на выполнение; Hexdump File – вывести на экран программу в HEX- и в ASCII-кодах; Kill File – удалить файл из текущей директории; List File – вывести на экран листинг программы; Symbol List – вывести на экран таблицу имен программы, их типов и значений; Xrefer List – вывести на экран список количественных параметров программы; Directory – вывести на экран содержание текущей директории; Asm Options – установить опции ассемблирования; 3
New Drive-Directory – сменить устройство и директорию; Value – перевести введенное числовое значение в десятичную, восьмеричную, двоичную, шестнадцатеричную системы счисления и ASCII-код; Quit – выйти из системы. Рекомендуется следующий порядок работы в системе TEDASM: 1. Смена диска. После загрузки TEDASM на экране появляется приглашение (С). Как правило, файлы пользователя размещаются на гибком диске А или B, поэтому необходимо воспользоваться командой смены диска и директории: (C) N New drive - B <Enter> New Directory - <Enter> 2. Загрузка или редактирование исходного файла. Если на диске B уже есть исходный файл, то необходимо: - загрузить исходный файл NAME.ASM: (B) G - вызвать редактор: (B) E - отредактировать файл; - выйти из редактора клавишей ESC; - записать скорректированный файл на диск B: (B) W Если же исходный файл необходимо создать, то выполняются следующие действия: - вызов редактора: (B) E - ввод текста с клавиатуры; - выход из редактора клавишей ESC; - запись созданного файла на диск B: (B) W 3. Установление опций ассемблирования. Вызов процедуры установки опций осуществляется с помощью команды (B) O После вызова на экране появляется меню для задания нужного набора опций: F1 - Screen (OFF) F2 - Printer (OFF) F3 - Symbols (OFF) F4 - Xrefer (OFF) F5 - Memory (ON) 4
F6 - ErrWait (ON) F7 - OBJ File (OFF) F8 - COM File (OFF) F9 - LST File (OFF) F10 - Unefd. (OFF) В исходном состоянии подключены опции памяти размещения исполняемого модуля программы (Memory) и контроля ошибок при трансляции (ErrWait). Нажатием функциональных клавиш можно изменить значение опций, в частности, клавишами F7, F8, F9 можно настроить систему на формирование и запись на диск объектного файла (OBJ), исполняемого файла (COM) и листинга программы (LST). 4. Ассемблирование. Процесс ассемблирования запускается командой: (C) A При наличии ошибок процесс ассемблирования приостанавливается на ошибочной строке (если опция ErrWait находится в состоянии ON). Нажатием клавиши ENTER можно продолжить трансляцию программы. В случае успешной трансляции в буферной памяти системы формируется исполняемый файл name.com (опция MEMORY в состоянии ON), который может быть запущен на выполнение в системе TEDASM. Если опция MEMORY в состоянии OFF, то исполняемый файл записывается на диск С и не может быть запущен на выполнение из среды TEDASM. 5. Выполнение. Программа запускается на выполнение командой: (C) R 6. Выход из системы TEDASM. Для выхода из системы необходимо ввести команду: (C) Q Система AFD предназначена для отладки программ, написанных на макроассемблере ASM-86. Для запуска системы необходимо войти в директорию TEDASM и, выбрав курсором исполняемый файл afd.com, нажать клавишу ENTER. После загрузки AFD на экране появится кадр, разделенный на несколько полей, имеющих свое функциональное назначение. Структура кадра представлена ниже: Содержимое регистров микропроцессора и вершины стека Командная строка (2) Первое окно для индикации Окно дизассемблера (4) памяти (HEX-форма) Второе окно для индикации ASCII-коды второго окна памяти (HEX-форма) (5)
(1) (3) (6) 5
Поле 1 – предназначено для индикации текущих состояний регистров микропроцессора и четырех верхних слов стека. Поле 2 – служит для ввода команд загрузки отлаживаемой программы, просмотра содержимого памяти, запуска программы на выполнение, выхода из системы и т. д. Поле 3 – предназначено для индикации памяти данных (адресация через сегментный регистр DS) в шестнадцатеричной форме. Поле 4 – предназначено для просмотра памяти программ (адресация через сегментный регистр СS). Рассматриваемое поле содержит фрагмент программы из восьми команд в символьном виде и в кодах. Просмотр может осуществляться одним их двух способов: - через просмотр без выполнения программы. В этом режиме пользователь может просматривать текст и коды программы, без ее выполнения. Перемещение по тексту программы осуществляется при помощи клавиш перемещения курсора; - просмотр с выполнением программы. В этом режиме осуществляется запуск программы и ее пошаговое выполнение. Покомандное выполнение программы осуществляется с помощью функциональной клавиши F1, а в том случае, когда необходимо выполнить программу до конца текущей подпрограммы, используется функциональная клавиша F2. Поле 5 – служит для индикации памяти данных (адресация осуществляется через сегментный регистр DS) в шестнадцатеричной форме. Поле 6 – представляет данные, индицируемые в поле 5 в ASCII кодах. Поле 7 – задает значение используемых в системе программирования функциональных клавиш: F1 (Step) – выполнение отлаживаемой программы по командам; F2 (StepProc) – выполнение программы до конца очередной подпрограммы; F4 (Help) – на экран монитора последовательно выдаются четыре страницы информации в помощь пользователю; F7 (up) – перемещение курсора вверх; F8 (dn) – перемещение курсора вниз; F9 (le) – перемещение курсора влево; F10 (ri) – перемещение курсора вправо. Клавишами F7 – F10 можно переместить курсор в любое поле кадра и скорректировать содержимое любого регистра микропроцессора или ячейки памяти данных. После выполения корректировки необходимо вернуть курсор в начало командной строки для предотвращения случайного изменения содержимого регистров или ячеек памяти. 6
В том случае, когда курсор находится в командной строке, пользователь может ввести и выполнить одну из нижеперечисленных команд. • Загрузка отлаживаемой программы: L <имя файла>, <адрес 0100> <Enter> • Просмотр текста программы в окне дизассемблирования: D <начальный адрес фрагмента программы> <Enter> • Просмотр содержимого памяти данных: M <номер окна> <начальный адрес> <Enter> или M <номер окна> <регистр, содержащий нач. адрес> <Enter> • Запуск программы на выполнение: G <адрес старта> [, <адрес пром. останова>] <Enter> Необходимо отметить, что при использовании команды G, программа выполняется в автоматическом режиме или до конца программы, или до точки промежуточного останова, заданного пользователем. В том случае, когда требуется покомандное выполнение программы, необходимо воспользоваться функциональными клавишами F1 и F2. В процессе выполнения программы, в командной строке выдается сообщение: *** E X E C U T I N G *** Прервать выполнение программы можно клавишами Ctrl+Esc. Вывод на печать листинга программы и данных производится при помощи следующих команд. • Получение листинга: PD <нач. адрес>,< длина в HEX-коде > [,<специф. файла>] <Enter> • Вывод на печать данных: PH <нач. адрес>,< длина в HEX-коде > [,<специф. файла>] <Enter> Выход из отладчика в DOS осуществляется следующей командой: QUIT <Enter> При работе с отладчиком AFD рекомендуется следующий порядок действий: 1) загрузить отлаживаемый файл, например: L name.com, 0100 <Enter> 2) просмотром программы в окне дизассемблера найти адреса, соответствующие начальным байтам буферов и точкам промежуточных остановов, например: buffer1 -----> 11c5, buffer2 -----> 11f3, останов1 -----> 1267, 7
останов2 -----> 12ad. 3) установить начальные адреса окон для индикации данных, например: M 1 11c5 <Enter> M 2 11f3 <Enter> 4) запустить программу на выполнение в автоматическом режиме до первого останова, например: G 0100,1267 <Enter> 5) выполнить участок программы с ошибкой в покомандном режиме с помощью клавиш F1 или F2 с целью установления несоответствия ожидаемой и реальной информации в регистрах микропроцессора и в ячейках памяти. Определить ошибку в программе и выполнить корректировку регистров и буферов вручную. 6) запустить программу на выполнение с текущего состояния программного счетчика IP до следующей точки останова, например: G ,12 ad <Enter> 7) продолжить выполнение в покомандном режиме аналогично п. 5. 8) выполнить оставшийся участок программы до конца, например: G <Enter> 9) выйти из отладчика и с помощью любого редактора исправить ошибки в исходном файле программы. Задание 1. Запустить на выполнение систему программирования TEDASM. 2. Ввести с помощью редактора TEDASM приведенную в прил. 1 программу, установить опции ассемблирования, произвести трансляцию и выполнение программы. 3. Вторично оттранслировать программу с формированием исполняемого файла (name.com) на диске С. 4. Вызвать отладчик AFD. 5. Загрузить отлаживаемую программу и выполнить ее в покомандном режиме и с промежуточными остановами. Для индикации памяти данных использовать соответствующие окна отладчика.
8
ЛАБОРАТОРНАЯ РАБОТА № 7 ПРОГРАММИРОВАНИЕ ПРОСТЕЙШИХ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ С ЦЕЛОЧИСЛЕННЫМИ ПЕРЕМЕННЫМИ Цель работы: изучение команд пересылки данных, сложения и вычитания микропроцессора К1810ВМ86. Основные сведения Система команд микропроцессора К1810ВМ86 (ВМ86) содержит 91 мнемокод и позволяет совершать операции над байтами, словами (2 байта), отдельными битами и цепочками байтов и слов. По функциональному признаку систему команд ВМ86 можно разбить на пять групп: команды пересылки данных, арифметические операции, логические операции и сдвиги, команды передачи управления и команды управления микропроцессором. В настоящей лабораторной работе рассматриваются первые две группы команд, мнемокоды которых приведены в табл. 1, 2. Команды пересылки данных составляют четыре подгруппы: общие, стековые, ввода-вывода и пересылки цепочек. Все эти команды, за исключением POPF и SAHF, не влияют на флаги. Команда MOV пересылает данные из регистра в регистр, из регистра в память и наоборот, но не обеспечивает пересылку типа память-память, что несколько ограничивает возможности микропроцессора ВМ86. Команда XCHG осуществляет обмен данными между источником и приемнмком. Существует два формата этой команды. Общий формат позволяет обмениваться содержимым любой пары общих регистров, а также обмен между общим регистром и ячейкой памяти. Укороченный формат позволяет обмениваться данными между аккумулятором и общим регистром. Команда XLAT предназначена для быстрого преобразования кодов и заменяет содержимое младшего байта аккумулятора AL на байт из 256байтовой таблицы, базовый адрес которой содержится в регистре BX. При выполнении этой команды к содержимому BX прибавляется содержимое AL, а полученный таким образом результат используется как смещение относительно начала текущего сегмента данных. Байт, расположенный по полученному адресу, помещается в AL, заменяя в нем прежнее содержимое. 9
Таблица 1 Команды пересылки Мнемоника
Операнды
Размер
Описание команды
MOV
dst,src
b,w
src → dst
MOV
dst,data
b,w
data → dst
MOV
dst,sreg
w
sreg → dst
MOV
dst,reg
b,w
reg → dst
XCHG
dst,reg
b,w
dst ↔ reg
PUSH
src
w
src → стек
PUSH
sreg
w
src → стек
PUSHF
w
POP
dst
w
POP
sreg
w
FLAGS → стек стек → dst стек → sreg
POPF
w
LAHF
b
SAHF
b
FLAGS_L → AH
XLAT
b
AH → FLAGS_L
LEA
w
MEM[BX+AL] → AL
стек → FLAGS
Загрузка в reg эффективного LDS
d
адреса src Загрузка в регистры DS и reg
LES
d
двойного слова Загрузка в регистры ES и reg двойного слова
Условные обозначения: b – байт (8 бит); w – слово (16 бит); d – двойное слово (32 бита); reg – регистр общего назначения или указ. регистр; sreg – сегментный регистр; mem – ячейка памяти; src – источник операнда. 10
Таблица 2 Арифметические команды Мнемоника ADD ADD ADC ADC SUB SUB SBB SBB CMP CMP INC DEC NEG MUL IMUL DIV IDIV CBW CWD DAA
Операнды dst,src dst,data dst,src dst,data dst,src dst,data dst,src dst,data dst,src dst,data dst dst dst src src src src
Размер b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b,w b w b
DAS
b
AAA
b
AAC
b
AAM
b
AAD
b
Описание команды dst+src → dst dst+data → dst dst+src+CF → dst dst+data+CF → dst dst-src → dst dst-data → dst dst-src-CF → dst dst-data-CF → dst (dst-src)уст.CF,ZF,SF (dst-data)уст.CF,ZF,SF dst+1 → dst dst-1 → dst dst+1 → dst Ac*src → Ac[DX] без зн. Ac*src → Ac[DX] со зн. [DX]AX/src → Ac без зн. [DX]AX/src → Ac со зн. AL → AX AX → DX и AX Десятичная коррекция AL при сложении. Десятичная коррекция AL при вычитании. Коррекция AL в ASCII при сложении. Коррекция AL в ASCII при вычитании. Коррекция AX в ASCII при умножении. Коррекция AL в ASCII при делении.
Условные обозначения: b – байт (8 бит); w – слово (16 бит); d – двойное слово (32 бита); reg – регистр общего назначения или указ. регистр; sreg – сегментный регистр; mem – ячейка памяти; src – источник операнда. 11
В отличие от остальных команд пересылок команды LEA, LDS и LES пересылают в регистр-приемник не сами данные, а их адрес. Основное назначение этих команд – инициализация регистров перед выполнением цепочечных команд или перед вызовом подпрограмм. Стековые команды PUSH и POP предназначены для обмена данными со стеком, а команды PUSHF и POPF – для обмена со стеком регистра флагов микропроцессора. Арифметические команды ВМ86 также весьма разнообразны и могут выполняться над целыми цислами четырех типов: беззнаковыми и знаковыми двоичными, упакованными и неупакованными десятичными. Двоичные числа могут быть как байтовыми, так и двухбайтовыми. В состав группы арифметических команд входят команды десятичной коррекции, необходимые при работе с десятичными числами. Полезными могут оказаться команды преобразования формата CBW и CWD. Первая из них расширяет байт из AL до двухбайтового числа и помещает его в AX. Вторая команда преобразует двухбайтовое слово в двойное слово (четырехбайтовое) и размещает его в регистрах AX и DX. Расширение в обоих случаях происходит путем распространения знакового разряда источника на старшие байты. Подобные преобразования могут потребоваться для обеспечения корректной работы команды целочисленного деления IDIV. Задание Используя приведенные в прил. 2 подпрограммы PSN и PNS для перевода чисел из символьной формы в десятичную и обратно, написать и отладить программу вычисления заданного арифметического выражения. Для ввода и вывода значений переменных использовать буферы в виде символьных строк. Входные переменные полагать двухзначными целыми. Ввод переменных осуществляется оператором с клавиатуры, вывод результата производить на экран монитора. Варианты заданий 1. (I + J - K) - (N - M) 3. (I – J - K) - (J + M) 5. ( M – N - J) - (J + N) 7. (I + K) - (J + K) - (N + M) 9. (J - M + N) - (N - M + I) 11. (I + N - M - K) - (M - N) 13. (I + N) - (M + K) 12
2. (I + N) - (J - M) + K 4. (I + K) - (N - J) + (I - M) 6. (M + N + I) - (K + J - M) 8. (I + K - M + N) - (M + J) 10. (I + K) + (I + K) - N - M 12. (I + N - M) - (J - K) 14. (J + I) + (N + M) + (I - J)
ЛАБОРАТОРНАЯ РАБОТА № 8 ВВОД-ВЫВОД И ПРЕОБРАЗОВАНИЕ ЧИСЛОВЫХ ДАННЫХ Цель работы: изучение средств ввода и вывода данных в символьной форме, а также приемов преобразования числовых данных из символьной формы в двоичную и обратно. Основные сведения 1. Средства MS-DOS для ввода и вывода символьных данных Ввод и вывод данных при работе на ПЭВМ выполняется в символьной форме под управлением операционной системы MS-DOS. В составе операционной системы имеются специальные процедуры ввода и вывода, обращение к которым из программы пользователя выполняется с помощью команды программного прерывания INT 21H. Выбор процедуры ввода/вывода задается с помощью номера функции прерывания, код которого перед выполнением команды прерывания заносится в регистр АН микропроцессора. При необходимости в регистр DX заносится параметр для процедуры ввода/вывода. 1.1. Ввод одного символа с клавиатуры (функция 01Н) MOV AH,01H ; выбор функции INT 21H ; обращение к MS-DOS После нажатия на клавишу вводимого символа его ASCII-код заносится в регистр AL. 1.2. Вывод одного символа на дисплей (функция 02Н) MOV DL,<код выводимого символа> MOV AH,02H INT 21H 1.3. Ввод символьной строки (функция 0AH) Для ввода символьной строки пользователь должен организовать в своей программе буфер, содержащий n+3 байта памяти, где n - количество вводимых символов. Структура буфера содержит следующие составные части: - дескриптор, расположенный в первых двух байтах буфера и предназначенный для записи константы n+1 и фактического количества введенных символов; - n байтов для размещения вводимых символов; 13
- байт, предназначенный для занесения признака конца ввода (0DH) по нажатию клавиши ВВОД. Ввод константы в первый байт дескриптора выполняется программой пользователя, ввод значения и фактического количества введенных символов выполняется операционной системой в процессе обработки процедуры ввода символьной строки. Фрагмент программы для ввода символьной строки имеет вид: ... BUFIN DB DUP(0) ... LEA DX,BUFIN ; адрес буфера для DOS и пользователя MOV BX,DX MOV AL, ; запись в MOV [BX],AL ; 1-й байт дескриптора MOV AH,0AH INT 21H ... Ввод символьной строки может быть досрочно прекращен нажатием клавиши ВВОД. При попытке ввода количества байтов, превышающего заданное, ПЭВМ подает звуковой сигнал. Функция 0АН позволяет в процессе ввода редактировать вводимую строку. 1.4. Ввод символьной строки (функция 09Н) Под символьной строкой понимается последовательность, заключенная в апострофы: '< последовательность символов> $ ' Как правило, символьная строка должна заканчиваться денежным знаком "$", который является признаком конца вывода для операционной системы. Ниже преведен пример вывода символьной строки: ... STR DB 13,10,'Ввести исходные данные $' ... LEA DX,STR ;адрес выводимой строки MOV AH,09H INT 21H ... 2. Преобразование данных Для преобразования двухразрядных десятичных чисел со знаком в диапазоне -99 - +99 может использоваться подпрограмма PSN, обращение к которой оформляется следующим образом: LEA SI,<адрес десятичной символьной формы> 14
LEA DI,<адрес двоичной численной формы> CALL PSN Для обратного преобразования двоичного числа длиной в один байт в двухразрядное десятичное число из того же диапазона предназначена подпрограмма PNS, обращение к которой оформляется так: LEA SI,<адрес десятичной символьной формы> LEA DI,<адрес двоичной численной формы> CALL PNS Двоичные числа в подпрограммах представляются в дополнительном коде. Задание Ввести исходные данные с клавиатуры в символьном виде, произвести вычисления согласно варианту задания и вывести результат на экран. Варианты заданий 1. (I*J + K*N - I3)/M 2. (I + J)*K - I5/16 3. (I - J)/K - (N + M)*L 4. ((N + M)*I - J)/(2*L) 5. (N5 + N6)*2 + (K + L)*6/(N + M) 6. ((I + J)*5 + (N - M)*3)/K 7. ((I - J)*K + (I + J)*5)/(N - M) 8. (K*(I + J - N)/(I1 - I2))/4 9. I5*I4/(I + J)/(I5 + I4) 10. (N*M - I*J)/(I5 - I4) 11. ((I1*I2/I3) - (I1 + I2))/L 12. ((J*N + K)/(L + I) - I 13. (J5*J6*L1 - I)/(J + 4) 14. (N - M)/(N + K) - I1/I5 15. (I8 + I6)*2 - I4/I1 + J
15
ЛАБОРАТОРНАЯ РАБОТА № 9 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЕНИЙ Цель работы: изучение операторов передачи управления и приемов программирования арифметических выражений, содержащих разветвления. Основные сведения Команды передачи управления условно подразделяются на две группы: - команды безусловных переходов; - команды условных переходов В табл. 3 перечислены команды передачи управления обоих типов. Команды безусловных переходов позволяют передавать управление как внутри текущего сегмента, так и между сегментами. Общий вид команды безусловного перехода: JMP label В результате выполнения этой команды в счетчик команд IP засылается адрес, соответствующий метке label. При переходе внутри сегмента изменяется только регистр IP, если же осуществляется межсегментный переход, то изменяются два регистра CS и IP. Команды условных переходов позволяют передавать управление только внутри текущего сегмента. Общий вид команды условного перехода: Jсс label, где сс – мнемонический код условия перехода. В результате выполнения команды условного перехода в счетчик команд заносится либо адрес, соответствующий метке label, если условие выполняется, либо адрес следующей команды при ложном значении условия. В процессе ассемблирования программы команда передачи управления преобразуется к виду: COP diff, где COP – байт кода операции, а diff – смещение, т. е. восьми- или шестнадцати-разрядный код разницы между адресом перехода и содержимым счетчика команд IP. Приведенная схема соответствует относительной адресации, которая используется только в командах передачи управления. При использовании относительной адресации адрес перехода вычисляется путем 16
суммирования текущего состояния IP и смещения diff, заданного в команде. Если смещение diff отрицательно (в дополнительном коде), то переход выполняется в сторону меньших адресов. Если же смещение diff положительно, то переход выполняется в сторону больших адресов. Команды условных переходов позволяют передавать управление в пределах текущего сегмента со смещением: -128 … +127. В отличие от команд условного перехода микропроцессора К580ВМ80 аналогичные команды микропроцессора К1810ВМ86 позволяют анализировать одновременно состояние нескольких флагов условий. Таблица 3 Команды передачи управления Мнемоника Операнд а. Безусловные переходы JMP Label JMP Src б. Условные переходы JC Lable JNC Lable JZ/JE Lable JNZ/JNE Lable JP Lable JPO Lable JO Lable JNO Lable JS Lable JNS Lable JCXZ Lable JA Lable JAE Lable JB Lable JBE Lable JG Lable JGE Lable JL Lable JLE Lable
Описание команды
Условие
Адрес для label Æ IP Reg Æ IP или Mem(reg) Æ IP Есть перенос Нет переноса Равно нулю Не равно нулю Есть паритет Нет паритета Переполнение Нет переполнения Отрицательное Положительное Регистр CX=0 Выше Выше/равно Ниже Ниже/равно Больше Больше/равно Меньше Меньше/равно
CF=1 CF=0 ZF=1 ZF=0 PF=1 PF=0 OF=1 OF=0 SF=1 SF=0 (CF & ZF)=0 CF=0 CF=1 (CF & ZF)=1 (CF+OF)&ZF=1 SF+OF=0 SF+OF=1 (CF+OF)&ZF=0
17
Задание Составить программу арифметических и логических действий над целыми переменными и константами. Для ввода исходных данных и вывода результата использовать буферы в виде символьных строк, в которых каждое значение переменной размещается в трех байтах: <знак числа> <старшая цифра> <младшая цифра> Перевод чисел из символьной формы в числовую и обратно выполнить с помощью подпрограмм PSN и PNS соответственно. Варианты заданий N<2 ⎧(K + 1) * 4, ⎪ 1. M = ⎨ N - 3 * K + I/2, 2 ≤ N < 4 ⎪2 * N + 1, N≥4 ⎩
I>3 ⎧4 * I - 7, ⎪ 2. M = ⎨I * I + 4 * I - 7, I <1 ⎪(I * I * I)/(I * I + 2), 1 ≤ I ≤ 3 ⎩
I=J ⎧I + 4 * J, ⎪ 3. M = ⎨2 * I - (J + J/2), I > J ⎪I * 4 + J, I<J ⎩
N<7 ⎧K * 4, ⎪ 4. M = ⎨(N - K)/2, N > 20 ⎪ N + 1, 7 ≤ N ≤ 20 ⎩
I < −2 ⎧(J + I) * 3, ⎪ 5. M = ⎨I * 2 + J * J/4, I > 1 ⎪2 * N + 1, - 2 ≤ I ≤ 1 ⎩
I≥2 ⎧I * K + K/2, ⎪ 6. M = ⎨2 * I * I + K, I<0 ⎪3 * I * I * I - K, 0 ≤ I ≤ 2 ⎩
I*I <5 ⎧2 * I * I + I, ⎪ 7. M = ⎨5 * I * I - 1, 5 ≤ I * I ≤ 16 ⎪3 * I/5 - 2, I * I ≥ 16 ⎩
⎧J + I * I/J, I > J 8. M = ⎪⎨J * (I + 1), I + J ⎪2 * J - I, I < J ⎩
J≥5 ⎧2 * J * J + 3, ⎪ 9. M = ⎨7 * J + 8, 2 ≤ J < 5 ⎪- 2 * J * J + 2, J < 2 ⎩
⎧3 * I + J/2, I ≥ 7 10. M = ⎪⎨4 * I - 6, 1 ≤ I < 7 ⎪2 * I * I * J, I < 1 ⎩
⎧3 * I - J + 3, (J + I) ≥ 5 ⎪ 2 ≤ (J + I) < 5 11. M = ⎨I * J, ⎪J + 2, (J + I) < 2 ⎩
J>K ⎧K, ⎪ 12. M = ⎨5 * J + K, J < K ⎪7 * K + J, J = K ⎩
18
ЛАБОРАТОРНАЯ РАБОТА № 10 КОМАНДЫ ОБРАБОТКИ ЦЕПОЧЕК ДАННЫХ Цель работы: изучение микропроцессора К1810ВМ86.
команд
обработки
цепочек
данных
Основные сведения Под цепочкой данных понимается последовательность любых байтов или слов, находящихся в смежных ячейках памяти. В системе команд микропроцессора ВМ86 имеется пять однобайтовых команд, предназначенных для обработки одного элемента цепочки. Команды можно разделить на две группы: пересылки и сравнения. В группу команд пересылки входят три команды: MOVS, LODS и STOS. Команда MOVS dst, src осуществляет пересылку элемента цепочки из dst в src. Для загрузки регистра-аккумулятора содержимым элемента цепочки используется команда LODS src, а для обратной операции – команда STOS dst. В последнем случае загрузка цепочки может идти или из младшего байта аккумулятора (в случае байтовой цепочки), или из всего аккумулятора (если цепочка состоит из 16-разрядных слов). Каждая команда обрабатывает только один элемент цепочки. В том случае, когда необходимо обработать несколько элементов, команде должен предшествовать префикс REP, причем требуемое число повторений необходимо заранее указать в регистре CX. Применение префикса позволяет обрабатывать цепочки быстрее, чем в случае организации программного цикла. С помощью префикса можно организовать обработку цепочек длиной до 64К байтов. Для организации ветвлений используются команды CMPS и SCAS. Команда CMPS dst, src производит вычитание элемента цепочки dst из элемента цепочки src, причем ни один из операторов не изменяет своего содержимого (производится так называемое неразрушающее сравнение). В результате такого вычитания устанавливаются соответствующие флаги в регистре флагов микропроцессора. Команда SCAS dst производит неразрушающее сравнение элемента цепочки dst с содержимым аккумулятора. Совместно с командами сравнения используются префиксы условного повторения REPE (REPZ) и REPNE (REPNZ). Так, используемый вместе с командой CMPS префикс REPE (REPZ) позволяет обнаружить одинаковые элементы цепочек, а в случае применения команды SCAS позволяет организовать поиск элемента цепочки, не 19
совпадающего со значением, заданным в аккумуляторе. Действие префикса REPNE (REPNZ) обратно действию префикса REPE (REPZ). Цепочка-источник по умолчанию располагается в текущем сегменте данных и адресуется регистром SI, причем существует возможность смены сегмента специальным префиксом. Цепочка-получатель всегда располагается в дополнительном сегменте данных и адресуется регистром DI. При выполнении цепочечной команды содержимое регистров SI и DI автоматически изменяется на ±1 (при обработке байтов) или ±2 (при обработке слов). Варианты заданий 1. Ввести строку символов и вывести ее в обратной последовательности. 2. Ввести строку символов "номерфамилиягруппа", дополнить ее побелами и вывести "номер фамилия группа". 3. Ввести строку латинских букв и заменить их русскими последовательно. Вывести полученную строку. 4. Ввести строку латинских и русских букв вперемешку. Заменить все русские буквы латинскими. Вывести полученную строку. 5. Ввести две символьные строки одинаковой длины. Сравнить их символ за символом до первого отличного. Вывести номер символа. 6. Ввести строку символов. Подсчитать сколько раз в ней встретится символ 'A'. Полученное количество преобразовать в символьную форму и вывести. 7. Ввести строку символов из русских и латинских букв. Заменить русские буквы пробелами. Вывести полученную строку. 8. Ввести строку символов. Сформировать и вывести строку вдвое большей длины, где каждый символ предваряется пробелом. 9. Ввести строку символов. Сформировать и вывести строку вдвое большей длины, где каждый символ повторяется дважды. 10. Ввести четное число символов. Вывести вторую половину символов в обратной последовательности. 11. Ввести символы цифр от '0' до '9'. Преобразовать каждый символ в число в диапазоне от 0 до 9. Сложить полученные числа и вывести сумму в символьной форме. 12. Ввести строку с четным количеством символов. Поменять местами каждую пару символов. Вывести полученную строку символов. 13. Ввести строку с четным количеством символов. Вторую половину строки забить символом нуля. Вывести полученную строку символов. 14. Ввести строку символов. Каждый четный по порядку следования символ заменить символом '*'. Вывести полученную строку символов. 20
ЛАБОРАТОРНАЯ РАБОТА № 11 ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ ЦЕЛЫХ ЧИСЕЛ Цель работы: изучение приемов работы c табличными целочисленными данными. Основные сведения Во многих прикладных программах используется табличная организация данных. Для облегчения табличного поиска большинство таблиц определяются систематически, т. е. элементы таблицы имеют одинаковый формат и одинаковую длину. Специально для обработки массивов в систему команд ВМ86 введена команда XLAT. Эта команда предназначена для быстрого преобразования кодов и заменяет содержимое AL на байт из 256-байтной таблицы перекодировки, начальный адрес которой содержится в регистре BX. Содержимое AL используется как индекс таблицы перекодировки, находящейся в сегменте данных. При выполнении этой команды к содержимому ВХ прибавляется содержимое AL, а полученный результат используется как смещение относительно начала сегмента данных. Адресуемый таким образом байт пересылается в AL. При написании программ работы с таблицами наиболее эффективно используются индексная и базово-индексная адресация. В случае индексной адресации эффективный адрес вычисляется как сумма смещения, заданного в команде, и содержимого индексного регистра SI или DI. Такую адресацию лучше всего применять в том случае, когда адрес таблицы фиксирован и не меняется в течение выполнения программы. В таком случае в качестве смещения указывают базовый адрес таблицы, а содержимое регистра SI или DI служит индексом, т. е. определяет элемент таблицы. Если же приходится работать с одинаковыми элементами различных одномерных таблиц, то в индексном регистре задают адрес текущей таблицы, а смещение задает элемент таблицы. В случае двумерных таблиц или при перемещении таблицы в памяти во время выполнения программы лучше использовать базово-индексную адресацию. Для этого типа адресации эффективный адрес вычисляется как сумма содержимого базового регистра (BX или BP) и индексного регистра (SI или DI) и смещения, задаваемого в команде. При работе с двумерными 21
массивами базовый адрес задается смещением, а в регистрах содержатся индексы элемента таблицы. Варианты заданий 1. Для массива чисел подсчитать сумму отрицательных чисел и их количество. 2. В массиве целых чисел оставить только четные по значению элементы, заменив остальные нулями. 3. Из каждой группы равных между собой чисел оставить только одну, заменив остальные нулями. 4. В массиве целых чисел подсчитать сумму положительных чисел и их количество. 5. Вычислить и выдать на дисплей количество чисел, для которых выполняется условие: A(i) > 3. 6. Вычислить сумму элементов целых чисел, которые удовлетворяют условию: 0 ≤ X(i) ≤ 5. 7. Найти сумму элементов, имеющих четный номер. 8. Из массива целых чисел: b(1), b(2), b(3), … ,b(n) сформировать массив c(1), c(2), c(3), … , c(n) такой, что b(i) = iXс(i). 9. Из массива целых чисел: b(1), b(2), b(3), … ,b(n) сформировать массив c(1), c(2), c(3), … , c(n) такой, что с(i) = |b(i)|. 10. Вычислить и выдать на дисплей количество элементов массива, не равных нулю. 11. Вычислить и выдать на дисплей значения и номера элементов массива, для которых выполняется условие: 2 < a(i) ≤ 8. 12. Составить массив целых чисел такой, что b(i) = 1, если a(i) > 0 и b(i) = 0, если a(i) < 0. Значения b(1), b(2), b(3), … , b(n) вывести на диплей. 13. Составить одномерный массив целых чисел d(1), d(2), d(3), … , d(n) такой, что d(i) = c(1)|c(2)|....|c(n). Значения d(1), d(2), d(3), … , d(n) вывести на диплей. 14. Найти наибольший элемент массива x(1), x(2), x(3), … , x(n). 15. Найти наименьший элемент массива x(1), x(2), x(3), … , x(n).
22
ЛАБОРАТОРНАЯ РАБОТА № 12 КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ Цель работы: ознакомление с командами логических операций и получение навыков работы с битами. Основные сведения Логические операции в системе команд ВМ86 представлены булевыми операторами NOT (инверсия), AND (конъюнкция), OR (дизъюнкция) XOR (исключающее ИЛИ). К логическим командам можно отнести и команду неразрушающей проверки TEST. Все логические операции являются поразрядными, т. е. выполняются независимо для всех битов операндов. На флаги микропроцессора бинарные логические операции влияют следующим образом: • флаги OF (переполнение) и CF (перенос) всегда переводятся в нулевое состояние; • состояние флагов SF (знак), ZF (нуль) и PF (четность) зависят от полученного результата; • состояние флага AF (вспомогательный перенос) не определено. Следует отметить, что операция NOT на флаги не влияет. При работе с битами команда AND применяется для перевода конкретного бита (группы битов) в нулевое состояние. Сбрасываемые биты задаются "маской", т. е. вторым операндом команды. Маска должна содержать нули в сбрасываемых битах и единицы в остальных: MOV AL,00111101b ; AL=00111101b AND AL,00001111b ; AL=00001101b Обратную операцию установки бита в единицу можно осуществить с помощью команды OR. В этом случае неизменяемым битам должны соответствовать нули в маске, а на месте устанавливаемого бита (группы битов) – единицы: MOV AL,00001101b ; AL=00001101b OR AL,10000000b ; AL=10001101b Команду XOR можно использовать для инвертирования состояния определенных битов. В маске инвертируемым битам соответствуют единицы, а прочим – нули: MOV AL,00000101b ; AL=00000101b XOR AL,00001111b ; AL=00001010b 23
Варианты заданий 1. Ввести целое число. Вывести его двоичное представление. 2. Ввести целое число. Вывести его шестнадцатеричное представление. 3. Вывести шестнадцатеричное предсталение команды MOVSB. 4. Вывести двоичное представление команды SCASB. 5. Ввести два целых числа, произвести над ними логическое сложение и вывести двоичное представление результата. 6. Ввести два целых числа, произвести над ними арифметическое сложение и вывести шестнадцатеричное представление результата. 7. Ввести два целых числа, произвести над ними операцию "исключающее или" и вывести двоичное представление результата. 8. Ввести два целых числа, произвести над ними операцию "исключающее или" и вывести шестнадцатеричное представление результата. 9. Ввести целое число, произвести его арифметический сдвиг на один разряд влево. Вывести двоичное представление результата. 10. Ввести двоичное число кратное 4, произвести его арифметический сдвиг на два разряда вправо. Вывести двоичное представление результата. 11. Ввести три числа. Заполнить три последовательных байта значениями знакового разряда этих чисел. Вывести шестнадцатеричное представление байтов. 12. Ввести два буквенно-цифровых символа. Произвести над ними операцию "исключающее или". Вывести двоичное представление результата. 13. Выполнить операцию "исключающее или" с кодами команд XCHG AX,BX и XCHG BX,AX. Вывести двоичный результат операции. 14. Ввести целое число, изменить знак и вывести двоичное представление результата. 15. Ввести целое число, инвертировать и вывести шестнадцатеричное представление результата.
24
ЛАБОРАТОРНАЯ РАБОТА № 13 ОРГАНИЗАЦИЯ ПОДПРОГРАММ Цель работы: изучение принципов организации подпрограмм. Основные сведения Для вызова подпрограммы используется команда CALL, которая передает управление с автоматическим сохранением адреса возврата в стеке для успешного возвращения к выполнению текущей программы после вызова подпрограммы. В поле операнда этой команды содержится адрес первого оператора подпрограммы. Возврат управления в основную программу происходит по команде RET. В силу сегментирования памяти микропроцессора ВМ86 выделяют два типа команды CALL: NEAR (внутрисегментный вызов), когда подпрограмма находится в текущем сегменте кода, и FAR (межсегментный вызов), когда код подпрограммы находится в другом сегменте. В соответствии с типом вызова в стеке запоминаются соответственно либо только указатель команд PC, либо указатель команд PC и сегментный регистр CS. В подпрограмме обязательно должна находиться хотя бы одна команда возврата из подпрограммы RET. По этой команде осуществляется возврат управления в основную программу. По этой команде из стека извлекается старое содержимого PC и, при необходимости (в зависимости от типа вызова), содержимого CS. Для передачи подпрограмме некоторых данных из основной программы используют стек. В этом случае сначала в стек загружаются необходимые данные и только после этого происходит вызов подпрограммы. Если использовать обычную команду RET, после возврата из подпрограммы в стеке будут все еще находиться данные, помещенные перед вызовом. Поэтому необходимо будет принять меры по очистке стека, иначе он может переполниться, что приведет к аварийному останову программы. Для упрощения такой работы со стеком в систему команд ВМ86 была введена модификация команды возврата из прерывания RET disp. При возврате управления, после того как из стека были выгружены PC и CS, к содержимому указателя стека прибавляется значение disp, заданное в команде. Таким образом, в основной программе после вызова подпрограммы не нужно освобождать стек от переданных данных, это делается автоматически. 25
Варианты заданий 1. Составить подпрограмму обнуления произвольного столбца двумерного массива. Обнулить три столбца произвольного массива. 2. Составить подпрограмму взаимной перестановки каждой пары символов массива с четным количеством элементов. Обработать три массива. 3. Составить подпрограмму поэлементного суммирования двух столбцов двумерного массива в один. Найти сумму двух пар столбцов. 4. Составить подпрограмму, позволяющую менять местами два произвольных столбца двумерного массива. 5. Составить подпрограмму выделения произвольного столбца двумерного массива в одномерный. Выделить два произвольных столбца. 6. Составить подпрограмму поэлементного сложения двух массивов в третий. Сложить два раза по два массива. 7. Составить подпрограмму выделения произвольной строки из двумерного массива. Выделить две строки. 8. Составить подпрограмму перевода двоичного представления целого числа в двоичное символьное. Вывести двоичные представления трех чисел. 9. Составить подпрограмму перевода двоичного представления целого числа в шестнадцатеричное символьное. Вывести шестнадцатеричные представления трех чисел. 10. Составить подпрограмму нахождения минимального значения среди элементов массива целых чисел. Найти минимальные значения двух массивов разной длины. 11. Составить подпрограмму нахождения максимального значения среди элементов массива целых чисел. Найти максимальные значения двух массивов разной длины. 12. Составить подпрограмму, позволяющую раздвинуть каждую пару символов пробелом. Раздвинуть элементы двух массивов разной длины. 13. Составить подпрограмму сжатия строки символов путем удаления пробелов. Сжать три строки символов. 14. Составить подпрограмму инвертирования строки символов. Проинвертировать две строки. 15. Составить подпрограмму замены всех русских символов пробелами. Обработать две строки символов, содержащие русские и латинские буквы.
26
ЛАБОРАТОРНАЯ РАБОТА № 14 ПРОГРАММИРОВАНИЕ МАКРООПРЕДЕЛЕНИЙ Цель работы: ознакомление с принципами написания и использования макрокоманд. Основные сведения Необходимость использования макрокоманд определяется исходя из частоты использования той или иной группы команд ассемблера. Примерами макрокоманд могут быть операции ввода-вывода, связанные с инициализацией регистров, перекодировка данных из ASCII-кода в двоичный и обратно и др. Макроопределение должно находиться до определения сегмента. Директива MACRO указывает ассемблеру, что следующие команды до директивы ENDM являются частью макроопределения. Пример макроопределения INIT приведен ниже: INIT MACRO PARAM1 PUSH AX PUSH BX SUB AX,AX MOV BX,PARAM1 ENDM Формальные параметры в макроопределении (PARAM1) указывают ассемблеру на соответствие их имен аналогичным именам в теле макроопределения. Формальные параметры могут иметь любые имена, не обязательно совпадающие с именами данных. В любой макрокоманде может быть любое число формальных параметров. Варианты заданий 1. Составить макрокоманду записи N пробелов, начиная с произвольного номера элемента M символьной строки. Выполнить запись N1 пробелов с M1 элемента и N2 пробелов с M2 элемента. 2. Составить макрокоманду сравнения двух символьных строк до первого несовпадения. Вывести номер несовпавшего символа. 3. Составить макрокоманду сравнения двух символьных строк до первого сравнения с выводом номера сравнившегося элемента. Выполнить сравнение два раза по две строки. 27
4. Составить макрокоманду вычисления количества вхождений поизвльного символа в символьную строку. Определить количество вхождений двух произвольных символов в две строки. 5. Составить макрокоманду формирования массива символов из двух исходных. Сформировать два массива из двух пар исходных массивов. 6. Составить макрокоманду обнуления фрагмента массива чисел из N элементов, начиная с i-го элемента. Обнулить два фрагмента массива чисел по N1 и N2 элемента, начиная с i1-го и i2-го элемента соответственно. 7. Составить макрокоманду нахождения максимального числа в массиве целых чисел. Найти максимальное число из двух массивов разной длины. 8. Составить макрокоманду нахождения минимального числа в массиве целых чисел. Найти минимальное число из двух массивов разной длины. 9. Составить макрокоманду суммирования элементов одномерного массива произвольной длины. Найти суммы двух массивов. 10. Составить макрокоманду перевода внутреннего двоичного представления целого числа в двоичное символьное. Вывести двоичное представление трех чисел. 11. Составить макрокоманду перевода внутреннего двоичного представления целого числа в шестнадцатеричное символьное. Вывести шестнадцатеричное представление трех чисел. 12. Составить макрокоманду выделения произвольной строки из двумерного массива. Вывести две строки двумерного массива. 13. Составить макрокоманду выделения произвольного столбца из двумерного массива. Вывести два столбца двумерного массива. 14. Составить макрокоманду, позволяющую поменять местами две произвольные строки двумерного массива. Поменять два раза по две строки двумерного массива.
Список литературы 1. Григорьев В. Л. Программирование однокристальных микропроцессоров. – М.: Энергоатомиздат, 1987.– 288 c. 2. Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высш. шк., 1992. – 447 c. 3. Микропроцессорный комплект К1810: Структура, программирование, применение: Справочная книга / Ю. М. Казаринов, В. Н. Номоконов, Г. С. Подклетнов и др. – М.: Высш. шк., 1990. – 269 c. 4. Данкан Р. Профессиональная работа в MS-DOS. – М.: Мир, 1993. – 509 c. 28
Приложение 1
; Программа поиска максимального элемента массива JMP START ARRAY DB 10 DUP (0) STRING1 DB 13,10,'ВВЕДИ 10 ЭЛЕМЕНТОВ : $' STRING2 DB 13,10,'МАКСИМАЛЬНЫЙ ЭЛЕМЕНТ : $' REZ DB 13,10,'НАЖМИ ЛЮБУЮ КЛАВИШУ... : $' START: MOV DX,OFFSET STRING1 MOV AH,09 INT 21H MOV SI,OFFSET ARRAY MOV CX,10 M1: MOV AH,01 INT 21H MOV SI,[AL] INC SI LOOP M1 MOV SI,OFFSET ARRAY MOV CX,10 MOV BL,[SI] M2: MOV AL,SI CMP BL,AL GDE M3 MOV BL,AL M3: INC SI LOOP M2 MOV BYTE PTR REZ,BL MOV DX,OFFSET STRING2 MOV AH,09 INT 21H MOV AH,01 INT 21H INT 20H END
29
Приложение 2
; Подпрограмма перевода числа из символьной формы в двоичную ; SI - адрес символьной формы ; DI - адрес числа PSN PROC PUSH AX PUSH CX PUSH DX MOV AL,[SI] CMP AL,'-' JNE MMM1 MOV CH,80H JMP MMM2 MMM1: MOV CH,00H MMM2: INC SI MOV AL,SI SUB AL,30H MOV DL,10 MUL DL MOV CL,AL INC SI MOV AL,SI SUB AL,30H ADD CL,AL OR CL,CH TEST CL,80H JZ MMM3 XOR CL,7FH INC CL MMM3: MOV [DI],CL INC SI INC DI POP DX POP DX POP CX POP AX RET PSN ENDP
30
; Подпрограмма перевода числа из двоичной формы в символьную ; SI - адрес символьной формы ; DI - адрес преобразуемого числа PNS PROC PUSH AX PUSH DX MOV AL,[DI] TEST AL,80H JZ MMM4 XOR AL,7FH INC AL MMM4: TEST AL,80H JNZ MMM5 MOV [SI],'+' JMP MMM6 MMM5: MOV [SI],'-' MMM6: INC SI AND AL,7FH CBW MOV DL,10 DIV DL ADD AL,30H MOV [SI],AL INC SI ADD AH,30H MOV [SI],AH INC SI INC DI POP DX POP AX RET PNS ENDP
31
МИКРОПРОЦЕССОРНЫЕ УСТРОЙСТВА СИСТЕМ УПРАВЛЕНИЯ Методические указания по выполнению лабораторных работ № 6–14 для студентов специальности 210100 «Управление и информатика в технических системах»
Виктор Эдуардович Иванов Алексей Викторович Левенец
Главный редактор Л. А. Суевалова Редактор Е. Н. Ярулина Компьютерная верстка А. В. Левенца
Лицензия на издательскую деятельность ЛР № 020526 от 23.04.97 Подписано в печать 18. 04. 02. Формат 60x84 1/16. Бумага писчая. Гарнитура «Таймс» Печать офсетная. Усл. печ. л. 1,9. Уч.-изд. л. 1,6. Тираж 150 экз. Заказ . С 35. Издательство Хабаровского государственного технического университета. 680035, Хабаровск, ул. Тихоокеанская, 136. Отдел оперативной полиграфии издательства Хабаровского государственного технического университета. 680035, Хабаровск, ул. Тихоокеанская, 136. 32