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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
asm:second3 [03/03/2011 16:33] arabusovasm:second3 [26/02/2014 22:16] (текущий) arabusov
Строка 1: Строка 1:
-==== Пример библиотеки, позволяющей вывести символ на экран ====+===== Механизм связки Си-Ассемблер ===== 
 +На предыдущих уроках мы познакомились с гибридным программированием. В этом разделе будет дана теоретическая модель построения связи asm-c
  
-Модуль Assembler+Данный способ передачи параметров используется в языках программирования Си, Си++, Пролог и других. Этот метод противопоставлен методу языка Паскаль, поэтому связка asm-pascal будет выглядеть по-другому!
  
-<code=asm>.MODEL small+Итак, если мы определим функцию в Си<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
  
-_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+10] 
 + 
 + ... 
 + 
 + pop bp 
 + ret 
 + 
 +_foo endp</code> 
 + 
 + 
 +==== Пример библиотеки, которая выводит символ на экран ==== 
 + 
 +Модуль Assembler 
 + 
 +<code=asm>.MODEL small
  
 public _put_symbol public _put_symbol
Строка 61: Строка 87:
  
 Обратите внимание на эти строки: Обратите внимание на эти строки:
-<code> mov al,[bp+4] +<code=asm>_put_symbol proc near 
- mov ah,[bp+6]</code>+         
 +        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 
 +==== Альтернативный вариант написания процедур на ассемблере ==== 
 +Во многих ассемблерах (в том числе и TASM) встроена поддержка передачи параметров с использованием директивы //ARG// или усложнённой директивы //proc// 
 + 
 +Пример: 
 +<code=asm>_foo proc C, a: word, b: word, c: word, d: word 
 + 
 + ... 
 + 
 + ret 
 + 
 +_foo endp</code> 
 +В данном методе нельзя использовать регистр BP!