Дипломированных специалистов «Информатика и вычислительная техника»


 Глава Модульное программирование Листинг



Download 12,06 Mb.
Pdf ko'rish
bet202/357
Sana22.02.2022
Hajmi12,06 Mb.
#115195
TuriДиплом
1   ...   198   199   200   201   202   203   204   205   ...   357
Bog'liq
assembler uchebnik dlya vuzov 2-e izd YuRXUW1

356 Глава
Модульное программирование
Листинг
Вызывающая программа на Pascal
program
external;
var
как
Листинг
Вызываемая процедура на ассемблере
MODEL
data segment word public
данных
;объявление внешних переменных
extrn
extrn
data
сегмента данных
assume
ds к сегменту
программы на Pascal
main:
procnear
PUBLIC AddAsm ;внешняя
mov
value2B dx
add
mov
;результат в ах, так как - слово
ret ;возврат из функции
AddAsm endp
функции
end
программы
В последней программе следует обратить внимание еще на одну возможность
доступа к разделяемым данным — с помощью сегментов типа PUBLIC (см. главу 5).
Совместное использование сегментов данных стало возможным благодаря тому,
что компилятор Pascal создает внутреннее представление программы в виде сег-
ментов, как и положено программе, выполняющейся в архитектруре IA-32 на
процессоре Intel. Сегмент данных в этом представлении тоже имеет название
data, и директива SEGMENT для него со всеми вытекающими последствиями
выглядит так:
data segment word p u b l i c
Команды ENTER и LEAVE
Учитывая важность проблемы организации межмодульных связей, в систему ко-
манд процессора были введены специальные команды ENTER и LEAVE. Их использо-
вание позволяет облегчить написание кода пролога и эпилога в процедурах ассем-
блера, например:


Связь ассемблера с языками высокого уровня 357
код пролога:
push bp
код
enter
код эпилога:
mov
pop bp
код эпилога:
leave
Транслятор ассемблера предоставляет средства в виде директив, которые еще-
больше упрощают работу программиста по формированию кодов пролога и эпи-
лога. Одной из них является директива
Применение этой и других директив
обсудим на конкретном примере. В главе
рассматриваются довольно сложные
программы, в которых, в частности, используются обсуждаемые здесь директивы.
В листинге 16.7 производится обращение к процедуре WindowProc. При этом ей в сте-
ке передается ряд параметров. Кроме того, в процедуре имеются локальные пере-
менные. Заголовок и конец процедуры выглядят следующим образом:
uses
регистры обязательно должны сохраняться
WindowProc endp
В этом фрагменте новыми средствами ассемблера для нас являются директивы
USES и LOCAL.
Директива USES содержит список регистров (см. рис. 10.3 в главе 10). Ее исполь-
зование заставляет транслятор генерировать код для сохранения в стеке этих ре-
гистров при входе в процедуру и их восстановления при выходе из нее.
Директива LOCAL (см. рис. 10.3) позволяет задействовать в процедуре локаль-
ные переменные. Эти переменные должны быть перечислены в списке аргументов
вместе с их типами. Информацию о количестве и типах переменных транслятор
использует для формирования соответствующего программного кода.
Оттранслируем исходный текст программы из листинга
и откроем для про-
смотра файл
Посмотрим на результат применения этих директив:
0000012D WindowProc proc
arg
uses
local
0000012D C8 000C 00 ENTERD 0000Ch,0
00000131 53 PUSH ebx
00000132 57 PUSH edi
00000133 56 PUSH
00000134 83 7D 0C 02
000002CF
000002CF 5E POP esi
000002D0 5F POP edi
000002D1 5B POP ebx
000002D2 C9 LEAVED


358 Глава 15. Модульное программирование
000002D3
RET
endp
Видно, что транслятор хорошо «поработал» над кодами входа в процедуру и вы-
хода из нее. Директива USES ebx,
esi заставляет транслятор генерировать
манды PUSH и POP для сохранения-восстановления регистров EBX, EDI и ESI. А какое
влияние на формирование кода входа в процедуру и выхода из нее оказывают ди-
рективы ARG и LOCAL? Чтобы разобраться с этим, выполним трансляцию трех
вариантов программы из листинга 16.7 (глава 16), в каждом из которых закоммен-
тируем определенные строки:
в Закомментируем строку с директивой ARG. Фрагмент листинга будет выгля-
деть следующим образом:
.
proc
uses
регистры обязательно должны сохраняться
0000012D C8 000C 00 ENTERD
00000131 53 PUSH ebx
00000132 57 PUSH edi
00000133 56 PUSH esi
00000134 83 3D 00000000 02 cmp
000002F9exi
000002F9 5E POP esi
000002FA 5F POP edi
000002FB
POP ebx
000002FC C9 LEAVED
000002FD C3 RET
endp
Закомментируем строки с директивами LOCAL и USES. Фрагмент листинга будет
выглядеть так:
Wi
proc
arg
;uses
;эти регистры обязательно должны сохраняться
0000012D C8 0000 00 ENTERD 00000h,0
00000131 83 7D0C 02 cmp
000002E6 C9 LEAVED
000002E7 C2 0010 RET
endp
Наконец, закомментируем строки с директивами LOCAL и ARG. Фрагмент лис-
тинга:
0000012DWindowProc proc
DWORD, @@l
DWORD
uses
;эти регистры обязательно должны сохраняться
0000012D 53 PUSH ebx
0000012E 7 PUSH edi
0000012F 56 PUSH esi
00000130 83 3D 00000000 02 cmp
PROCBEG(4) Argument needs
override


Связь ассемблера с языками высокого уровня 359
5Е POP esi
00000310 5F POP edi
00000311 5B POP ebx
00000312 C3 RET
Проанализируем эти фрагменты.
Применение директив ARG и LOCAL приводит к генерации команд ENTER и LEAVE
при входе и выходе из процедуры. Поочередное комментирование этих директив
показывает, что они влияют только на формирование операнда команды ENTER.
При использовании директивы LOCAL он равен числу байтов, необходимых для раз-
мещения в стеке локальных переменных. Это так называемый кадр стека. Если
строку с директивой LOCAL закомментировать, то команда ENTER все равно форми-
руется, но с нулевым значением первого операнда. Это говорит о том, что пролог
процедуры создается в любом случае, но директива LOCAL позволяет еще и сфор-
мировать кадр стека для хранения локальных переменных процедуры. Соответ-
ственно, во всех вариантах генерации команды ENTER в конце процедуры форми-
руется команда LEAVE.
Теперь посмотрим на то, какое влияние оказывает директива ARG на формиро-
вание команды RET в процедуре
Из анализа четырех приведенных ра-
нее вариантов фрагмента листинга видно, что в некоторых из них транслятор вы-
числяет суммарный размер аргументов, передаваемых в процедуру, и делает это
значение операндом команды RET. Это производится в тех случаях, когда директи-
ва ARG не закомментирована. Отсюда следует вывод о прямом влиянии директивы
ARG на операнд команды RET. Ненулевое значение операнда команды RET приводит
к изменению значения регистра SP\ESP — в нашем случае это означает очистку сте-
ка от аргументов, переданных в процедуру.
Отметим, что эти средства можно использовать не только для связи
ассемблер, но и для организации других межъязыковых связей, в том числе ассем-

Download 12,06 Mb.

Do'stlaringiz bilan baham:
1   ...   198   199   200   201   202   203   204   205   ...   357




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish