Сложение двух целых чисел.

Трансляция.

Ассемблер автоматически управляется со стеком.

Й способ.

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

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

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

 

2-й способ.

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

 

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

copyc.cppcopy.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, stdcallPUBLIC 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 L1L2: MOV EAX,DWORD PTR [EBP+08H] RETCOPYSTR ENDP_TEXT ENDSEND

 

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

1. К имени процедуры в объектном модуле автоматически добавляется @8 (а не @0).

 

1. В проект Visual C++ включается уже объектный модуль, откомпилированный первоначально с помощью ml.exe.

2. Если необходимо включить в проект ассемблерный текст, то нужно для него указать способ трансляции, т.е. командную строку для программы ML.EXE.


; файл insert.asm

.386

.model flat,stdcall

.CODE

PUBLIC _power2

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

_power2 PROC

push ebp ; Входная последовательность-сохранение старого BP

mov ebp,esp ;Установка указателя на запись активации

mov eax,[ebp+8] ;Загрузка Arg 1 в AX

mov ecx,[ebp+0Ch] ;Загрузка Arg 2 в CX

add eax,ecx

;Возвращаемое значение остается в AX

pop ebp ;Выходная последовательность-востановление старого BP

ret ;Выход

_power2 ENDP

_TEXT ENDS

END

 

 

Программа на С++:

#include <windows.h>

#include <stdio.h>

#include "stdafx.h"

 

extern "C" _stdcall power2(int, int);

int main()

{

int a = 3;

int b = 5;

printf("a + b = %d + %d = %d\n", a, b, power2(a,b));

return 0;

}