Программирование на Ассемблере


Особенности использования внешних функций


     Внешняя функция транслируется отдельно  от  вызывающей программы. Это позволяет не транслировать каждый раз модули, в которых не было изменений. Упрощается изолированная от всей системы отладка отдельных модулей, что допускает участие в разработке системы группы программистов. Не следует заботиться  о  локальных именах программы, например метках, которые  могут  совпадать для различных модулей. И,  наконец,  появляется  возможность стыковки разноязыковых модулей.

    Чтобы объединить несколько  модулей  (эту  функцию  выполняет компоновщик) в одну программу, необходима специальная  информация для вызывающей и вызываемой программ. Рассмотрим эту информацию.

            В Ы З Ы В А Ю Щ А Я   П Р О Г Р А М М А .

    1.  Необходимо знать, что вызываемый модуль является внешним. Для задания этого этого используется директива:

             extrn  имя функции :  proc

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

    2.  Если вызывающая программа резервирует память под  данные, которые должны использоваться в функции,  адреса  этих данных должны быть определены как адреса типа public,  т.е.  доступные(известные)  другим сегментам.

    Общий вид директивы public:

                    public  имя1, имя2, ....

    Директива public, если она необходима, задается в том сегменте, где определено  это  имя.  Директиву  можно  использовать  не только для переменных, но и для меток.

            В Ы З Ы В А Е М А Я    П Р О Г Р А М М А

     1. Имя функции должно  быть  задано  в  директиве public

                 public  имя_ функции



     2. Если функция использует данные, память под которые выделена в  другой  программе,  то  в  этой  программе  используется директива

              extrn  определение1, определение2,...

     Общий вид определения для передаваемых данных:

                  имя : тип : количество ,

где

     имя - имя данного, память под которое выделена в другом  модуле;


аааааааааааааааа ; ¦хрышчрЎш  рыуюЁшЄьр
аааааааааааааааа ; TюёёЄрэютыхэшх шёяюы№чєхьvї ЁхушёЄЁют
аааааааааааааааааааааааа .........
ааааааааааааааааааааааааааа ret
ааааааааааааааааа шь а endp
аааааааааааааааааааааа end
аааа T ЇєэъЎшш, т юЄышўшх юЄ уыртэющ яЁюуЁрььv, т фшЁхъЄштх end рфЁхё Єюўъш тїюфр эх чрфрхЄё .
аааа +с•шщ тшф тvчvтр¦•хщ яЁюуЁрььv :
аааааааааааааааа .MODELа шь 
ааааааааааааааааааааааа ......
аааааааааааааааа extrnа шь _яЁюЎ : proc
ааааааааааааааааааааааа ......
аааааааааааааааа .CODE
аааааааа begin:
аааааааааааааааааааааааа .......
ааааааааааааааааа endа begin
ааа -шЁхъЄштv public ш extrn т ¤Єшї яЁюуЁрььрї ьюцэю чрьхэшЄ№ фшЁхъЄштющ global шь _яЁюЎ:proc. =ю ьv тёх-Єръш Ёхъюьхэфєхь трь шёяюы№чютрЄ№ фшЁхъЄштv public ш extrn,а Є.ъ.а юэша яючтюы ¦Єа сюыхх уыєсюъю шчєўшЄ№ ьхїрэшчь ёт чш ьюфєыхщ. Lьхээю ¤Єш фшЁхъЄштv эршсюыхх ўрёЄю шёяюы№чє¦Єё  т юяєсышъютрээvї яЁюуЁрььрї. ¦юёых Єюую, ъръ тv єтхЁхээю яюўєтёЄтєхЄх ёхс  т шёяюы№чютрэшш ¤Єшїа фшЁхъЄшт, ьюцэю шї чрьхэшЄ№ фшЁхъЄштющ global.
аааа -ы  ёючфрэш  шёяюыэ хьющ яЁюуЁрььvа шча эхёъюы№ъшїа ьюфєыхщ, тvяюыэ хЄё  Ёрчфхы№эр  ЄЁрэёы Ўш  фы  ърцфюую ьюфєы :
ааааааааааааааааа Tasm32 ./ml /ziа шь _ьюфєы 1
ааааааааааааааааа Tasm32 /ml /ziа шь _ьюфєы 2
ааааааааааааааааа ...
ш ъюьяюэютър тёхї ьюфєыхщ тьхёЄх:
ааааааааааааааааа tlink32 /v шь _ьюфєы 1 шь _ьюфєы 2 ....import32.lib
аааа -ы  ЇюЁьшЁютрэш  юЄырфюўэющ шэЇюЁьрЎшша шёяюы№чє¦Єё а Єха цх ъы¦ўш, ўЄю ш фы  юфэюьюфєы№эvї яЁюуЁрьь.
аааа ¦ЁшьхЁv ёюёЄртыхэш  ш шёяюы№чютрэш  тэх°эшїа ЇєэъЎшщ.
аааа ¦ЁшьхЁ 1. TюёЄртшЄ№ тэх°э¦¦ ЇєэъЎш¦ фы  тvўшёыхэш а z=x+y.
¦рЁрьхЄЁv яхЁхфртрЄ№ ўхЁхч ёЄхъ.
;Tэх°э   ЇєэъЎш  фы  тvўшёыхэш  z=x+y. ¦рЁрьхЄЁv
;ааааааааааааааа яхЁхфр¦Єё  ўхЁхч ёЄхъ.
;+ыртэр  яЁюуЁрььр
; Їрщы main.asm
ideal
p686
model flat
extrn ExitProcess:proc
extrn Summa:proc
dataseg
xааааааааа ddааааааа 5
yааааааааа ddааааааа 3
zаааааааааа ddааааааа ?
codeseg
begin:
pushаааа [x] [y]
callааааа Summa
movаааа [z], eax
call ExitProcess
end begin
; Lрщы PROC.asm
ideal
p586
modelаа flat
codeseg
procа _Summa
public _Summa
arg x:dword, y:dword
pushаааа ebp
movаааа ebp, esp
MOVаа EAX, [x]
addааааа eax, [y]
popааааа ebp
retааааааа
endp
end
аааа -ы  ЄЁрэёы Ўшш ¤Єшї Їрщыют шёяюы№чє¦Єё  ъюьрэфv
аааааааааааааааааааааааа Tasm32 /zi /mlа main
аааааааааааааааааааааааа Tasm32 /zi /mlа proc
аааааааааааааааааааааааа Tlink32 /vа main proc import32.lib,
т Ёхчєы№ЄрЄх тvяюыэхэш  ъюЄюЁvї яюыєўшь Їрщы main.exe.

Содержание раздела