Использование Ассемблера в ЯВУ. Соглашение о регистрах. Лекция 11 1

Содержание

Слайд 2

Использование Ассемблера в ЯВУ Формы комбинирования программ на языках высокого уровня

Использование Ассемблера в ЯВУ

Формы комбинирования программ на языках высокого уровня с

ассемблером:

Использование ассемблерных вставок
Использование внешних процедур и функций.

Слайд 3

Использование Ассемблера в ЯВУ Использование ассемблерных вставок _asm КодОперации операнды ;

Использование Ассемблера в ЯВУ

Использование ассемблерных вставок

_asm КодОперации операнды ; // комментарии
_asm { текст программы на

ассемблере ; комментарии }
Слайд 4

Использование Ассемблера в ЯВУ Использование ассемблерных вставок (пример) #include #include #include

Использование Ассемблера в ЯВУ

Использование ассемблерных вставок (пример)

#include  #include  #include  void main() {
  char s[20];
  int a,

b, sum;
  CharToOem(_T("Введите "),s);
  printf("%s a: ", s);
  scanf("%d",&a);
  printf("%s b: ",s);
  scanf("%d",&b);
  _asm
  {
    mov eax, a;
    mov ecx, 5
m: add eax, b
    loop m
    mov sum, eax
  }
  printf("\n %d + 5*%d = %d", a, b, sum);
  getchar(); getchar(); }

Пример Даны целые числа а и b. Вычислить выражение a+5b. Для вывода приглашений Введите a: и Введите b: используем функцию CharToOem(_T("Введите "),s), где s – указатель на строку, которая перекодирует русскоязычные сообщения.

Слайд 5

Использование Ассемблера в ЯВУ Использование внешних процедур Для связи посредством внешних

Использование Ассемблера в ЯВУ

Использование внешних процедур

Для связи посредством внешних процедур создается

многофайловая программа. При этом в общем случае возможны два варианта вызова:
программа на языке высокого уровня вызывает процедуру на языке ассемблера;
программа на языке ассемблера вызывает процедуру на языке высокого уровня.
Слайд 6

Использование Ассемблера в ЯВУ Использование внешних процедур Основные соглашения по передаче параметров в процедуру

Использование Ассемблера в ЯВУ

Использование внешних процедур

Основные соглашения по передаче параметров в

процедуру
Слайд 7

Использование Ассемблера в ЯВУ Конвенция Pascal заключается в том, что параметры

Использование Ассемблера в ЯВУ

Конвенция Pascal заключается в том, что параметры из

программы на языке высокого уровня передаются в стеке и возвращаются в регистре АХ/ЕАХ, — это способ, принятый в языке PASCAL (а также в BASIC, FORTRAN, ADA, OBERON, MODULA2), — просто поместить параметры в стек в естественном порядке.

some_proc proc push ebp mov ebp,esp ; пролог mov eax, [ebp+20] ; a mov ebx, [ebp+16] ; b mov ecx, [ebp+12] ; c mov edx, [ebp+8] ; d ... pop ebp ; эпилог ret 16 some_proc endp

 В этом случае запись
some_proc(a,b,c,d);
запишется как
push a push b push с push d call some_proc@16

Слайд 8

Использование Ассемблера в ЯВУ Конвенция С используется, в первую очередь, в

Использование Ассемблера в ЯВУ

Конвенция С используется, в первую очередь, в языках

С и C++, а также в PROLOG и других. Параметры помещаются в стек в обратном порядке, и, в противоположность PASCAL-конвенции, удаление параметров из стека выполняет вызывающая процедура.

some_proc proc push ebp mov ebp,esp ; пролог mov eax, [ebp+8] ; a mov ebx, [ebp+12] ; b mov ecx, [ebp+16] ; c mov edx, [ebp+20] ; d ... pop ebp ret  some_proc endp

Запись some_proc(a,b,c,d) будет выглядеть как
push d push с push b push a call some_proc@16 add esp,16 ; освободить стек

Слайд 9

Использование Ассемблера в ЯВУ Смешанные конвенции Существует конвенция передачи параметров STDCALL,

Использование Ассемблера в ЯВУ

Смешанные конвенции
Существует конвенция передачи параметров STDCALL, отличающаяся и

от C, и от PASCAL-конвенций, которая применяется для всех системных функций Win32 API. Здесь параметры помещаются в стек в обратном порядке, как в С, но процедуры должны очищать стек сами, как в PASCAL.
Еще одно отличие от С-конвенции – это быстрое или регистровое соглашение FASTCALL. В этом случае параметры в функции также передаются по возможности через регистры.

some_proc(a,b,с,d,e,f);
mov a, eax
mov b, edx
mov c, ecx
mov d, [ebp+8] mov e, [ebp+12] mov f, [ebp+16]

Слайд 10

Использование Ассемблера в ЯВУ Возврат результата из процедуры Чтобы возвратить результат

Использование Ассемблера в ЯВУ

Возврат результата из процедуры

Чтобы возвратить результат в программу

на С из процедуры на ассемблере, перед возвратом управления в вызываемой процедуре (на языке ассемблера) необходимо поместить результат в соответствующий регистр:
Слайд 11

Использование Ассемблера в ЯВУ Тонкости вызова методов между С++ и Asm

Использование Ассемблера в ЯВУ

Тонкости вызова методов между С++ и Asm

1. Если

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

EXTRN printf : proc ;we'll use printf
Далее можно просто использовать call:
;printf(ebx,eax)
push eax;
push ebx
call printf
add esp, 8 ;pop x2

Слайд 12

Использование Ассемблера в ЯВУ Тонкости вызова методов между С++ и Asm

Использование Ассемблера в ЯВУ

Тонкости вызова методов между С++ и Asm

2. Если

же надо вызывать пользовательские методы, то кроме п.1 надо еще писать extern «C» перед определением метода.

extern "C"
void* readName()
{
char* name = (char*)calloc(1, 255);
scanf("%s", name);
while (getchar() != '\n');
return name;
}
Соответственно, в *.asm файле:
EXTRN readName : proc ;and void* readName()
и
call readName ;eax = readName()

Слайд 13

Использование Ассемблера в ЯВУ Тонкости вызова методов между С++ и Asm

Использование Ассемблера в ЯВУ

Тонкости вызова методов между С++ и Asm

3. случае

использования Asm-методов в C++ достаточно лишь указать прототип:

extern "C"
{
void sayHello();
}
Данный прототип соответствует такому объявлению Asm-метода:
sayHello PROC
call readName ;eax = readName()
lea ebx, helloFormat ;ebx = &helloFormat
;printf(ebx,eax)
push eax
push ebx
call printf
add esp, 8 ;pop x2
retn
sayHello ENDP