Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety2.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
245 Кб
Скачать
☆

5) Программирование на ассемблере.

Существует два режима работы ассемблера: masm и IDEAL. Назначение режима masm– обеспечить полную совместимость с транслятором MASM фирмы Microsoft. Назначение режима IDEAL– упростить синтаксис конструкций языка, повысить эффективность и скорость работы транслятора и создаваемых программ.

Формат команд языка ассемблера следующий:

[метка] команда [операнд(ы)]

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

Примеры команд:

Метка

Команда

Операнды

Комментарии

count

db

1

mov

ax,4C00h

;команда с двумя операндами

m1:

inc

cx

;команда с одним операндом

cli

;команда без операндов

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

Основные команды ассемблера

В языке ассемблера существует около сотни команд. Но для того, чтобы начать изучать программирование на этом языке достаточно и одного десятка. На этом лабораторном занятии мы познакомимся только с тремя командами ассемблера.

- Команда MOV пересылает байт или слово из источника в переменную или регистр назначения.

Формат команды: mov<назначение>, <источник>

Например, команда mov ax, 1003hозначает пересылку слова 0x1003 в регистрax.

- Команда XOR выполняет операцию логического исключающего ИЛИ над переменной, или регистром "назначения" с помощью операнда "источник".

Формат команды: xor<назначение>, <источник>

Например, команда ассемблера xori, 3 является аналогом оператора языка Сиi=i^3.

- Команда INT вызывает прерывание (сервисную процедуру DOS или BIOS).

Формат команды: int<номер прерывания>

Например, команда int10hвызывает сервисную процедуру BIOS номер 0x10.

Директивы

Ассемблер имеет ряд операторов, которые позволяют управлять процессом ассемблирования. Эти операторы называются директивами. Они действуют только в процессе ассемблирования программы и не генерируют машинных кодов. Рассмотрим основные директивы.

Директивы резервирования и инициализации данных:

Имя

Длина

Применение

db

1 байт

целые знаковые и беззнаковые числа

символьные строки, длина которых определяется длиной строки, указанной в кавычках

dw

2 байта

целые знаковые и беззнаковые числа

смещение в сегменте

адрес сегмента

dd

4 байта

целые знаковые и беззнаковые числа

адрес, включающий сегмент и смещение в сегменте

Директивы определения сегмента:

Формат директивы

Назначение

.CODE [имя]

Начало сегмента кода

.DATA

Начало сегмента инициализированных данных.

.CONST

Начало сегмента постоянных данных (констант) модуля

.STACK [размер]

Начало сегмента стека модуля. Параметр [размер] задает размер стека

6) Предложения языка ассемблера описывают команды или псевдокоманды (директивы). Предложения-команды задают машинные команды ВС. Обработка ассемблером команды приводит к генерации машинного кода. Обработка псевдокоманды к непосредственной генерации кода не приводит, т.к. псевдокоманда управляет работой самого ассемблера. Для одной и той же аппаратной архитектуры могут быть построена разные ассемблеры, в которых команды будут обязательно одинаковые, а псевдокоманды могут быть разные. Во всех языках ассемблера каждое новое предложение языка начинается с новой строки и, как правило, занимает одну строку, хотя обычно допускается продолжение на следующей строке или строках. Формат записи предложений языка может быть жесткий или свободный. При записи в жестком формате составляющие предложения должны располагаться в фиксированных позициях строки. Свободный формат допускает любое количество пробелов между составляющими предложения. 

Предложения языка ассемблера состоят из следующих компонентов:

- метка (имя) – является необязательным компонентом и не во всех языках ассемблера эти понятия различаются. Если они различаются (MASM), то метка – это точка программы, на которую передается управление. Следовательно, метка стоит в предложении, содержащем команду. Имя – это имя переменной программы, то есть ячейки памяти. Следовательно, имя стоит в предложении, содержащем псевдокоманду. Метка и имя отличаются синтаксически. В masm и tasm после метки ставится: а после имени нет. Физический смысл одинаков – это адрес памяти. Во всех случаях, когда ассемблер встречает в программе имя или метку, он заменяет её на адрес той ячейки памяти, которую метка или имя именует.

В некоторых ассемблерах (HLAM) не делается различия между меткой и именем.

- Мнемоника– это символическое обозначение команды или псевдокоманды.

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

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

7) Алгоритм языка Ассемблер. Ассемблер просматривает исходный программный модуль один или несколько раз. Наиболее распространенными являются двухпроходные Ассемблеры, выполняющие два просмотра исходного модуля. На первом проходе Ассемблер формирует таблицу символов модуля, а на втором - генерирует код программы.

8) Двухпроходный Ассемблер - 1-й проход

Алгоритм работы 1-го прохода двухпроходного Ассемблера:

1. Начало 1-го прохода ассемблирования.

2. Начальные установки:

установка в 0 счетчика адреса PC;

создание пустой таблицы символов;

создание пустой таблицы литералов;

открытие файла исходного модуля;

установка в FASLE признака окончания.

3. Признак окончания TRUE?

4. Считывание следующей строки исходного модуля. Добавка к счетчику адреса устанавливается равной 0.

5. При считывании был обнаружен конец файла?

6. Если конец файла обнаружен до того, как обработана директива END, - ошибка (преждевременный конец файла), при этом также устанавливается признак окончания обработки.

7. Лексический разбор оператора программы. При этом:

выделяется метка/имя, если она есть;

выделяется мнемоника операции;

выделяется поле операндов;

удаляются комментарии в операторе;

распознается строка, содержащая только комментарий.

8. Строка содержит только комментарий? В этом случае обработка оператора не производится.

9. Мнемоника операции ищется в таблице директив.

10. Завершился ли поиск в таблице директив успешно?

11. Если мнемоника была найдена в таблице директив, происходит ветвление, в зависимости от того, какая директива была опознана.

12. Обработка директив типа DD (определения данных) включает в себя:

выделение элементов списка операндов (одной директивой DD может определяться несколько объектов данных);

определение типа и, следовательно, размера объекта данных, заданного операндом;

обработка для каждого операнда возможного коэффициента повторения.

13. Добавка к счетчику адреса устанавливается равной суммарному размеру объектов данных, определяемых директивой.

14. Обработка директив типа BSS подобна обработке директив типа DD.

15. Добавка к счетчику адреса устанавливается равной суммарному объему памяти, резервируемому директивой.

16. Обработка директивы END состоит в установке в TRUE признака окончания обработки.

17. Обработка директивы включает в себя вычисление значения имени и занесение его в таблицу символов.

18. Обработка прочих директив ведется по индивидуальным для каждой директивы алгоритмам. Существенно, что никакие директивы, кроме DD и BSS, не изменяют нулевого значения добавки к счетчику адреса.

19. Если мнемоника операции не найдена в таблице директив, она ищется в таблице команд.

20. Завершился ли поиск в таблице команд успешно?

21. Если мнемоника не была найдена в таблице команд, - ошибка (неправильная мнемоника).

22. Если мнемоника найдена в таблице команд - определение длины команды, она же будет добавкой к счетчику адреса.

23. Есть ли в операторе литерал?

24. Занесение литерала в таблицу литералов (если его еще нет в таблице).

25. Была ли в операторе метка?

26. Поиск имени в таблице символов.

27. Имя в таблице символов найдено?

28. Если имя найдено в таблице символов - ошибка (повторяющееся имя). Если имя не найдено в таблице символов - занесение имени в таблицу символов.

29. Формирование и печать строки листинга.

30. Модификация счетчика адреса вычисленной добавкой к счетчику

31. Печать строки листинга и переход к чтению следующего оператора.

32. При окончании обработки - закрытие файла исходного модуля.

33. Были ли ошибки на 1-ом проходе ассемблирования?

34. Формирование литерального пула

35. Выполнение 2-го прохода ассемблирования.

36. Конец работы Ассемблера.

9) Директивы Соответственно, в языке ассемблера существует 5 директив для определения данных:

DB (define byte) – определяет переменную размером в 1 байт;

DW (define word) – определяет переменную размеров в 2 байта (слово);

DD (define double word) – определяет переменную размером в 4 байта (двойное слово);

DQ (define quad word) – определяет переменную размером в 8 байт (учетверённое слово);

DT (define ten bytes) – определяет переменную размером в 10 байт.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]