Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_12-14_2011_protsedury_SRC_slaydy.doc
Скачиваний:
9
Добавлен:
21.12.2018
Размер:
1 Mб
Скачать
  1. Выполнить трансляцию модуля modul1.Asm и получить объектный модуль modul1.Obj;

  2. Выполнить трансляцию модуля modul2.Asm и получить объектный модуль modul2.Obj;

  3. Cкомпановать программу утилитой tlink командной строкой вида:

tlink /v modul1.obj+ modul2.obj

В итоге будет создан исполняемый модуль modul1.obj и можно будет исследовать данный модуль в отладчике, но при этом в турбо дебагере можно будет увидеть только текст программы modul1. Для того, чтобы войти в вызываемую процедуру, необходимо нажимать клавишу F7. Обработка этой команды приведёт к открытию второго окна, в котором будет выведен текст вызванной процедуры.

Взаимодействие ассемблерных модулей с модулями, написанными на языках высокого уровня

Рассмотрим простой модуль на языке ассемблера, содержащий процедуру, копирующую одну строку в другую. Подсоединяем этот модуль к программам, написанным на языке Си и Паскаль, с использованием трех трансляторов: Borland C++, Visual C++, Delphi.

Borland C++ 5.0

1) В С++ функции, вызываемые из ассемблерного модуля объявляются при помощи модификаторов extern "С" и stdcall.

2) Если модуль на языке ассемблера транслируется с помощью транслятора TASM, проблемы с подчеркиванием не возникает.

3) Тип вызова stdcall предполагает, что стек освобождается в вызываемой процедуре.

4) В ассемблерном модуле вызываемая процедура должна быть дополнительно объявлена при помощи директивы public.

Пример использования процедуры из внешнего модуля. Используется транслятор BORLAND C++ 5.0.

// файл copyc.cpp

#include <windows.h>

#include <stdio.h>

extern "C" _stdcall COPYSTR(char *, char *);

void main()

{

char s1[100];

char *s2="Privet!";

printf("%s\n",(char *)COPYSTR(s1, s2));

ExitProcess(0);

}

; файл copy.asm

.386P

; эта процедура будет вызываться из внешнего модуля

PUBLIC COPYSTR

.MODEL FLAT, stdcall

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

; процедура копирования одной строки в другую

; строка, куда копировать [EBP+08Н]

; строка, что копировать [EBP+0CН]

; не учитывает длину строки, куда производится копирование

COPYSTR PROC

PUSH EBP

MOV EBP,ESP

MOV ESI,DWORD PTR [EBP+0CH]

MOV EDI,DWORD PTR [EBP+08H]

L1:

MOV AL,BYTE PTR [ESI]

MOV BYTE PTR [EDI],AL

CMP AL,0

JE L2

INC ESI

INC EDI

JMP L1

L2:

MOV EAX,DWORD PTR [EBP+08H]

POP EBP

RET 8

COPYSTR ENDP

_TEXT ENDS

END

Трансляция модулей

1-й способ.

В начале TASM32 /ml copy.asm

Затем в проект Borland C++ включить файл copy.obj.

2-й способ.

В проект включить сразу файл copy.asm, тогда транслятор автоматически вызовет TASM32.EXE.

3-й способ. Трансляция из командной строки. Предварительно готовим командный файл copy. Содержимое файла:

copyc.cpp

copy.obj

Далее вызываем bcc32 @сору.

4-й способ. В командном файле вместо copy.obj помещаем файл copy.asm.

2) Visual C++ 6.0 (процедура копирования одной строки в другую).

Текст на языке C++ не изменится, а вот ассемблерный текст необходимо изменить.

Транслятор Си автоматически добавит в конец вызываемой функции @8. Для этого необходимо явно указать параметры при объявлении процедуры. После этого к имени COPYSTR транслятор добавит @8. При таком объявлении не нужно явно устанавливать регистр EBP и освобождать стек – это все автоматически сделает транслятор.

Модуль на языке ассемблера для компоновки с помощью пакета Visual C++ 6.0.

; файл proc.asm

.386P

.MODEL FLAT, stdcall

PUBLIC COPYSTR

; плоская модель

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

; процедура копирования одной строки в другую

; строка, куда копировать [EBP+08H]

; строка, что копировать [EBP+0CH]

; не учитывает длину строки, куда производится копирование

; явное указывание параметров

COPYSTR PROC str1:DWORD, str2:DWORD

MOV ESI,str2 ; DWORD PTR [EBP+0CH]

MOV EDI,str1 ; DWORD PTR [EBP+08H]

L1:

MOV AL,BYTE PTR [ESI]

MOV BYTE PTR [EDI],AL

CMP AL,0

JE L2

INC ESI

INC EDI

JMP L1

L2:

MOV EAX,DWORD PTR [EBP+08H]

RET

COPYSTR ENDP

_TEXT ENDS

END

Явное указание параметров в заголовке процедуры приводит:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]