- •Федеральное агентство по образованию
- •В.Н. ЛОКТЮХИН
- •Рязань 2008
- •Печатается по решению редакционно-издательского совета Государственного образовательного учреждения высшего профессионального образования «Рязанский государственный университет имени С.А. Есенина» в соответствии с планом изданий на 2008 год.
- •ВВЕДЕНИЕ
- •1.1. Системы счисления, применяемые в ЭВМ
- •1. Двоичная система счисления
- •2. Шестнадцатеричная система счисления
- •1.5. Кодирование алфавитно-цифровой информации
- •Представление чисел в ЭВМ
- •Форматы (формы представления) числовых данных в МП
- •3. Представление многобайтовых двоичных чисел
- •4. Представление чисел с плавающей точкой (ПТ)
- •1.7.2. Сложение двоичных чисел в ЭВМ
- •Рис. 2.2. Формат регистра признаков
- •2.1.2. Модели доступа к памяти в реальном и защищенном режимах работы процессора, поддержка многозадачности
- •Формат команды и способ адресации как элементы программной архитектуры и ассемблера
- •3. ОСНОВЫ РАЗРАБОТКИ И ОТЛАДКИ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА IBM PC
- •В таблице 3.1 приведены примеры записи в программах директив ассемблера tasm.exe фирмы Borland.
- •Таблица 3.1
- •Примеры записи директив ассемблера tasm
- •Пример 3.4
- •Пример 3.5
- •.MODEL
- •3.3.1. Разновидности программного обеспечения для разработки программ на языке ассемблера
- •3.3.3. Порядок ввода и отладки программы (пример 3.4) с исполняемым com-модулем
- •Создание исполняемого модуля
- •Порядок разработки программы
- •Пример 3.6
- •Ассемблирование
- •Создание исполняемого модуля
- •Выполнение и отладка программы
- •3.8. Программирование обработки цепочек данных
- •ПРИЛОЖЕНИЯ
- •Приложение 1
- •Варианты заданий к практическим занятиям по представлению данных и выполнению арифметико-логических операций в ЭВМ
- •Приложение 2
- •Приложение 3
- •Приложение 4
- •Приложение 6
- •Таблица сложения 16-ричных цифр (символов)
- •Приложение 8
- •Базовая система команд МП 80Х86 (или 8086)
- •ОГЛАВЛЕНИЕ
- •ВВЕДЕНИЕ………………………...………...……………………......
- •Системы счисления, применяемые в ЭВМ……...………………
- •Перевод из десятичной в q-ичную систему счисления.....……
- •Перевод из q-ичной в десятичную систему счисления….....…
- •ПРИНЦИПЫ ДОСТУПА К ПАМЯТИ. ФОРМАТЫ КОМАНД И РЕЖИМЫ АДРЕСАЦИИ В МП 80Х86…………………...….....
- •Регистры и модели доступа к памяти. Поддержка многозадачности в защищенном режиме работы МП………..
- •Приложение 1. Варианты практических заданий по представлению данных и выполнению арифметико-логических операций в ЭВМ..
- •Приложение 5. Варианты заданий по обработке цепочек…………..
- •Приложение 6. Таблица сложения 16-ричных цифр (символов)……
- •Приложение 7. Темы практических занятий и лабораторных работ
- •Приложение 8. Базовая система команд МП 80х86 (или 8086)….....
- •архитектура
- •Книга 2
Директивы (или псевдооператоры) ассемблера в отличие от командных операторов при трансляции не генерируют кодов команды. Их основное назначение – определение в результате ассемблирования программы областей памяти для размещения данных и команд, запись в эти области их машинных кодов, определение начала и конца программы, задание моделей памяти и другого.
Директивы языка ассемблера имеют следующий формат:
[Метка] Псевдооператор |
[Операнд] |
[;Комментарий] |
В таблице 3.1 приведены примеры записи в программах директив ассемблера tasm.exe фирмы Borland.
Таблица 3.1
Примеры записи директив ассемблера tasm
Директи- |
|
|
П р и м е р з а п и с и |
|
ва |
|
|
||
|
|
|
|
|
ORG |
|
ORG |
100H |
;Программа с адреса 100H |
EQU |
ALFA |
EQU |
13H |
;Константе с именем ALFA |
|
|
|
|
;присвоить значение13H |
DB |
K |
DB |
60H |
;Для переменной с именем K ;резер- |
|
|
|
|
вируется ячейка (байт) памяти, ;в ко- |
|
|
|
|
торую заносится 60H |
DW |
X |
DW |
160H |
;Для переменной с именем X ;резер- |
|
|
|
|
вируются 2 ячейки (слово) ;памяти, в |
|
|
|
|
которые заносятся 60H |
|
|
|
|
;и 01H |
|
BUF |
DW |
8 DUP(?) |
;Для переменной BUF резервируется ; |
|
|
|
|
8 слов памяти |
|
TABL |
DB |
‘Диск’ |
;Для переменной TABL ;резервируют- |
|
|
|
|
ся ячейки памяти, |
|
|
|
|
;в которые заносится |
|
|
|
|
последователь-;ность ASCII-символов |
PROC |
TUR |
PROC |
|
«Диск» |
ENDP |
TUR |
ENDP |
|
;Начало |
|
|
|
|
;и конец процедуры с именем TUR |
.CODE |
|
|
|
;Упрощенные сегментные директивы |
.DATA |
|
|
|
;сегмента кодов, |
.STACK |
.STACK |
100H |
|
;сегмента данных, |
.MODEL |
.MODEL |
tiny |
|
;сегмента стека размером 100H байт |
END |
|
END |
|
;Модель памяти размером 64 Kбайт |
|
|
|
|
;Конец текста программы |
|
|
|
|
|
50
Рассмотрим применение основных директив ассемблера.
1. ORG 100H – директива, определяющая начальный адрес
программы или данных, например, ORG 500H.
2. Директивы (псевдооператоры) данных – служат для определения констант и данных в памяти. Из них следует выделить:
а) EQU и знак равно «=» – псевдооператоры определения или присваивания. Например:
ALFA EQU 13Н ;Константе ALFA присвоить значение 13Н Применять директиву EQU можно в любом месте программы
(обычно там, где определяются данные).
Псевдооператор = отличается от EQU тем, что позволяет переопределять значение константы, например: BETA = 10H.
Переменная, определенная ранее с помощью директивы EQU или =, выступает, например, в команде MOV СХ,ALFA в роли константы, непосредственно заданной в коде этой команды.
б) DB, DW, DD, DQ – псевдооператоры определения данных.
С их помощью определяют операнд (данные) размером: байт (DB), слово (DW), двойное слово (DD), квадрослово (DQ) и задают его значение с размещением в памяти. Числа со знаком размещаются в памяти в дополнительном коде (ДК). Начальный эффективный адрес их размещения задают с помощью директивы ORG.
Пример 3.1
;Определение данных в памяти с адреса 500H ORG 500H
KDW +60H ;Операнд – слово K = +60
N |
DW |
-10H |
;Операнд – слово N = –10 |
R |
DB |
+3 |
;Операнд – байт R = +3 |
После трансляции программы, содержащей приведенный фрагмент, данные со знаком будут представлены и размещены в памяти в ДК, начиная с адреса DS:0500Н, следующим образом:
|
|
Память |
|
Данные |
Адрес 7 |
|
0 |
|
|
DS:0500 |
|
60 |
|
Операнд К = +60Н в формате слова в ДК |
0501 |
|
00 |
|
|
0502 |
|
F0 |
|
Операнд N = –10Н в формате слова в ДК |
0503 |
|
FF |
|
|
51
0504 |
03 |
Операнд R = +3Н в формате байта в ДК |
Подобное определение переменных позволяет в командных операторах записывать их в виде символических имен. Например:
MOV AX,N ; AX ← N
Приведенный оператор эквивалентен по своему действию команде MOV AX,[0500H], содержащей эффективный адрес [0500H] операнда N (см. табл. 2.2). Однако запись команды с указанием адреса [0500H] при составлении программ на ассемблере использовать не рекомендуется.
В случае если при определении данных директива ORG отсутствует, их размещение производится транслятором с нулевого значения эффективного адреса ЕА памяти.
|
Пример 3.2 |
|
|
|
Применение директив определения данных: |
||
|
– задание таблиц и массива данных: |
||
Х |
DB |
1,2,-3,3,4,-5,6,7,8,9,0AH ;Массив чисел со знаком |
|
|
– резервирование области памяти: |
||
Y |
DB |
0,0,0,0 |
;Разместить в памяти четыре нуля |
Y |
DB |
4 DUP(0), 5,-3 ;Разместить 4 нуля, а затем 5 и –3 |
|
|
– задание в памяти строковых данных: |
||
Text DB |
‘Петров’; Разместить в памяти строку «Петров» |
||
При размещении строки в памяти по младшему адресу в виде ASCII-кода размещается ее первый символ, затем второй и т.д.
3. Директивы определения процедуры PROC и ENDP
Отмечают начало и конец процедуры, содержащей блок командных операторов, который завершается командой возврата RET. Процедура вызывается из основной программы с помощью команды вызова CALL или команды прерывания INT. В последнем случае процедура прерывания завершается командой возврата IRET.
Пример 3.3
Процедура SUMMA сложения чисел d ← d + s, размещенных в текущем сегменте памяти (см. пример 2.1).
SUMMA PROC |
|
|
PUSH |
AX |
; AX ← s (индексная адресация s) |
MOV |
AX,[SI-2] |
|
ADD |
[SI],AX |
; d ← d + s (косв. рег. адресация d) |
POP |
AX |
|
RET |
|
|
52
SUMMA ENDP
Различают ближнюю (NEAR) и дальнюю (FAR) процедуры. Процедура с атрибутом NEAR (или по умолчанию, как это сделано в примере 3.3) может быть вызвана из текущего сегмента кодов (программы), а с атрибутом FAR – из любого сегмента. Процедуры оформляются в конце основной программы, но до директивы END.
4. Директивы макроопределения MACRO и ENDM
Программы, написанные на языке ассемблера, часто содержат повторяющиеся участки. Такой участок можно оформить в виде макроопределения (или макрокоманды), характеризуемого произвольным именем и необязательным списком формальных аргументов.
Начало макроопределения (или макроса) определяется директивой MACRO с необязательным списком, а ее конец – директивой ENDM. Так, приведенный в примере 3.3 текст программы можно представить в виде макроопределения, например с именем:
SUM_SD MACRO
MOV AX,[SI-2]
ADD [SI],AX ENDM
Вызов выполнения такого участка (макровызов) производится путем включения в программу макрокоманды с принятым именем. При каждом появлении в программе операторной строки, содержащей макрокоманду, транслятор генерирует для нее последовательность кодов команд, реализующих повторяющийся участок программы.
Понятие о макропрограммировании
Программирование с применением макрокоманд называют макропрограммированием. Его применение обеспечивает более высокий уровень машинно-ориентированных языков программирования. При этом программист оперирует макрокомандами, отражающими действия последовательности нескольких машинных команд («один к нескольким»). Это приводит к более коротким текстам программ на языке ассемблера и сокращению времени на их разработку за счет использования полученных ранее макроопределений.
Введение принципов макропрограммирования при разработке программ позволяет существенно сократить время выполнения программы с применением макрокоманд. Это сокращение обеспечивается
53
за счет исключения из основной программы достаточно медленных команд обращения CALL к процедуре, выполняющей операцию, идентичную операции, которая реализуется последовательностью команд, генерируемых макроопределением. Основной недостаток макропрограммирования – это увеличение длины объектной программы в байтах, вызванное повторениями одинаковых последовательностей кодов команд МП там, где встречается макрокоманда.
Содержимое макроопределения (также как и процедуры) задается при программировании отдельно от основной программы, из которой оно вызывается. Примеры формирования и вызова процедур и макроопределений даны далее в п. 3.7 при программировании операций вывода текста на экран.
5.Директива управления трансляцией END означает конец программы с определенным именем.
Например, псевдооператор END BEGIN отмечает конец программы с именем BEGIN. Поэтому начало исходной программы должно иметь метку, например, BEGIN. Программу в целом также можно определить как процедуру.
Если директива END не имеет метки, то она используется для завершения вспомогательных ассемблерных модулей, которые могут быть вызваны из основного модуля, обязательно завершаемого как END <имя основного модуля>.
6.Упрощенные директивы определения начала сегментов
.STACK, .CODE и .DATA задают начало сегментов стека (и его объем), программы и данных соответственно.
Прежде чем получить доступ к ячейкам памяти сегмента данных, необходимо загрузить в сегментный регистр ds начальный сегментный адрес с помощью последовательности команд:
mov ax,@data mov ds,ax
Сегментные регистры cs и ss не надо выставлять на начальные адреса сегментов кода и стека. Это сделает операционная система при загрузке программы.
Для задания сегментов могут быть также использованы директивы SEGMENT (начало) и ENDS (конец) сегмента. Однако они имеют сложную форму записи, вследствие чего при разработке несложных программ целесообразно применять сокращенные сегментные директивы.
54
7. Директива определения типа моделей памяти
Директива .МODEL <тип модели памяти> задает одну из следующих возможных моделей памяти, например:
–tiny – программа и данные в одном сегменте объемом 64 КБ (или 64 Кбайт); применяется только ближняя адресация команд и данных (меняется только смещение – эффективный адрес ЕА);
–small – программа в одном сегменте, данные в другом сегменте размером по 64 КБ каждый; используется ближняя адресация (NEAR) команд и данных;
–medium – программа больше 64 КБ, данные в сегменте 64 КБ; адресация команд дальняя (FAR), данных — ближняя (NEAR);
–compact – обратная по своим характеристикам с medium;
–large – программа и данные больше 64 КБ, дальняя адресация команд и данных, массив данных не превышает 64 КБ;
–huge – программа и данные больше 64 КБ, дальняя адресация команд и данных, массив данных больше 64 КБ.
Наиболее целесообразна модель small, так как в ней все переходы ближние и поэтому программа будет выполняться быстрее. При создании com-файлов применяется модель tiny.
Директива .MODEL указывается в начале программы.
По умолчанию ассемблер генерирует коды для 16-разрядного МП i8086. Если он встретит команду 32-разрядного микропроцессора, то транслятор сгенерирует ошибку, что указывает на другой тип используемого МП. Поэтому необходимо в программе указывать тип МП, например .486 или .586 для МП Pentium.
8. Операции языка ассемблера
1.Операция OFFSET вычисления (возвращения) эффективного адреса операнда, размещенного в памяти.
Например, при трансляции команды MOV BX,OFFSET K данная операция позволяет ассемблеру определить адрес операнда К, размещенного в памяти. После выполнении этой команды значение адреса К, например, равное 500Н, будет загружено в регистр ВХ.
2.Операция присваивания атрибута PTR позволяет совместно с
атрибутом, например, BYTE (байт) или WORD (слово), задать в команде длину операнда в случае неоднозначного понимания его размера без этой операции. Например, команды инкремента байта и слова в памяти, адресуемой с помощью указателя ВХ, с использованием этих атрибутов имеют соответственно вид:
INC |
BYTE PTR [BX] |
;Инкремент байта |
INC |
WORD PTR [BX] |
;и слова памяти |
55
