Главная
Статьи
Ссылки
Приколы
Инфо...

СВЯЗЬ С++ и АССЕМБЛЕРА

Written by "DOSTA MAX 2002":

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

1.Подключение ассемблерных файлов к С++ программам.

Допустим у нас есть програма на АСМе некоторые процедуры из которой необходимо испольсовать в С++ программе. Для этого необходимо в С++ в меню Project выбрать Open Project и ввести имя своего проекта. После чего появляется новое окно, которое содержит имена всех файлов включаемых в данный проект. По нажатии Ins можно включать новые файлы *.asm,*.cpp. Также нужно выбрать компилятор с помощью которого должны компилироваться файлы. Для этого достаточно нажать Ctrl+О. Для файла написанного на ассемблере необходимо выбрать ~Turbo Assembler с различными опциями командной строки например:

/MX /ZI /O и т.д.

2. Написание процедур.

Если необходимо использовать ассемблерную процедуру в С++ то как и в связи с паскалем ее необходимо описать как Public, но есть определенный нюанс. Дело в том, что компилятор С++ при описании в нем внешних процедур добавляет к их именам символ подчеркивания "_". и Для совпадения имен требуется ко всем процедурам написанным на ассемблере добавлять символ "_". Например:

Public proc _DMA

_DMA proc c far

...

ret

_DMA endp

Описание внешних процедур в С++ выполняется очень просто для этого нужно записать их внешними extrn и обьявить язык "C". Например:

extrn "C" void far DMA(int,int...);

3. Передача параметров.

По умолчанию С++ использует такую же последовательность передачи параметров, что была в С. Параметры помещаются в стек начиная с последнего. DMA(a3,a2,a1) => сначала заносится в стек а1 потом а2 и а3.Например:

DMA(a3,a2,a1) //a3,a2,a1-int

В этом случае стек будет выглядеть так:

sp+06:a3

sp+04:a2

sp+02 :a3

sp :адресс возврата.

Отсюда видно, что данная передача параметров намного удобней чем в Паскале. Вызывающей програме не надо знать сколько параметров помещено в стек и следовательно не надо его очищать, чтобы вернуться в вызывающую программу.

4. Простой пример.

Пусть нам нужно сложить два числа а1 и а2. a1=a1+a2;

Текст С++ программы:

extrn "C" void far DMA(int a1,int a2)

void main(){ int a1=5,a2=6;

DMA(a1,a2);};

Текст асемблерной программы:

public _DMA

_DMA proc c far a1:word,a2:word

mov ax,a1

add ax,a2

...вывод ax

ret

Hosted by uCoz