|
В целях упрощения своей работы программист
умышленно прячет детали реализации.
Примером макро высокого уровня является использование макро,
упрощающих применение мнемоник в ассемблере. Хотя большинство ко-
манд процессора 8086 может использоваться с регистровыми операн-
дами или операндами памяти, многие из них не позволяют непосредс-
твенных операндов. Примером является команда PUSH, хотя 186/188
- 1-22 -
и 286 позволяют проталкивать в стек непосредственные данные.
Довольно просто сконструировать макро pushi (проталкивание не-
посредственное), передающее нужный аргумент в регистр и проталки-
вающее этот регистр. Однако, если макро предназначено для реали-
зации более общей функции проталкивания, желательно, чтобы оно не
только проталкивало непосредственные данные, но и само решало,
является ли такая операция необходимой. Другими словами, програм-
мист хотел бы применять обобщенный pseudoopcode (псевдокод), ра-
ботающий во всех случаях.Реально псевдокод должен быть макро, вы-
числяющим операнды и генерирующим стандартный или расширенный
набор команд.
Первый шаг в написании такого общецелевого макро заключается в
определении операндов. Для решения этой задачи MASM имеет целый
набор специальных операторов.
Определение типов операндов
В среде 8086/8088 существует четыре основных типа операндов.
Это - регистровый операнд, непосредственный операнд, операнд па-
мяти и адреса. Для операндов, ориентированных на данные, возможны
подтипы. Регистры представляют собой специальные случаи суммато-
ров (регистр общего назначения A) и регистры сегментов. Все три
типа данных могут подразделяться на 8- и 16-битовые данные. Адре-
са могут быть near (близкие, состоящие только из смещения) или
far (далекие, состоящие из смещения и сегмента).
Как мы будем различать все эти типы? Мы будем использовать
операторы MASM .TYPE и TYPE.
|