Взаимосвязь языков C и ассемблера - реферат

Раздел 1: Регистры и характеристики


1.1 Внедрение регистров


В создаваемых ассемблерных программках можно использовать все регистры микропроцессора. Но чтоб предупредить неурядицу с функциями С и С++, нужно восстанавливать bp, cs, sp и ss, которые они имели до пуска сделанной подпрограммы. Тогда можно быть совсем уверенным, что воззвание к другим функциям не изменит эти Взаимосвязь языков C и ассемблера - реферат регистры. Также нельзя забывать, что С употребляет регистры si и di для регистровых переменных, потому при использовании встроенного ассемблера замедляется общая работа программки.

К регистрам ax, bx, cx, dx и es можно обращаться свободно и не надо резервировать их значения до окончания подпрограммы. Эта свобода касается и других функций, потому Взаимосвязь языков C и ассемблера - реферат нужно держать в голове, что эти регистры изменяться, если вызываются функции С и С++ из ассемблерных подпрограмм.


1.2 Ассемблерные операторы Inline


Ассемблерные операторы inline начинаются словом asm, за которым следует аннотация и ее операнды. К примеру, чтоб синхронизировать программку с наружным сигналом прерывания, можно написать:

/* ожидание прерывания*/

asm sti

asm hlt

printf(“Прерывание Взаимосвязь языков C и ассемблера - реферат получено\n”)

Когда ранешние версии Turbo C компилируют программку со встроенными командами asm, компилятор сначала делает ассемблерный текст для всей программки, вставляя в текст наши ассемблерные аннотации совместно с откомпилированным кодом для других операторов С. Потом компилятор вызывает Turbo Assembler и Linker (компоновщик), чтоб провести ассемблирование и подключить Взаимосвязь языков C и ассемблера - реферат программку к конечному файлу кода. Более поздние версии Turbo и Borland C++ могут компилировать операторы asm без вызова TASM. Полный синтаксис asm:

asm[метка] мнемоника/директива операнды [;] [/*С комментарий*/]

Точки с запятыми в конце строк asm и комменты С, расположенные меж /*и*/ удаляются из текста перед ассемблированием, потому Взаимосвязь языков C и ассемблера - реферат их можно опускать в тексте программки.


1.3 Размещение данных и операторов в тексте программки


Любая строчка текста программки С и С++ находится или снутри, или снаружи функции, и операторы asm могут вставляться как в одном, так и в другом месте. Конкретное положение оператора asm оказывает влияние на то, куда ассемблируется код либо Взаимосвязь языков C и ассемблера - реферат директива. Если оператор asm возникает снаружи функции, то он ассемблируется в сектор данных программки, если снутри функции - в кодовый сектор. Обычно, чтоб сделать переменные, операторы asm вставляются снаружи функций; для сотворения кода их следует вставлять вовнутрь функций. К примеру:

asm count db ?

int main()

{

asm shl [count], 1/*умножение Взаимосвязь языков C и ассемблера - реферат count на 4*/

asm shl [count], 1

return 0;

}

Переменная count объявляется в секторе данных программки (относительно ds). Операторы снутри функции main множат count на 4, используя заместо mul резвые аннотации сдвига shl. Если объявлять переменные снутри функции, данные ассемблируются в кодовый сектор, требуя особенного обхождения:

int main()

{

asm jmp OverThere

asm Взаимосвязь языков C и ассемблера - реферат count db ?

OverThere:

asm shl [count], 1 /* умножение count на 4*/

asm shl [count], 1

return 0;

}

Так как сейчас переменная count находится в кодовом секторе, требуется аннотация jmp, чтоб избежать случайного восприятия значения count в качестве машинного кода и его выполнения.


7



Раздел 2: Особенности данных


2.1 Разделение данных


Inline операторы asm имеют открытый доступ к переменным и Взаимосвязь языков C и ассемблера - реферат структурам С и C++ - одно из самых симпатичных преимуществ способа inline по сопоставлению с подходом средством наружных модулей. Самое увлекательное в типах данных ассемблера и С++, что dq может употребляться для сотворения инициализированных переменных двойной длины с плавающей точкой в языке ассемблера, но в Turbo Assembler отсутствуют директивы Взаимосвязь языков C и ассемблера - реферат для конкретного сотворения переменных с плавающей точкой.

В операторах asm можно ссылаться на переменные типов С++. К примеру:

unsigned char initial

initial = 'T'

asm mov dl, [initial] /*Загрузка знака в dl*/

asm mov ah, 2 /* Пересылка знака в ДОС */

asm int 21h /* Стандартная выходная функция */

Беззнаковая символьная переменная initial загружается оператором Взаимосвязь языков C и ассемблера - реферат asm в dl. Потому что и dl, и беззнаковые символьные данные имеют длину один б, нет необходимости в ссылке использовать определитель Byte, хотя его применение и не будет ошибкой:

asm mov dl, [Byte ptr initial]


2.2 Объявление ассемблерных данных


Можно объявить переменные для использования только ассемблерными операторами. К примеру, чтоб сделать Взаимосвязь языков C и ассемблера - реферат 16-битовое слово с именованием TwoBytes и загрузить значение переменной в сх, можно написать:

asm TwoBytes db 1, 2

int main()

{

asm mov cx, [Word ptr TwoBytes]

return 0

}

Переменная TwoBytes объявляется в секторе данных программки (снаружи функции), с внедрением директивы db, чтоб хранить в памяти 2 б (1 и 2). Оператор ассемблера потом загружает TwoBytes в Взаимосвязь языков C и ассемблера - реферат сх. Определитель Wordptr нужен для ссылки на TwoBytes как на 16-битовое слово.

Так как TwoBytes объявляется в операторе asm, на эту переменную нельзя ссылаться в тексте программки С либо C++. Потому, если только не требуются отдельные переменные для ассемблерных инструкций, следует объявлять их обыденным образом и ссылаться на их из ассемблерного Взаимосвязь языков C и ассемблера - реферат модуля.


2.3 Разделение кода


Ассемблерные операторы inline могут вызывать функции С и C++, а операторы С и C++ обращаться к функциям, написанным на сто процентов на ассемблере. Вся эта связь будет отлично рассмотрена в данном курсовом проекте.

8



Раздел 3: Вызов ассемблерных функций из С


3.1 Знаки подчеркивания


Как указывает практика, все знаки PUBLIC и EXTERN Взаимосвязь языков C и ассемблера - реферат должны начинаться знаками подчеркивания. Это нужно делать исключительно в ассемблерном модуле (но не в начальной про грамме С либо C++), так как компилятор добавляет подчеркивание ко всем глобальным символам, если только не употребляется функция -u для компиляции программ. (Не стоит использовать эту опцию, если только не нужно Взаимосвязь языков C и ассемблера - реферат также перекомпилировать всю применяемую при выполнении С библиотеку, в какой подразумевается, что все глобальные знаки начинаются эмблемой подчеркивания.) Если во время сборки выходит сообщение об ошибке "undefined symbol" (неопределенный знак), то предпосылкой возможно окажется отсутствие подчеркивания в ассемблерном модуле.


3.2 Внедрение далеких данных


Если объявляются переменные в далеком секторе данных после ключевика FARDATA Взаимосвязь языков C и ассемблера - реферат, то нужно приготовить сегментный регистр к размещению переменных в памяти. Сначала, прямо за директивой FARDATA нужно объявить данные:

FARDATA

_OuterLimits dw ?

Потом, в кодовом секторе, следует перед внедрением переменной приготовить сегментный регистр. Одним из вероятных подходов является внедрение оператора SEG для загрузки адреса далекого сектора данных Взаимосвязь языков C и ассемблера - реферат:

mov ax, SEG_OuterLimits;Адресует далекий сектор ;данных

mov es, ах ;средством es

mov [es:_OuterLimits], dx ;Резервируется dx для пере ;менной

Можно также использовать заблаговременно определенный знак @fardata:

mov ах, @fardata

mov es, ах

mov [es:_OuterLimits], dx


3.3 Вызов ассемблерных функций из С


В большинстве случаев asm код оформляют в виде отдельных asm Взаимосвязь языков C и ассемблера - реферат функций, которые позже соединяют на шаге загрузки. Ассемблерный код должен поддерживать стиль языка С для вызова функций, которые включают передачу характеристик, возврат значений и правила сохранения регистров, которые требуются для С++ функций.

Компилятор и загрузчик должны работать вместе для обеспечения вызовов меж модулями. Процесс именуется исключением либо ломкой имен. Предугадывает Взаимосвязь языков C и ассемблера - реферат наличие инфы о типе аргумента. Ломка имени изменяет имя функции, демонстрируя, что за аргумент воспринимает функция. Когда мы конструируем на языке С++, то ломка имен происходит автоматом.

Когда же пишется модуль на asm, который должен быть подсоединен к модулю на языке С++, нужно позаботиться о том, чтоб asm Взаимосвязь языков C и ассемблера - реферат модуль содержал ломку имен (символ подчеркивания). Это можно сделать методом написания фиктивной функции на С++ и компилировать его в asm код. И ассемблерный файл, который будет сгенерирован компилятором С++, будет содержать ломку имен, которые мы можем позже использовать при написании asm функции:

@ имя класса @ начальное имя функции $g описание типов

, где

@ - связывающий Взаимосвязь языков C и ассемблера - реферат знак

$ - конец начального имени функции

g - начало описания типов характеристик

Пример:

void test() {}

void test(int...) {}

void test(int, int) {}

void test(float, double) {}

Что будет в ассемблере?

1. @ test $ gv proc near

push bp

mov bp, sp

pop bp

ret

@ test $ gv endp


2. @ test $ gi proc near

.............

@ test $ gi endp


3. @ test $ gii proc near

............

@ test $ gii endp


4. @ test $ gfd proc near

............

@ test $ gfd endp


BC Взаимосвязь языков C и ассемблера - реферат++ разрешает внедрение неискаженных имен asm функций, определяя стандартные имена С функций в С программках. Для этого в программке определяется наружный С блок:

extern “C”{

int add(int *a, int b);

}

________________

public _add

_add proc ...и т.д.


Определение либо декларирование asm функции во наружном С блоке устраняет программера Взаимосвязь языков C и ассемблера - реферат от необходимости определения реального имени ассемблерной функции и увеличивает наглядность.

С++ передает характеристики функции через стек. Перед тем как вызвать функцию С++ помещает характеристики в стек, начиная с последнего.


3.4 Ассемблирование и сборка наружных модулей


Существует несколько способов ассемблирования, компиляции и сборки отдельных модулей (и подобных многофайловых программ) для Взаимосвязь языков C и ассемблера - реферат сотворения конечной .ЕХЕ программки. Проще всего предоставить сделать все это Turbo С:

tcc cfillstr cfill.asm/*1-ый модуль - cfillstr.c*/

Если употребляется Borland C++, нужно ввести последующую команду (поменять bсс на tсс для Turbo C++):

bcc cfillstr.с cfill.asm

В любом случае команда сначала компилирует CFILLSTR.C в CFILLSTR.OBJ Взаимосвязь языков C и ассемблера - реферат. Потом, распознав расширение названии файла .ASM как имя ассемблерного модуля, компилятор вызывает Turbo Assembler, чтоб ассемблировать CFILL.ASM в CFILL.OBJ. И в конце концов, компилятор вызывает Turbo Linker для объединения модулей с объектными кодами в CFILLSTR.EXE. Если компиляции и ассемблированию подлежит маленькое количество модулей, этот одношаговый способ более прост Взаимосвязь языков C и ассемблера - реферат для использования.

Если у имеется огромное количество модулей, можно сберечь время, осуществляя ассемблирование и сборку раздельно. Первым шагом следует ассемблировать все .ASM файлы. Так как пример flllsrting обладает только одним таким файлом, все можно сделать при помощи единственной команды

tasm /ml cfill.asm

Функция /ml включает различение Взаимосвязь языков C и ассемблера - реферат строчных и строчных знаков, чтоб например слова UpAndDown и upanddown рассматривались как разные - как это принято в программках С и C++. (Turbo Assembler обычно не направляет внимания на то, в каком регистре набраны знаки, потому функция /ml нужна во избежание ошибок при сборке.) После ассемблирования всех наружных модулей откомпилировать основную программку Взаимосвязь языков C и ассемблера - реферат. Снова же, так как в этом примере имеется только один файл .С, для этого нужна только одна команда

tcc -с cfillstr.c

Если употребляется Borland C++, нужно применить последующую команду (поменять bсс на tсс для Turbo C++):

bсс -с cfillstr.c

Функция -с значит "только компилировать", вызывая создание CFILLSTR Взаимосвязь языков C и ассемблера - реферат.OBJ, но не сборку программки в законченный кодовый файл. Для включения всех модулей нужно выполнить этот шаг самим, вызывая Turbo Linker для объединения файлов с объектным кодом с надлежащими библиотечными подпрограммами для сотворения CFILLSTR.EXE. Существует два способа сборки. Поначалу разглядим более непростой способ:

t1ink с:\tc\lib\c Взаимосвязь языков C и ассемблера - реферат0s cfillstr cfill, cfillstr,, с:\tc\lib\cs

При использовании Borland C++4 можно применить последующую команду:

tlink с:\bc4\lib\c0s cfillstr cfill, cfillstr,, с:\bc4\lib\cs

1-ый член после tlink специфицирует файл объектного кода в директории \LIB для соответственной модели памяти, в этом случае - COS.OBJ. 2-ой и 3-ий Взаимосвязь языков C и ассемблера - реферат члены перечисляют подлежащие сборке файлы с объектным кодом .OBJ - они могут быть перечислены в любом порядке. Запятая отделяет перечень файлов .OBJ от имени, которое должно употребляться для конечного файла, в этом случае - CFILLSTR-EXE. Две запятые, последующие за этим, демонстрируют место необязательного файла карты (*.map), не создающегося в Взаимосвязь языков C и ассемблера - реферат данном примере. И в конце концов, специфицируется рабочая библиотека - также в каталоге \LIB.

Имена файла с объектным кодом COS и библиотечным файлом CS должны соответствовать модели памяти, применяемой программкой.

Облегченный (но не очень резвый) способ сборки отдельных модулей состоит в использовании компилятора в качестве "первой части" Turbo Linker. Другими словами Взаимосвязь языков C и ассемблера - реферат, вставляя разные команды компиляции, можно пропустить компиляцию и перейти прямо к сборке. Это позволяет избежать необходимости специфицировать имена рабочих библиотечных файлов и, как следует, упрощает команду сборки. К примеру, для ассемблирования, компиляции и сборки CFILLSTR этим способом требуются три команды:

tasm /ml cfill.asm

tee -с cfillstr.c

tee -ms Взаимосвязь языков C и ассемблера - реферат cfillstr.obj cfill.obj

Для Borland C++ нужно ввести последующие команды (поменять bсс на tсс для Turbo C++):

tasm /ml cfill.asm

bee -с cfillstr.с

bee -ms cfillstr.obj cfill.obj

1-ые две команды - те же, что были описаны выше. 3-я вызывает компилятор во 2-ой раз, используя опцию -ms для определения модели памяти, в Взаимосвязь языков C и ассемблера - реферат этом случае small (малая). Прямо за опцией модели памяти идут файлы с объектным кодом, подлежащие сборке. Хотя приходится включать расширение названий файлов .OBJ в перечисление каждого файла, этот не очень длиннющий способ сборки упрощает огромную часть предварительный работы по конкретному запуску Turbo Linker. Для того, чтоб выяснить, какую Взаимосвязь языков C и ассемблера - реферат опцию нужно писать при TCC, можно пользоваться последующей таблицей.


Таблица 3.1: Названия файлов рабочей библиотеки


Модель памяти Объектный файл Библиотечный файл Функция TCC
Tiny c0t.obj cs.lib -mt
Small c0s.obj cs.lib -ms
Medium c0m.obj cm.lib -mm
Compact c0c.obj cl.lib -mc
Large c0l.obj cl.lib -ml
Huge c0h.obj ch.lib -mh

15



Раздел 4: Вызов функций С из языка ассемблера


4.1 Вызов С и С++ из ассемблера


До сего времени Взаимосвязь языков C и ассемблера - реферат рассматривалось, как поделить переменные меж С либо C++ и ассемблером, также как вызывать наружные ассемблерные функции из программ, написанных на С либо C++. Сейчас подойдем к этому с другой стороны, т.е. к вызову функций С либо C++ из ассемблерного модуля - это также может быть, но просит Взаимосвязь языков C и ассемблера - реферат большего внимания.

Если функция не обладает параметрами, процесс довольно прост. Нужно объявить функцию С либо C++ в директиве EXTRN и пользоваться аннотацией call:

CODESEG

EXTRN _cfuntion:proc

......

call _cfunction

Тут подразумевается, что функция, нареченная _cfunction, существует в программке, подлежащей сборке вкупе с ассемблерным модулем.

Если функции требуются характеристики, процесс усложняется Взаимосвязь языков C и ассемблера - реферат. Обыкновенные характеристики, такие как знаки и целые числа нередко передаются конкретно в стек. Сложные переменные, такие как строчки, структуры и огромного количества, передаются средством ссылок, т.е. по адресу. Не считая того, многие функции возвращают итог в специфичные регистры. При вызове функций С либо C++ из языка ассемблера нужно самим Взаимосвязь языков C и ассемблера - реферат позаботиться о схожих аспектах.

Сначала разглядим простой случай вызова функции с одним целочисленным параметром:

void showscore( int thescore)

{

printf(“\nThe score is: %d\n, thescore);

}

Чтоб вызвать функцию showscore из ассемблерного модуля, передавая значение переменной типа слова в качестве thescore, можно написать:

CODESEG

EXTRN showscore: proc Взаимосвязь языков C и ассемблера - реферат

mov ах, 76 ; Присвоение score регистру

push ах ; Передача параметра в стек

call _showscore ; Вызов функции С

pop ах ; Фиксация стека


Сначала, значение score присваивается ах (хоть какой другой регистр точно так же подойдет для этого), а потом выталкивается в стек перед вызовом showscore. После возврата из функции слово выталкивается из стека Взаимосвязь языков C и ассемблера - реферат. Это нужно поэтому, что в С и C++ вызывающая программка удаляет характеристики из стека. Если есть некоторое количество характеристик, может быть, будет лучше просто прибавить их общее число байтов к sp. К примеру, чтоб вызвать функцию, которая оперирует 4-мя 16-битовыми параметрами, можно пользоваться последующими командами:

push [vl] ; Выталкивание 4 переменных

push [v2] ; (не Взаимосвязь языков C и ассемблера - реферат показанных) в стек

push [v3]

push [v4]

call _aCfunction ; Вызов функции С

add sp, 8 ; Удаление характеристик

Выталкивание нескольких характеристик осуществляется в порядке, оборотном тому, в каком они объявляются функции С либо C++. Исходя из догадки, что функция fillstring определена как

void fillstring( unsigned char far *thestring, int stringLength, char Взаимосвязь языков C и ассемблера - реферат fillchar );

для вызова этой функции из языка ассемблера и наполнения строковой переменной пробелами требуются пару шажков. Сначала ассемблерный модуль объявляется строковой переменной:

DATASEG

PUBLIC _astring

_astring db 80 dup (0)

Потом тот же модуль заявляет fillstring в директиве EXTRN и вызывает функцию для наполнения строчной переменной пробелами:

CODESEG

EXTRN _fillstring: ргос

xor ah, ah ; Обнуление Взаимосвязь языков C и ассемблера - реферат ст. половины ах

mov al,’ ‘ ; Присвоение пробела а1

push ах ; Проталкивание пар-ра fillchar

mov ах, 79 ; Присвоение длины строчки ах

push ах ;Проталкивание пар-ра дл. строчки

push ds ;Проталкивание сег-та адреса строчки

mov ах, offset _astring ;Присвоение смещения адреса ах

push ах ;Проталкивание смещ. адреса строчки

call _fillstring ; Вызов функции

add sp Взаимосвязь языков C и ассемблера - реферат, 8 ; Удаление характеристик из стека

Любой из характеристик - заполняющий знак, длина строчки и 32-битовый указатель строковой переменной- проталкивается в стек в порядке, оборотном перечисленному в определении функции. Применительно к указателю - сектор адреса проталкивается перед смещением. После воззвания к _fillstring к указателю стека sp добавляются 8 б, удаляя характеристики из стека.

Невзирая на Взаимосвязь языков C и ассемблера - реферат то что в этом примере функция _fillstring в реальности написана на языке ассемблера, вызовы функций С и C++ ничем не отличаются.


4.2 Локальные переменные


В дополнение к переменным, объявленным в секторе данных или общим с программкой С и С++, можно использовать локальные переменные, помещенные в стек создаваемых ассемблерных модулей. Локальные переменные Взаимосвязь языков C и ассемблера - реферат есть только во время выполнения функции. Стековая часть создается для переменных при запуске функции, а потом очищается перед ее окончанием. Таким макаром, другие функции могут использовать эти же области памяти для собственных собственных локальных переменных, снижая общий объем памяти, требуемой для всей программки. К примеру:

void countup()

{

int Взаимосвязь языков C и ассемблера - реферат i;

for (i = 0; i < 10; i++)

printer("%d", i);

}

Целая переменная i помещается в памяти в стек при запуске функции countup и существует только до того времени пока производится эта функция. В ассемблерном модуле можно сделать тоже самое при помощи директивы LOCAL. Вот вам наглядный пример законченной функции:

PROС _cfunction Взаимосвязь языков C и ассемблера - реферат NEAR

LOCAL i:Word=stacksize

push bp

mov bp, sp

sub sp, stacksize

mov [i], 0

@@10:

inc [ i ]

;

;--Код, использующий локальную переменную [i]

;

cmp [i], 10

jne @@10

mov sp, bp

pop bp

ret ; Возврат в точку вызова

ENDP _cfunction

Директива LOCAL в этом примере подготавливает переменную i типа Word (слово). Указание = stacksize назначает общее Взаимосвязь языков C и ассемблера - реферат число байтов, занимаемое всеми локальными переменными - в этом случае 2 б. Это значение вычитается из sp после подготовки адресации переменных в стек. Потом, для ссылки на i, употребляются такие аннотации, как mov, inc и crop. Благодаря директиве LOCAL ссылки типа [i] переводятся последующим образом:

mov [bp-2], 0

inc [bp-2]

и Взаимосвязь языков C и ассемблера - реферат т.д. При использовании LOCAL нет необходимости вычислять отрицательные смещения относительно bp, чтоб найти положение переменных в стеке, -достаточно пользоваться именами переменных.

Так как bp не меняется во время выполнения этой функции, можно вернуть sp по средством bp, удаляя область локальной переменной из стека, либо прибавить stacksize к sp при помощи Взаимосвязь языков C и ассемблера - реферат команды

add sp, stacksize

Подходят оба способа, но восстановление sp средством bp - резвее. Можно также объявить несколько локальных переменных операторами, схожими последующему:

LOCAL i:Word; j:Word; c:Byte=stacksize

Сейчас, после вычитания stacksize из указателя стека для резервирования области в стеке, можно использовать три локальные переменные - i, j Взаимосвязь языков C и ассемблера - реферат и с. (Нужно всегда делать LOCAL, что упрощает адресацию локальных переменных, это не делает область для переменных в памяти.)


4.3 Передача аргументов


Совместное внедрение C++ и ассемблера становится более сложным, когда к функциям добавляются аргументы. Приходится очень пристально программировать, обращаясь к функциям из разных модулей и выбирая аргументы из стека Взаимосвязь языков C и ассемблера - реферат. Но последующая директива берет на себя задачку сама произвести ломку имен и занести их в стек:

ARG c_offset:byte, k_pffset:word

Аргументы, перечисленные таким макаром, не являются объектами данных; они смещаются в стеке относительно регистра bр. Внедрение ARG схожим образом позволяет ассемблеру вычислить смещения заместо нас - но мы Взаимосвязь языков C и ассемблера - реферат должны специфицировать правильные типы данных. Символьная переменная в C++ является б в ассемблере, целая в C++ - эквивалентом ассемблерного слова и т.д.

Оборотный процесс - передача аргументов из языка ассемблера в C++ - просит другой стратегии:

proc _asmfunction C c_arg:byte, k_arg:word

“C” после имени функции Взаимосвязь языков C и ассемблера - реферат показывает, что аргументы приводятся для языка С (т.е. они выталкиваются в стек в порядке справа влево). Остальное также, как и для директивы ARG.

В итоге Turbo Assembler автоматом пишет аннотации для сохранения, инициализации и восстановления bp. При использовании этой другой методики не приходится проводить четкие операции Взаимосвязь языков C и ассемблера - реферат по выталкиванию bp. Кроме этого отличия, в остальном процесс программирования остается этим же самым.


20



Раздел 5: Курсовая программка


5.1 Постановка задачки


В курсовой требовалось написать программку, вычисляющую значение многочлена n-ой степени по вектору размерности n коэффициентов многочлена и по некоторой переменной х, задаваемые юзером. Нужно было воплотить многомодульную связь (два модуля: на С и Взаимосвязь языков C и ассемблера - реферат на ассемблере), также выразить наглядно связь ассемблера с языком С.


5.2 Блоксхема программки


Программка реализовывалась по последующей блоксхеме:


Разумеется, что была реализована связь в обе стороны.


5.3 Модуль на С++


/*Это часть на С++, еще есть на ассемблере*/

#include


extern "C" void vvod();/*ассемблерная процедура*/

extern "C" void mnogochlen(int *vec);/*функция в С Взаимосвязь языков C и ассемблера - реферат*/

int m;

extern int *vect;/*вектор коэффициентов, объявленный*/

/*наружной переменной*/

main()

{

cout<<"\n Введите степень многочлена:"<

cin>>m;

vvod();/*Вызов ассемблерной процедуры*/

return 0;

}


extern "C"/*Начало функции на С*/

{

void mnogochlen(int *vect)

{

int i,g,x;

int fact,summa;

summa=0;

cout<<"\n Введите значение переменной:"<

cin Взаимосвязь языков C и ассемблера - реферат>>x;

for(i=m;i>=0;i--)/*Вычисление ответа*/

{

fact=1;

for(g=0;g<=i;g++)

{

fact=fact*x;

}

summa=summa+vect[i]*fact;

}

cout<<"ответ:"<

cout<<"Ну вот и все!"<

}

}


5.4 Модуль на ассемблере


MODEL small

dataseg

so db 'введите вектор коэффициентов','$'

extrn _m:word, _vec:word; Наружные аргументы

m2 dw 0

codeseg

extrn _mnogochlen:proc; функция из Взаимосвязь языков C и ассемблера - реферат С++

public _vvod; местная процедура

proc _vvod near

push bp

mov bp,sp

push di;Сохранение значений этих регистров

push si;нужно, т.к. они употребляются С++

MOV ah,09h ;начало ввода вектора перестановок

MOV dx,offset so

INT 21h

mov si,0

MOV cx,[_m]

l1: MOV ah,02h

MOV dl,'>'

INT 21h

MOV di,0

m1 : MOV ah,08h

INT 21h

CMP Взаимосвязь языков C и ассемблера - реферат al,13

JE exit

CMP al,'9'

JA m1

CMP al,'0'

JB m1

MOV ah,02h

MOV dl,al

INT 21h

SUB al,'0'

XOR ah,ah

MOV m2,ax

MOV ax,di

MOV bx,10

MUL bx

ADD ax,m2

MOV di,ax

JMP m1

exit: MOV [_vec[si]],di

ADD si,2;Данные типа слово, прибавляем 2

MOV di,0

mov ah,02h

mov Взаимосвязь языков C и ассемблера - реферат dl,' '

int 21h

mov dl,13

int 21h

mov dl,10

int 21h

LOOP l1

mov sp,bp

pop di;извлечение сохраненных регистров

pop si;перед возвратом в С++

MOV ax,offset [_vec]

PUSH ax

call _mnogochlen; Вызов функции С++

ADD sp,4;Удаление частей из стека

POP bp;адресок возврата

ret

endp _vvod

end


5.5 Анализ проведенной работы


При работе в многомодульном режиме главные Взаимосвязь языков C и ассемблера - реферат трудности появляются в использовании регистров. Из-за несохранения системных регистров, применяемых С++, программка может просто “повиснуть”. Также следовало сделат выбор - какой модуль сделать основным. Но практика указывает, что следует создавать вызов языков малого уровня из высочайшего, а не напротив. В общем, все трудности были преодолены и программка появилась в Взаимосвязь языков C и ассемблера - реферат свет.

23



Введение


В безупречном мире программирования компиляторы с языков высочайшего уровня должны генерировать самый резвый, самый малогабаритный и лучший машинный код для хоть какой программки. Если б это было нереально, то программирование много бы потеряло от этого, и наверное не писался бы этот курсовик. Но это нереально Взаимосвязь языков C и ассемблера - реферат. Невзирая на огромное количество усовершенствований при разработке компиляторов, ни один язык высочайшего уровня пока не в состоянии продублировать лаконичный, резвый и роскошный код, написанный опытным спецом по ассемблеру.

В чем все-таки дело? А в том, что компиляторы обобщают решаемые ими задачки. В C++ существует только один метод написания цикла FOR Взаимосвязь языков C и ассемблера - реферат. В то же время при помощи ассемблера этот цикл можно организовать при помощи ассемблера этот цикл можно организовать десятками методов. Чтоб компилятор выбирал совершенно подходящие в каждой определенной ситуации способы реализации метода и при всем этом беря во внимание их воздействие на другие части программки - он должен владеть Взаимосвязь языков C и ассемблера - реферат умом гения, вкусом художника и интуицией предсказателя. Нынешние компиляторы с языков высочайшего уровня довольно сообразительны, но не до таковой степени.

Посреди всех имеющихся компиляторов С более приблизился к эталону С++. Порождаемый им машинный код работает довольно стремительно, занимает на диске малость места и почти всегда может употребляться без каких-то Взаимосвязь языков C и ассемблера - реферат модификаций. Но невзирая на все плюсы С++, все равно остается место для улучшений, по этому даже маленькие участки программки, переписанные на ассемблере, могут существенно повысить скорость работы программки и уменьшить размер исполняемого файла. Не считая того, добавив ассемблер к С++, можно облегчить доступ к регистрам аппаратных средств и решение других Взаимосвязь языков C и ассемблера - реферат задач малого уровня, таких как запись знаков конкретно в видеопамять.

В почти всех случаях единственный метод для добавления программке скорости - мало дополнить совершенный “С”, используя один из 2-ух способов:

Операторы Inline вставляют язык ассемблера конкретно в начальную Взаимосвязь языков C и ассемблера - реферат программку на С и С++. Эта методика стремительная и обычная, но имеет несколько недочетов, которые поясняться ниже. Наружные функции, хотя их и тяжело использовать, чем операторы Inline, имеют то преимущество, что позволяют более много использовать все способности Turbo Assembler.

4



Перечень использованной литературы


1. Том Сван “Освоение Turbo Assembler”, Диалектика, Киев, 1996 г Взаимосвязь языков C и ассемблера - реферат.


2. Березин Б.И., Березин С.Б. “Исходный курс С и С++”, Диалог МИФИ, Москва, 1996 г.


3. Лекции Комлевой Нины Викторовны по предмету “Языки программирования и способы трансляции”

24



СОДЕРЖАНИЕ


Введение 3
Раздел 1: Регистры и характеристики 5
1.1 Внедрение регистров 5
1.2 Ассемблерные операторы Inline 5
1.3 Размещение данных и операторов в программке 6
Раздел 2: Особенности данных 7
2.1 Разделение данных 7
2.2 Объявление ассемблерных данных 7
2.3 Разделение кода 8
Раздел Взаимосвязь языков C и ассемблера - реферат 3: Вызов ассемблерных функций из С 9
3.1 Знаки подчеркивания 9
3.2 Внедрение далеких данных 9
3.3 Вызов ассемблерных функций из С 10
3.4 Ассемблирование и сборка наружных модулей 11
Раздел 4: Вызов функций С из ассемблера 15
4.1 Вызов С и С++ из ассемблера 15
4.2 Локальные переменные 17
4.3 Передача аргументов 18
Раздел 5: Курсовая программка 20
5.1 Постановка задачки 20
5.2 Блоксхема программки 20
5.3 Модуль на С++ 20
5.4 Модуль на ассемблере 21
5.5 Анализ проведенной работы 23
Перечень использованной литературы 24

Столичный Муниципальный Институт ЭКОНОМИКИ, СТАТИСТИКИ И ИНФОРМАТИКИ


КАФЕДРА МО ЭВМ


КУРСОВАЯ Взаимосвязь языков C и ассемблера - реферат РАБОТА


на тему : “Связь языков С и ассемблера”


Студент: Аплемах А.В.

Группа: ДП-202


Управляющий проекта:

Комлева Н.В.


Защищена “___” Мая 1997 г.


Москва 1997г.


vzaimosvyaz-svojstv-temperamenta-i-mezhlichnostnih-otnoshenij-v-gruppe-mladshih-shkolnikov.html
vzaimosvyaz-tipa-korporativnoj-kulturi-udovletvorennosti-trudom-i-predannosti-sotrudnikov-organizacii.html
vzaimosvyaz-trp-urovnya-spontannoj-izvestnosti-i-razmera-reklamnogo-byudzheta.html