мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
asm:second1 [03/02/2011 09:46] – создано arabusov | asm:second1 [10/02/2011 22:46] (текущий) – arabusov | ||
---|---|---|---|
Строка 3: | Строка 3: | ||
===== Адресация переменных ===== | ===== Адресация переменных ===== | ||
- | В общем случае адрес переменной или команды можно представить с помощью выражения вида < | + | В общем случае адрес переменной или команды можно представить с помощью выражения вида < |
Пример: | Пример: | ||
Определим массив переменных greet | Определим массив переменных greet | ||
- | < | + | < |
_DATA segment word public " | _DATA segment word public " | ||
Строка 16: | Строка 16: | ||
</ | </ | ||
и инициализируем ds указанием на сегмент данных | и инициализируем ds указанием на сегмент данных | ||
- | < | + | < |
_CODE segment word public " | _CODE segment word public " | ||
Строка 23: | Строка 23: | ||
</ | </ | ||
- | В результате выполнения следующих последовательностей команд в регистре al окажется символ ' | + | В результате выполнения следующих последовательностей команд в регистре al окажется символ ' |
- | - < | + | mov bh,0 |
+ | int 10h</ | ||
+ | - < | ||
mov al,' | mov al,' | ||
</ | </ | ||
- | - < | + | - < |
+ | - <code asm>mov si, (offset greet) + 4 | ||
+ | mov al, | ||
+ | - <code asm>mov bx, offset greet + 4 | ||
+ | mov al, | ||
+ | - <code asm>mov bx,offset greet | ||
+ | mov si,4 | ||
+ | mov al,[bx + si]</ | ||
+ | В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ ' | ||
+ | |||
+ | ===== Гибридное программирование ===== | ||
+ | Итак, пусть у нас есть программа, | ||
+ | ==== Идентификаторы ==== | ||
+ | === Си -> Ассемблер === | ||
+ | Для того, чтобы процедуре были доступны переменные и функции программы, | ||
+ | === Ассемблер -> Си === | ||
+ | Для того, чтобы программе были доступны переменные, | ||
+ | ==== Аргументы и результаты функций ==== | ||
+ | В данном разделе кратко опишем стандарт Си-функций. | ||
+ | === Результат === | ||
+ | Результаты функций остаются в регистрах (один байт в AL, два байта в AX, три и четыре байта (кроме float) в DX-AX, более 4-х байт в сегменте данных с указателем в AX, результат типа double и float в верхушке стека сопроцессора). | ||
+ | === Аргументы === | ||
+ | Аргументы функции указываются в стеке процессора, | ||
+ | ==== Примеры ==== | ||
+ | Модуль Си:< | ||
+ | extern int Fun (void); | ||
+ | int main () | ||
+ | { | ||
+ | | ||
+ | | ||
+ | }</ | ||
+ | Модуль Ассемблер:< | ||
+ | PUBLIC _Fun | ||
+ | .CODE | ||
+ | _Fun PROC NEAR | ||
+ | MOV AX,13 | ||
+ | RET | ||
+ | _Fun ENDP | ||
+ | END</ | ||
+ | Для компиляции программы необходимо: | ||
+ | - скомпилировать ассемблерный модуль в объектный с опцией /mx | ||
+ | - в IDE Turbo C v2.0 создать проект, | ||
+ | === Последовательность действий для сборки гибридной программы === | ||
+ | tasm // | ||
+ | |||
+ | tc | ||
+ | |||
+ | **Project -> Project Name** // | ||
+ | |||
+ | **Compile -> Make** | ||
+ | |||
+ | **File -> OS Shell** //if no errors// | ||
+ | |||
+ | // | ||
+ | === Содержимое файла project.prj==== | ||
+ | < | ||
+ | c_module.c</ |