Автор работы: Пользователь скрыл имя, 20 Октября 2011 в 18:01, реферат
Основные общие особенности языка ассемблера (чаще не совсем точно называемого просто ассемблером; строго ассемблером называется программа, которая является транслятором. Эта программа переводит последовательность команд с языка ассемблера на язык машинных кодов процессора) микропроцессоров совпадают с особенностями всех языков подобного типа. Отметим их основные особенности
;T1 6,7,8,9 ; исходная макрокоманда превращена в комментарий
??0001 equ 6
MVI A,7+??0001
MVI B,8+??0001
MVI C,9+??0001
Транслятор вместо локального символа S для каждого макрорасширения подставляет свою перемещаемую величину ??0000 и ??0001 , абсолютное значение которой будет определено после компоновки. Вместо формальных параметров p2, p3, p4 подставляются фактические параметры, задаваемые в макрорасширениях.
Пример 3. Макрокоманда с параметром и локальными метками. Внутри тела макрокоманды в зависимости от результата выполнения команды SUI p производятся условные и безусловные переходы. Так как при каждом вызове макрокоманды адреса переходов будут различны (соответствующие метки переходов должны стоять в разных местах), директивой %local метки, обозначающие адреса переходов, объявляются локальными.
DEL | %macro | p |
%local | L1 | |
L1 | SUI | p |
%local | L2 | |
JP | L2 | |
%local | L3 | |
JMP | L3 | |
L2 | INR | C |
JMP | L1 | |
L3 | ||
%endm |
Транслятор вместо использованных в тексте программы двух макровызовов этой макрокоманды
DEL 3
DEL 4
подставит макрорасширения (фрагмент взят из листинга)
??0000 | ;DEL | 3 |
SUI | 3 | |
JP | ??0001 | |
JMP | ??0002 | |
??0001 | INR | C |
JMP | ??0000 | |
??0002 | ||
;DEL | 4 | |
??0003 | SUI | 4 |
JP | ??0004 | |
JMP | ??0005 | |
??0004 | INR | C |
JMP | ??0003 | |
??0005 |
Транслятор вместо
локальных меток L1, L2, L3 для каждого
макрорасширения подставляет
Организация библиотеки макрокоманд
Для того чтобы не включать в каждый исходный текст программ макроопределения, из них можно организовать библиотеку, объединив их в один файл на языке ассемблера. Например, из приведенных выше трех макроопределений можно организовать файл lib.asm, текст которого приведен ниже.
*
тексты макроопределений
UMN3 %macro
MOV C,A
RLC
ADD C
%endm
T1 %macro p1,p2,p3,p4
%local s
s equ p1
MVI A,p2+s
MVI B,p3+s
MVI C,p4+s
%endm
DEL %macro p
%local L1
L1 SUI p
%local 2
JP L2
%local L3
JMP L3
L2 INR C
JMP L1
L3:
%endm
Обратите внимание: этот файл не должен заканчиваться директивой end.
По мере необходимости в файл библиотеки можно добавлять новые макроопределения.
Включить эту библиотеку в исходный текст программы можно с помощью команды препроцессора %include. Например, библиотеку lib.asm можно включить в текст программы следующим образом
* пустая строка
%include lib.asm
ms: MVI C,5
MVI ,1
mi: MVI B,4
MOV A,C
UMN3
UMN3
T1 2,3,4,5
T1 6,7,8,9
DEL 3
DEL 4
mn: MOV a,b
end
Обратите внимание: команда %include не должна располагаться в первой строке программы.
Если в программе не используются какие-либо макрокоманды из включенной библиотеки, транслятор их не будет включать в текст программы.
Основные директивы и команды препроцессора ассемблера
Директивы
Основные директивы уже упоминались в предыдущих разделах. Перечислим их еще раз.
Директива end
Директива не имеет операндов и используется для обозначения конца программы. При ее отсутствии транслятор выдает сообщение об ошибке. Пример ее использование имеется в приведенных текстах программ.
Директивы equ, teq
Директивы используются для присваивания значений символам. Они имеют следующий формат
<символ>] equ <выражение> [; комментарий]
<символ>] teq <выражение> [; комментарий]
Пример
Z equ 5 ; символу z присваивается значение 5
t equ Z+3 ; символу t присваивается значение 8
t1 teq t+t/z ; символу t1 присваивается значение 9
В соответствии
с данными директивами символу,
стоящему в поле метки (в первой позиции)
присваивается результат
Директивы extern, public
Директивы используются
для определения одних и тех
же символов в различных программных
модулях при использовании
extern <список символов>
public <список символов>
Пример
extern z
public k,x1,I
Директива extern z означает, что символ z не определяется в данном программном модуле, а будет определен в другом программном модуле, с которым данный будет объединен при компоновке. Символ, объявленный директивой extern, может быть также определен в командном файле компоновки. Транслятор отложит его вычисление до компоновки.
Директива public k,x1,i означает, что символы k,x1,i , значение которых определяется в данном программном модуле, будут также использованы в других. Транслятор запомнит их значение в выходном объектном модуле для использования при компоновке (в противном случае после присваивания значений транслятор “забывает” символы).
Ниже приведена часть текста программы, в которой используются эти директивы.
extern z
public k,x1,i
x equ 1+2
t equ Z+3
k equ +7
I equ -7
x1 equ 10
x5 equ t+1
Y equ x1*t
X2 equ z*t
X3 equ 5/z
Как видно из
примера программы, неопределенные
символы могут использоваться в
выражениях, однако последнее выражение 5/z вызове
Директивы db, dw, ds
Директивы используются для резервирования ячеек памяти и размещения в памяти констант и начальных значений переменных. Формат директив:
[метка] db <список выражений>
[метка] dw <список выражений>
[метка] ds <список выражений>
Примеры
M1 db 3,4.5.6
M2 db 3*4,5/2
В соответствии с данными директивами при загрузке программы в память в отдельные ее ячейки (в соответствии с размещением директивы в тексте программы) будут записаны величины 3, 4, 5, 6, результаты вычисления выражений 3*4 и 5/2. Метки в этих директивах являются необязательными элементами. Если они присутствуют, то они являются символическими адресами ячеек, в которых размещены константаны. Так М1 будет являться адресом ячейки, где расположена константа 3, а М2 адресом ячейки с константой 3*4.
Директива db размещает в ячейках значения длиной в байт. Директива dw размещает в двух последовательных ячейках слова длиной в 2 байта.
Пример
М3 dw 0AC5Eh
В соответствии с данной директивой в ячейку с символическим адресом М3 будет записано число 0Ach, а в следующую - число 5Eh.
Директива ds резервирует (оставляет пустыми) в памяти для последующего использования при выполнении программы заданное число ячеек.
М3 ds 6
В соответствии с данной директивой в памяти будет зарезервировано 6 ячеек памяти. Первой пустой ячейке будет присвоен символический адрес М3. место резервирования ячеек определяется расположением директивы в программе.
Директива include
Директива используется для включения одного файла в другой. Формат директивы
include <имя файла>
Следует отметить
следующее. Включаемый файл не должен
содержать в конце директиву en
Команды препроцессора
Команды препроцессора
были рассмотрены в подразделе “
Команда %include используется для включения в файл библиотеки макрорасширений.
Команды %macro и %endm определ
Построение простой программы
В качестве "простой" рассмотрим вариант построения программы без использования механизма сегментов и соответствующих директив. Ниже приведен с пояснениями пример подобной программы.
Основная программа test.asm
extern x1,two | ||
%include lib1.asm | ; включение библиотеки макрорасширений | |
z | equ 5 | |
t | equ x1+3 | |
k | equ +7 | |
i | equ - 7 | |
include init.asm | ; включение команд инициализации процессора | |
Begin |
|
|
|
||
|
||
|
||
|
||
|
||
M1 |
|
|
|
||
|
||
|
||
|
||
include stack.asm | ; резервирование памяти для стека | |
end |