ТОП 10:

Макросредства языка ассемблера



3.11.1. Псевдооператоры equ и =

К простейшим макросредствам языка ассемблера можно отнести псевдооператоры equ и "=" (равно). Их мы уже неоднократно использовали при написании программ. Эти псевдооператоры предназначены для присвоения некоторому выражению символического имени или идентификатора. Впоследствии, когда в ходе трансляции этот идентификатор встретится в теле программы, макроассемблер подставит вместо него соответствующее выражение. В качестве выражения могут быть использованы константы, имена меток, символические имена и строки в апострофах. После присвоения этим конструкциям символического имени его можно использовать везде, где требуется размещение данной конструкции.

Синтаксис псевдооператора equ:

имя_идентификатора equ строка или числовое_выражение

Синтаксис псевдооператора “=”:

имя_идентификатора = числовое_выражение

 

Несмотря на внешнее и функциональное сходство псевдооператоры equ и “=” отличаются следующим:

- из синтаксического описания видно, что с помощью equ идентификатору можно ставить в соответствие, как числовые выражения, так и текстовые строки, а псевдооператор “=” может использоваться только с числовыми выражениями;

- идентификаторы, определенные с помощью “=”, можно переопределять в исходном тексте программы, а определенные с использованием equ – нельзя.

Ассемблер всегда пытается вычислить значение строки, воспринимая ее как выражение. Для того, чтобы строка воспринималась именно как текстовая, необходимо заключить ее в угловые скобки: <строка>.
Кстати сказать, угловые скобки являются оператором ассемблера, с помощью которого транслятору сообщается, что заключенная в них строка должна трактоваться как текст, даже если в нее входят служебные слова ассемблера или операторы. Хотя в режиме Ideal это не обязательно, так как строка для equ в нем всегда трактуется как текстовая.

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

Псевдооператор “=” удобно использовать для определения простых абсолютных (то есть независящих от места загрузки программы в память) математических выражений. Главное условие то, чтобы транслятор мог вычислить эти выражения во время трансляции.

 

Макрокоманды

Идейно макрокоманда представляет собой дальнейшее развитие механизма замены текста. С помощью макрокоманд в текст программы можно вставлять последовательности строк (которые логически могут быть данными или командами) и даже более того – привязывать их к контексту места вставки.

Макрокоманда представляет собой строку, содержащую некоторое символическое имя – имя макрокоманды, предназначенное для того, чтобы быть замещенной одной или несколькими другими строками. Имя макрокоманды может сопровождаться параметрами.

Обычно программист сам чувствует момент, когда ему нужно использовать макрокоманды в своей программе. Если такая необходимость возникает, и нет готового ранее разработанного варианта нужной макрокоманды, то вначале необходимо задать ее шаблон-описание, который называют макроопределением.

Синтаксис макроопределения следующий:

имя_макрокоманды macro список_аргументов

тело макроопределения

Endm

 

Есть три варианта размещения макроопределения:

- В начале исходного текста программы до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы.
Этот вариант следует применять в случаях, если определяемые вами макрокоманды актуальны только в пределах одной этой программы.

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

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

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

 

 

Задание на выполнение

 

Данная работа рассчитана на 2 лабораторные работы (8 часов). Выполните задания в соответствии с вашим вариантом. И подготовиться к ответам на теоретическую часть лабораторной работы.

Вариант 1

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=А+В.

2. Установить все четные биты С.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать процедуру для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через регистры

8. Используйте стандартные директивы сегментации и формат exe-программы.

 

Вариант 2

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=А+В.

2. Обнулить все нечетные биты С.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать макрос для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через стек

8. Используйте упрощенные директивы сегментации и формат exe-программы.

 

Вариант 3

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=А+В*2.

2. Если третий бит числа С установлен, то вывести на экран С в двоичном виде, в противном случае, вывести на экран С/2 в двоичном виде.

3. Написать макрос для вывода результата

4. Написать процедуру для ввода чисел

5. Написать макрос для расчета

6. Передача параметров через стек

7. Используйте стандартные директивы сегментации и формат сом-программы.

 

Вариант 4

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=А/2+В.

2. Установить все нечетные биты С.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать макрос для вывода результата

5. Написать макрос для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через стек

8. Используйте упрощенные директивы сегментации и формат сом-программы.

 

 

Вариант 5

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=(А+В)/4.

2. Сбросить пятый бит числа С, если он установлен.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать процедуру для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через стек

8. Используйте стандартные директивы сегментации и формат exe-программы.

 

Вариант 6

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=(А-В)*4.

2. Выполнить циклический сдвиг полученного числа С на 3 бита вправо.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать макрос для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через стек

8. Используйте упрощенные директивы сегментации и формат exe-программы.

 

Вариант 7

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=А/2+В.

2. Выполнить арифметический сдвиг С на 3 бит влево.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать макрос для вывода результата

5. Написать процедуру для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через стек

8. Используйте стандартные директивы сегментации и формат сом-программы.

 

Вариант 8

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=А+В*2.

2. Обнулить все четные биты С.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать процедуру для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через стек

8. Используйте упрощенные директивы сегментации и формат сом-программы.

 

Вариант 9

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=А+(В-5h)*2.

2. Если установлен четвертый бит числа С то вывести на экран А в десятичном виде, в противном случае вывести на экран число В в десятичном виде.

3. Написать макрос для вывода результата

4. Написать макрос для ввода чисел

5. Написать макрос для расчета

6. Передача параметров через общую память

7. Используйте стандартные директивы сегментации и формат exe-программы.

 

 

Вариант 10

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=(А+12h)/2+В.

2. Обнулить все четные биты С.

3. Вывести на экран число С и все промежуточные результаты в двоичном виде.

4. Написать процедуру для вывода результата

5. Написать макрос для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через общую память

8. Используйте упрощенные директивы сегментации и формат exe-программы.

 

Вариант 11

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=(А-14h)*4-В.

2. Установить все четные биты С.

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

4. Написать макрос для вывода результата

5. Написать процедуру для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через общую память

8. Используйте стандартные директивы сегментации и формат сом-программы.

 

Вариант 12

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=А*В-4.

2. Если третий и пятый бит числа С установлены, вывести на экран А в двоичном виде, если третий и пятый бит числа С сброшены, вывести на экран В в двоичном виде, в других случаях вывести на экран число С в двоичном виде.

3. Написать макрос для вывода результата

4. Написать макрос для ввода чисел

5. Написать процедуру для расчета

6. Передача параметров через общую память

7. Используйте упрощенные директивы сегментации и формат сом-программы.

 

Вариант 13

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=(А+В)/4-16.

2. Если третий и пятый бит числа С установлены, вывести на экран А в двоичном виде, если третий и пятый бит числа С сброшены, вывести на экран В в двоичном виде, в других случаях вывести на экран число С в двоичном виде.

3. Написать процедуру для вывода результата

4. Написать процедуру для ввода чисел

5. Написать макрос для расчета

6. Передача параметров через общую память

7. Используйте стандартные директивы сегментации и формат exe-программы.

 

Вариант 14

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=(А-В)*2+1Ah.

2. Вывести на экран 1 если шестой бит числа С установлен и 0 в противном случае.

3. Написать макрос для вывода результата

4. Написать процедуру для ввода чисел

5. Написать процедуру для расчета

6. Передача параметров через общую память

7. Используйте упрощенные директивы сегментации и формат exe-программы.

 

Вариант 15

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=(А-14h)*4-В.

2. Сбросить третий бит числа С, если он установлен.

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

4. Написать процедуру для вывода результата

5. Написать макрос для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через общую память

8. Используйте стандартные директивы сегментации и формат сом-программы.

 

Вариант 16

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=А+4*В.

2. Выполнить циклический сдвиг числа С на 3 бита вправо.

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

4. Написать процедуру для вывода результата

5. Написать процедуру для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через общую память

8. Используйте упрощенные директивы сегментации и формат сом-программы.

 

Вариант 17

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=A*3+B*2.

2. Выполнить арифметический сдвиг числа С на 2 бита вправо.

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

4. Написать макрос для вывода результата

5. Написать макрос для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через регистры

8. Используйте стандартные директивы сегментации и формат exe-программы.

 

Вариант 18

Пользователь вводит два числа А и В в десятичном виде. Программа должна:

1. Посчитать С=A*3+B*2.

2. Выполнить арифметический сдвиг числа С на 2 бита вправо.

3. Вывести на экран число С и все промежуточные результаты в шестнадцатеричном виде.

4. Написать процедуру для вывода результата

5. Написать макрос для ввода чисел

6. Написать макрос для расчета

7. Передача параметров через регистры

8. Используйте упрощенные директивы сегментации и формат exe-программы.

 

Вариант 19

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=А*В-4.

2. Если третий и пятый бит числа С установлены, вывести на экран А в десятичном виде, если третий и пятый бит числа С сброшены, вывести на экран В в десятичном виде, в других случаях вывести на экран число С в десятичном виде.

3. Написать макрос для вывода результата

4. Написать процедуру для ввода чисел

5. Написать макрос для расчета

6. Передача параметров через регистры

7. Используйте стандартные директивы сегментации и формат сом-программы.

 

Вариант 20

Пользователь вводит два числа А и В в шестнадцатеричном виде. Программа должна:

1. Посчитать С=(А+17h)/2+В.

2. Обнулить все четные биты С.

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

4. Написать макрос для вывода результата

5. Написать макрос для ввода чисел

6. Написать процедуру для расчета

7. Передача параметров через регистры

8. Используйте упрощенные директивы сегментации и формат сом-программы.


 

 

СПИСОК ЛИТЕРАТУРЫ

1. Гриценко Ю. Б. Операционные системы: учебное пособие для вузов / Томск: ТУСУР, 2004. - 243[1] с.

2. Гриценко Ю. Б. Операционные среды, системы и оболочки: учебное пособие / Томск: ТУСУР, 2005. - 281 с.

3. Гордеев А.В. Операционные системы: Учебник для вузов / СПб.: Питер, 2004. - 415[1] с.

4. Робачевский А. М.. Операционная система UNIX: Учебное пособие для вузов / СПб.: BHV – Санкт-Петербург, 2002. – 514с.

5. Юров В. Assembler / СПб.: Питер, 2001. – 624с. ил.

 


[1] Синтаксис представлен для ОС Windows XP построенной на базе технологии NT, в ОС MS-DOS и Windows 9x количество аргументов и команд несколько меньше.

[2] CHOICE — это внешняя команда.

[3] Для адаптивного планирования — текущий и начальный приоритеты.

[4] Квадратные скобки означают не обязательные параметры

[5] За исключением модели памяти TINY при использовании упрощенных директив сегментации.







Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 35.168.112.145 (0.019 с.)