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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
asm:second1 [03/02/2011 12:20] 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>
Строка 38: Строка 40:
  
 =====  Гибридное программирование ===== =====  Гибридное программирование =====
-Итак, пусть у нас есть программа, написанная на Си, и процедура, написанная на ассемблере. Мы хотим из программы вызвать процедуру. Для этого существует несколько условий написания процедуры.+Итак, пусть у нас есть программа, написанная на Си, и процедура, написанная на ассемблере. Мы хотим из программы вызвать процедуру. Для этого существует несколько условий написания и для процедуры, и для программы. 
 +==== Идентификаторы ==== 
 +=== Си -> Ассемблер === 
 +Для того, чтобы процедуре были доступны переменные и функции программы, в программе их нужно объявить как принадлежащие классу //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>