Ассемблер + С icon

Ассемблер + С




Скачати 27.52 Kb.
НазваАссемблер + С
Дата03.08.2012
Розмір27.52 Kb.
ТипЛабораторная работа

ЛАБОРАТОРНАЯ РАБОТА N 13

Ассемблер + С

Вызов ассемблерной процедуры из С


1. В программе на С ассемблерную процедуру следует объявить как внешнюю.

Пример.

int extern cdecl asm_p (int,int)

(модификатор) (имя процедуры) (типы параметров)

Модификатор cdecl указывает, что соглашения о связях и именах при передаче параметров будут использованы согласно принятым в языке С.

2. Необходимо вызывать ассемблерную процедуру как обычную функцию С. Если Си-программа компилируется с моделью памяти small или compact, то ассемблерная процедура объявляется как near; для средней, большой и максимальной моделей – объявляется как far.

^

Соглашения о связях и именах в C



1. Передача параметров осуществляется аналогично языку Pascal, т.е. из вызывающей программы в вызываемую - через стек, обратно через регистры.

2. Аргументы, передаваемые вызываемой программе, помещаются в стек в порядке, обратном тому, в котором они заданы в операторе вызова (в Pascal - в прямом порядке), т.е. первый аргумент помещается последним. Это позволяет делать программу с переменным числом аргументов.

3. Аргументы передаются по значению, за исключением массивов, которые передаются ссылкой (в Pascal - и по cсылке, и по значению).

4. После завершения вызываемой программы стек восстанавливает вызывающая программа.

5. Компилятор С в начале любого внешнего имени добавляет символ "_" перед помещением его в объектный файл, т.е. в программах на Ассемблере нужно к имени вызываемой функции добавлять _ (подчеркивание).

6. Компилятор С не преобразует малые буквы внешнего имени в большие перед помещением его в объектный файл (Pascal преобразует), т.е. в С надо имя при описании функции и ее вызове задавать одинаковыми буквами (или малыми, или большими).

7. Компилятор распознает первые 31 символа внешнего имени (Pascal - первые 8).

8. Результат работы передается так же, как и в Pascal – содержимое ax или ax-dx.


Пример.

Функция на ассемблере производит суммирование двух целых чисел и возвращает целый результат.


1. файл c_asm.cpp (bc)

#include

int p1,p2;

int extern cdecl addint (int,int);

void main()

{

cout<<"\n p1=";

cin>>p1;

cout<<"\n p2=";

cin>>p2;

cout<<"\n сумма="<
}


файл c_asm.c (tc++)

# include

int p1,p2;

int extern cdecl addint(int,int);

void main()

{

printf("\n Введите значение p1 : ");

scanf("%d",&p1);

printf("\n Введите значение p2 : ");

scanf("%d",&p2);

printf("\n Результат Y= ");

printf("%d",addint(p1,p2));

}

2. функция addint (asm_c.asm)

^ .MODEL SMALL

.CODE

PUBLIC _addint ; добавляется _

_addint proc far ; добавляется _

; используется атрибут процедуры far, если в С

; задана модель памяти LARGE

push bp

mov bp,sp

mov ax,[bp+6]

add ax,[bp+8]

pop bp

ret

_addint endp

end

Чтобы получить .exe-файл, нужно войти в среду TC++ или BC и создать там файл проекта, например, ca.prj, состоящий из двух файлов :

c_asm.c (компиляция с моделью памяти LARGE)

asm_c.obj (предварительно транслируется с помощью TASM)


3. Встроенный ассемблер (С-программа)

Формат:

asm {оператор на языке ассемблера }

Соглашения:

  • нельзя использовать макросы;

  • нельзя использовать инструкции процессоров 80386 и 80486;

  • - можно использовать только следующие директивы: db dd dw extrn

  • использовать модель памяти small (установить в опциях С).


# include

int p1,p2;

int addint(int ,int );

void main()

{

printf("\n Введите значение p1 : ");

scanf("%d",&p1);

printf("\n Введите значение p2 : ");

scanf("%d",&p2);

printf("\n Результат Y= ");

printf("%d",addint(p1,p2));

}

int addint (int k1,int k2)

{ int y1;

asm {mov ax,k1

add ax,k2

mov y1,ax

}

return y1;

}


При включении в ассемблерную часть программы метки, ее необходимо записывать на С:


asm {

.....

jmp M1

......

}

M1: asm {

.......

}


Задания к лабораторной работе



1. В соответствии с заданием к лабораторной работе N 10 вычисление y1 и y2 запрограммируйте на языке ассемблера, вычисление y – на языке С.

Для вычисления y1 создайте отдельный файл на языке ассемблера, для вычисления y2 используйте встроенный Ассемблер (конструкция asm).

2. Занесите в протокол:

  • исходные данные и полученные результаты вычислений в десятичной форме;

  • текст программ и описание способов вызова процедур и передачи параметров.

Схожі:

Ассемблер + С iconАссемблер + Pascal
Ассемблер предоставляет программисту полную свободу действий, но время, затрачиваемое на создание ассемблерных программ, слишком...
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи