мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Следующая версияСледующая версия справа и слева
asm:second3 [03/03/2011 16:31] arabusovasm:second3 [03/03/2011 16:58] arabusov
Строка 1: Строка 1:
 +===== Механизм связки Си-Ассемблер =====
 +На предыдущих уроках мы познакомились с гибридным программированием. В этом разделе будет дана теоретическая модель построения связи asm-c
 +
 +Данный способ передачи параметров используется в языках программирования Си, Си++, Пролог и других. Этот метод противопоставлен методу языка Паскаль, поэтому связка asm-pascal будет выглядеть по-другому!
 +
 +Итак, если мы определим функцию в Си<code=c>int foo (int a,int b,int c,int d);</code>то при вызове функции выполнятся следующие машинные инструкции:
 +<code=asm> push d
 + push c
 + push b
 + push a
 + call _foo
 + add sp,8 ;Освобождение стека осуществляется автоматически!</code>
 +При этом для правильного использования переданных параметров процедура //foo// может выглядеть так:
 +<code=asm>_foo proc
 +
 + push bp
 + mov bp,sp
 +
 + a = [bp+4]
 + b = [bp+6]
 + c = [bp+8]
 + d = [bp+ah]
 +
 + ...
 +
 + pop bp
 + ret
 +
 +_foo endp</code>
 +
 +
 ==== Пример библиотеки, позволяющей вывести символ на экран ==== ==== Пример библиотеки, позволяющей вывести символ на экран ====
  
Строка 4: Строка 35:
  
 <code=asm>.MODEL small <code=asm>.MODEL small
- 
-_WIDTH equ 25 
- 
-L_1  equ 80 
-L_0 equ 40 
  
 public _put_symbol public _put_symbol
Строка 59: Строка 85:
  
 extern int put_symbol (unsigned char symbol, unsigned char attribut);</code> extern int put_symbol (unsigned char symbol, unsigned char attribut);</code>
 +
 +Обратите внимание на эти строки:
 +<code=asm>_put_symbol proc near
 +        
 +        push bp
 + mov bp,sp
 +
 +        ...
 +        
 + mov al,[bp+4]
 + mov ah,[bp+6]
 +
 +        ...
 +        pop     bp
 +        
 +_put_symbol endp</code>
 +Это - передача параметров процедуре ассемблера без использования директивы ARG.
 +
 +В модуле языка Си записано следующее:
 +<code=c>extern int put_symbol (unsigned char symbol, unsigned char attribut);</code>
 +Это значит, что передаваемые параметры начинались с адреса bp+4