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
|