мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версияПоследняя версияСледующая версия справа и слева | ||
asm:second3 [03/03/2011 16:33] – arabusov | asm:second3 [03/03/2011 17:03] – arabusov | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ==== Пример библиотеки, позволяющей вывести символ на экран | + | ===== Механизм связки Си-Ассемблер ===== |
+ | На предыдущих уроках мы познакомились с гибридным программированием. В этом разделе будет дана теоретическая модель построения связи asm-c | ||
- | Модуль | + | Данный способ передачи параметров используется в языках программирования Си, Си++, Пролог и других. Этот метод противопоставлен методу языка Паскаль, поэтому связка asm-pascal будет выглядеть по-другому! |
- | < | + | Итак, если мы определим функцию в Си< |
+ | < | ||
+ | push c | ||
+ | push b | ||
+ | push a | ||
+ | call _foo | ||
+ | add sp, | ||
+ | При этом для правильного использования переданных параметров процедура //foo// может выглядеть так: | ||
+ | < | ||
- | _WIDTH equ 25 | + | push bp |
+ | mov bp,sp | ||
- | L_1 equ 80 | + | a = [bp+4] |
- | L_0 equ 40 | + | b = [bp+6] |
+ | c = [bp+8] | ||
+ | d = [bp+ah] | ||
+ | |||
+ | ... | ||
+ | |||
+ | pop bp | ||
+ | ret | ||
+ | |||
+ | _foo endp</ | ||
+ | |||
+ | |||
+ | ==== Пример библиотеки, | ||
+ | |||
+ | Модуль Assembler | ||
+ | |||
+ | < | ||
public _put_symbol | public _put_symbol | ||
Строка 61: | Строка 87: | ||
Обратите внимание на эти строки: | Обратите внимание на эти строки: | ||
- | < | + | <code=asm>_put_symbol proc near |
- | mov ah, | + | |
+ | push bp | ||
+ | mov bp, | ||
+ | |||
+ | ... | ||
+ | |||
+ | mov al, | ||
+ | mov ah, | ||
+ | |||
+ | ... | ||
+ | pop bp | ||
+ | |||
+ | _put_symbol endp</ | ||
+ | Это - передача параметров процедуре ассемблера без использования директивы ARG. | ||
+ | |||
+ | В модуле языка Си записано следующее: | ||
+ | < | ||
+ | Это значит, | ||
+ | ==== Альтернативный вариант написания процедур на ассемблере ==== | ||
+ | Во многих ассемблерах (в том числе и TASM) встроена поддержка передачи параметров с использованием директивы //ARG// или усложнённой директивы //proc// | ||
+ | |||
+ | Пример: | ||
+ | < | ||
+ | |||
+ | ... | ||
+ | |||
+ | ret | ||
+ | |||
+ | _foo endp</ | ||
+ | В данном методе нельзя использовать регистр BP! |