Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать неотразимый комплимент Как противостоять манипуляциям мужчин? Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?

Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Листинг 2.2. Простая процедура сложения





; Секция констант

integer_1 EQU [ВР+6] ; задает адрес первого аргумента

integer_2 EQU [BP+8] ; задает адрес второго аргумента

.MODEL medium ; указываем компилятору, что он должен

; использовать модель памяти MEDIUM

.CODE ; начало кодового сегмента

PUBLIC _Add_Int ; эта функция - общедоступна

_Add_Int PROC FAR ; имя функции и ее тип (дальняя)

push BP ; эти две инструкции инициализируют

; фрейм стека

mov ВР, SP

mov AX,integer_1 ; помещаем первое слагаемое

; в аккумулятор (регистр АХ)

add AX,integer_2 ; добавляем второе, слагаемое

; к содержимому АХ

pop ВР ; ликвидируем фрейм стека

_Add_Int ENDP ; конец процедуры

END ; конец кодового сегмента

Единственное, что мы изменили по сравнению с Листингом 2.1, это добавили несколько строк кода и ввели определения для адресов параметров. Теперь давайте проанализируем то, что у нас получилось.

§ Как и в предыдущем листинге, здесь были использованы директивы ассемблера для указания модели памяти, способа вызова, начала и конца функции;

§ EQU — это простая директива, заменяющая одну строку на другую. Я прибег к ней потому, что мне не хотелось в тексте самой функций использовать синтаксические конструкции [ВР+6] и [BP+8]. Строки, задающие выражения, которые будут подставлены при компиляции, это:

integer_l EQU [ВР+6]

integer_2 EQU [BP+8]

В общем, использование таких подстановок позволяет сделать ассемблерную программу более читабельной. Единственной альтернативой такому подходу является написание команды индексирования относительно содержимого одного из регистров (типа [ВР+6]).

Директива USES

Надо сказать, что ассемблер MASM, начиная с версии 5.1, имеет некоторые новые директивы, упрощающие порядок передачи параметров и создания фрейма стека. Для этого вы можете использовать директиву USES вместе с директивой PROC. Они сообщат ассемблеру, какие именно регистры будут использоваться в функции. Директива USES оберегает вас от всей рутины, связанной с определением стекового фрейма и подстановками переменных. Более того, она генерирует код пролога и эпилога для сохранения регистров, которые вы указали для использования в функциях. Таким образом, содержимое этих регистров не будет изменено, когда процедура вернет управление вызвавшей ее Си-функции.



Внимание!

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

Директива PROC и относящийся к ней уточнитель USES имеет следующий синтаксис.

label PROC [[attributes]] [[USES register_list]] [[,]]

[[parameter list][:type]]...]]

§ Поле label — это имя процедуры;

§ Поле attributes сообщает ассемблеру свойства вашей процедуры. Она может содержать множество параметров, таких как тип процедуры (NEAR или FAR), «видимость» процедуры (PUBLIC или PRIVATE) и, наконец, тип языка (С, PASCAL и т. д.). Эта возможность делает наши программы на ассемблере более читаемыми. Правда, это связывает руки, но зато программы обретают определенную элегантность;

§ Поле register_list показывает, какие регистры будет использовать функция. При этом ассемблер генерирует код, который может сохранить их на время работы процедуры и восстановить при выходе;

§ Поле parameter_list очень похоже на список параметров в Си;

Для каждой передаваемой процедуре переменной должен быть указан тип, определяющий их размер (например, BYTE или WORD). Тип задается в поле type.

Если вы пишите процедуру, в которую передаете три целых величины, и будете использовать регистры SI, DI и СХ, то должны включить следующий оператор:

far proc USES SI DI СХ, integer_1:WORD, integer_2:WORD,

integer_3:WORD

Используя директивы PROC и USES, давайте перепишем процедуру из Листинга 2.2.








Date: 2015-09-18; view: 58; Нарушение авторских прав

mydocx.ru - 2015-2018 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию