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



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

С и ассемблер
Общие принципы организации связи
напоминают только что рас-
смотренное соединение Pascal и ассемблера. Поэтому мы коротко обсудим разли-
чия на примере конкретных программ. Но прежде отметим, что хотя язык C++
предоставляет дополнительные возможности связи программы с ассемблером, од-
новременно в нем продолжает поддерживаться традиционная организация связи.
Поэтому мы рассмотрим связь с ассемблером в стиле С как стандартную. При необ-
ходимости читатель, зная основы подобной связи, без труда разберется с нюанса-
ми дополнительных возможностей связи в стиле C++.
Нас по-прежнему интересуют три вопроса: как передать аргументы в
ру на ассемблере, как к ним обратиться в процедуре на ассемблере и как возвра-
тить результат?
Вначале отметим, что всегда нужно сохранять (и перед выходом из процедуры
восстанавливать) содержимое регистров ВР, SP, CS, DS и SS. Это делается перед вы-
зовом процедуры. Остальные регистры нужно сохранять по необходимости, но, на


360 Глава
Модульное программирование
мой взгляд, хорошим тоном является сохранение и последующее восстановление
всех регистров, которые подвергаются изменению внутри процедуры.
Передача аргументов в процедуру на ассемблере из программы на С осуществ-
ляется также через стек, но порядок их размещения в стеке является обратным
рассмотренному ранее для связи
В качестве примера использу-
ем ту же задачу. После передачи управления ближнего типа процедуре на ассемб-
лере стек должен выглядеть так, как показано на рис.
 а.
Оперативная память
Оперативная память
Оперативная память 0000:0000 Г
ss:sp
<
ss:sp
ip
kol
У
х
ch
Дно стека
+4
+6
+8
+10
kol
У
X
ch
Дно стека
Старшие адреса
оперативной памяти
а
Рис.
Изменение содержимого стека при передаче управления в связке
Старшие адреса
оперативной памяти
б
Старшие адреса
оперативной памяти
в
Процедуры на ассемблере получают доступ к аргументам, переданным в стеке,
посредством регистра Р. Принцип доступа тот же, что и рассмотренный ранее
(рис. 15.3, б). Прежде всего в начало процедуры ассемблера необходимо вставить
код пролога:
push bp
После этого доступ к аргументам в стеке осуществляется по смещению относи-
тельно содержимого
например:
переписать значение ch
из стека в ах
значение х - в регистр
При организации связи
можно использовать также директиву ARG.
Это избавит нас от необходимости подсчитывать смещения в стеке для
к аргументам и позволит обращаться к ним просто по именам:
arg
push bp
mov
mov
mov
переписать значение ch
из стека в ах
значение х — в регистр
Чтобы не повторяться, рассмотрим, как изменятся вызываемый и вызывающий
модули (листинги 15.19 и 15.20) для связи
по сравнению с листин-
гами 15.17 и 15.18.


Связь ассемблера с языками высокого уровня
Листинг
Вызывающий модуль на C++
#include

extern
void
unsigned x,
unsigned
void main (void)
{
9, 2, 7) ;
Листинг
Вызываемая процедура на ассемблере
MODEL
памяти и тип кода
STACK 256
PUBLIC
подчеркивания обязателен
main:
mov
mov
mov
int
mov
mov
mov
xor
mov
int
ret
dh,
dl,
10h
ah,
al,
10h
end
main
proc
У
X
02h
09h
kol
07h
bh
с
С near
;у-координата символа в
символа в
службы BIOS
прерывания BIOS
службы BIOS
,y:BYTE.kol:WORD
dh
dl
- количество "выводов" в сх
;маска вывода в Ы
- символ в al
прерывания BIOS
из процедуры
Что касается передачи аргументов в связке
то здесь, как
все довольно прозрачно. В листинге 15.20 мы используем директиву MODEL с опе-
рандом С и директиву PROC с указанием языка С. Этим мы доверяем компилятору
самому сформировать коды пролога и эпилога, а также организовать обращение
к переменным в стеке по их именам. Но при использовании конкретных программ-
ных средств организация такой связи выглядит намного проблематичней. Не
в последнюю очередь это связано с тем, что компиляторы языков C/C++ разраба-
тываются множеством фирм — в отличие от Pascal, компилятор для которого вы-
пускает практически одна фирма Borland. Это обстоятельство, на мой взгляд, —
основная причина сложности связи
так как каждая фирма реализу-
ет ее по-своему (хотя суть и остается практически неизменной). Поэтому, как мне
кажется, нет смысла рассматривать множество частных случаев, тем более что это
не является целью данной книги. Обращайтесь к документации на ваш компиля-
тор C/C++. Во избежание излишних сложностей, по возможности применяйте ас-
семблерные вставки в программах на C/C++.
Как правило, компиляторы позволяют связывать модули на C/C++ и ассемб-
лере с использованием средств командной строки. Так как этот процесс довольно
хорошо стандартизован, есть смысл его рассмотреть. В качестве примера выберем
компилятор
фирмы Inprise (Borland). Типовая последовательность шагов
выглядит примерно так.


362 Глава
Модульное программирование
1. Составить текст программы на C++ (см. листинг 15.19). В этой программе объ-
явить процедуру asmproc внешней:
extern void
unsigned x,
unsigned y, unsigned
2. Выполнить трансляцию модуля C++ и получить объектный модуль:
Ьсс -с
Параметр -с здесь означает, что выполняется только компиляция исходного
файла, загрузочный модуль не создается. Результатом этого шага будет созда-
ние объектного модуля
3. Составить текст процедуры на ассемблере (см. листинг
в которой объ-
явить процедуру asmproc общедоступной с помощью директивы PUBLIC. Заметьте,
что идентификатору asmproc предшествует символ подчеркивания
Компилятор C/C++ добавляет знак подчеркивания ко всем глобальным иден-
тификаторам. Более того, некоторые компиляторы (VC++) могут кроме сим-
вола подчеркивания добавлять в конце исходного идентификатора комбина-
цию символов
где
означает количество байтов, занимаемых аргументами
процедуры в стеке (см., например, листинг 16.2 в главе 16).
4. Выполнить трансляцию программы на ассемблере:
5. Выполнить объединение объектных модулей:
bcc -ms
Исполняемому модулю будет присвоено имя prgl5_19.exe. Параметр -ms опре-
деляет модель памяти.
Компилятор Borland C++ предоставляет другую возможность для получения
загрузочного модуля. Скопируйте файл tasm.exe в
пакета Borland C++.
Запустите исходные файлы на трансляцию командной строкой вида
bcc
В результате будет получен файл prgl5_19.exe. Компилятор Borland C++ всю
работу организует сам: обрабатывает файл
вызывает транслятор
tasm.exe, который выполняет трансляцию файла
передает компонов-
щику объектные модули
и
В результате создается загру-
зочный модуль prgl5_19.exe.
Как возвратить результат в программу на С из процедуры на ассемблере? Для
этого существуют стандартные соглашения (табл. 15.3). Перед возвратом управ-
ления в программу на С в программе на ассемблере необходимо поместить резуль-
тат или сформировать указатель в заданных регистрах. Для иллюстрации работы
с функцией С, текст которой написан на ассемблере, рассмотрим листинги 15.21
и 15.22. В них функция, написанная на ассемблере, подсчитывает сумму элемен-
тов массива. В функцию передаются адрес массива и его длина. Результат суммиро-
вания элементов массива возвращается обратно в вызывающую программу на С.

Download 12,06 Mb.

Do'stlaringiz bilan baham:
1   ...   199   200   201   202   203   204   205   206   ...   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