Сложение двух целых чисел.
Трансляция.
Ассемблер автоматически управляется со стеком.
Й способ.
Трансляция модулей
В начале 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;
}