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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
asm:second1 [03/02/2011 11:24] arabusovasm:second1 [10/02/2011 22:46] (текущий) arabusov
Строка 3: Строка 3:
 ===== Адресация переменных ===== ===== Адресация переменных =====
  
-В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение,</code>где база - регистры BX или BP, индекс - регистры SI или DI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.+В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение</code>где база - регистры BX или BP, индекс - регистры SI или DI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.
  
 Пример: Пример:
  
 Определим массив переменных greet Определим массив переменных greet
-<code>+<code asm>
 _DATA segment word public "DATA" _DATA segment word public "DATA"
  
Строка 16: Строка 16:
 </code> </code>
 и инициализируем ds указанием на сегмент данных и инициализируем ds указанием на сегмент данных
-<code>+<code asm>
 _CODE segment word public "CODE" _CODE segment word public "CODE"
  
Строка 23: Строка 23:
  
 </code> </code>
-В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o' +В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o'((Для справки: как вывести содержимое регистра al на экран:<code asm>mov ah,0eh 
-  - <code>+mov bh,0 
 +int 10h</code>)) 
 +  - <code asm>
 mov al,'o' mov al,'o'
 </code> </code>
-  - <code>mov al,[greet+4]</code> +  - <code asm>mov al,[greet+4]</code> 
-  - <code>mov si, (offset greet) + 4+  - <code asm>mov si, (offset greet) + 4
 mov al,[si]</code> mov al,[si]</code>
-  - <code>mov bx, offset greet + 4+  - <code asm>mov bx, offset greet + 4
 mov al,[bx]</code> mov al,[bx]</code>
-  - <code>mov bx,offset greet+  - <code asm>mov bx,offset greet
 mov si,4 mov si,4
 mov al,[bx + si]</code> mov al,[bx + si]</code>
 В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый. В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый.
 +
 +=====  Гибридное программирование =====
 +Итак, пусть у нас есть программа, написанная на Си, и процедура, написанная на ассемблере. Мы хотим из программы вызвать процедуру. Для этого существует несколько условий написания и для процедуры, и для программы.
 +==== Идентификаторы ====
 +=== Си -> Ассемблер ===
 +Для того, чтобы процедуре были доступны переменные и функции программы, в программе их нужно объявить как принадлежащие классу //extern//, при этом в программе перед идентификатором должен стоять знак подчёркивания. При этом в процедуре эти идентификаторы должны быть объявлены с помощью директивы EXTRN
 +=== Ассемблер -> Си ===
 +Для того, чтобы программе были доступны переменные, метки и функции процедуры, необходимо в процедуре объявить данный идентификатор в директиве PUBLIC или GLOBAL, добавить в начало знак подчёркивания, а в программе объявить идентификатор как принадлежащий классу //extern//
 +==== Аргументы и результаты функций ====
 +В данном разделе кратко опишем стандарт Си-функций.
 +=== Результат ===
 +Результаты функций остаются в регистрах (один байт в AL, два байта в AX, три и четыре байта (кроме float) в DX-AX, более 4-х байт в сегменте данных с указателем в AX, результат типа double и float в верхушке стека сопроцессора).
 +=== Аргументы ===
 +Аргументы функции указываются в стеке процессора, однобайтный аргумент считается двухбайтным с неопределённым старшим байтом.
 +==== Примеры ====
 +Модуль Си:<code c>#include <stdio.h>
 +extern int Fun (void);
 +int main ()
 +{
 +   printf ("%d\n", Fun ());
 +   return 0;
 +}</code>
 +Модуль Ассемблер:<code asm>.MODEL SMALL
 +PUBLIC _Fun
 +.CODE
 +_Fun PROC NEAR
 +   MOV AX,13
 +   RET
 +_Fun ENDP
 +END</code>
 +Для компиляции программы необходимо:
 +  - скомпилировать ассемблерный модуль в объектный с опцией /mx
 +  - в IDE Turbo C v2.0 создать проект, в которой вписать название модуля Си и объектного модуля, полученного из ассемблерного
 +=== Последовательность действий для сборки гибридной программы ===
 +tasm //asm_module.asm// /mx
 +
 +tc
 +
 +**Project -> Project Name** //project.prj//
 +
 +**Compile -> Make**
 +
 +**File -> OS Shell** //if no errors//
 +
 +//project//
 +=== Содержимое файла project.prj====
 +<code>asm_module.obj
 +c_module.c</code>