Трансляция модулей на 3.7.1.
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
. В этом случае пришлось отказаться от нашей обычной
детализации программы и положится на транслятор MASM. Для этого потребовалось
явно указать параметры при объявлении процедуры. Как только это было сделано,
транслятор взял часть работы на себя, кроме того, к имени COPYSTR
он, естественно, добавил @8
. Лишний раз подчеркну, что при таком
объявлении не нужно явно устанавливать регистр EBP
и освобождать
стек - за нас все делает транслятор.
; файл 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 ENDPuc. 3.7.2. Модуль на языке ассемблера для компоновки с помощью пакета Visual C++ 6.0.
Комментарий к программе на Рис. 3.7.2.
Явное указание параметров в заголовке процедуры приводит:
- К имени процедуры в объектном модуле автоматически добавляется
@8
(а не@0
).- Ассемблер автоматически управляется со стеком.
Трансляция.
- В проект Visual C++ включается уже объектный модуль, откомпилированный первоначально с помощью ml.exe.
- Если Вы хотите включить в проект ассемблерный текст. Вам придется для него указать способ трансляции, т.е. командную строку для программы ML.EXE.
3) Delphi 5.0
Транслятор Delphi также вносит незначительные нюансы в данную проблему. Для сегмента кода нам придется взять название
CODE
. Из-за того, что строки Паскаль понимает несколько иначе, чем, скажем, Си, в качестве строк мне пришлось взять символьный массив. Впрочем, операторwriteln
оказался довольно интеллектуальным и понял все с полуслова. Обратите внимание, что директиваstdcall
используется и здесь.{ программа COPYD.PAS, использующая ассемблер путем подключения объектного модуля } program Project2; uses SysUtils; {$APPTYPE CONSOLE} {$L 'copy.OBJ'} procedure COPYSTR(s1,s2 : PChar); stdcall; EXTERNAL; var s1,s2 : array[1..30] of char; begin s2[1] ='P'; s2[2] ='r'; s2[3] ='i'; s2[4] ='v'; s2[5] ='e'; s2[6] ='t'; s2[7] = char(0); COPYSTR(addr(s1[1]),addr(s2[1])) ; Writeln(s1); end. ; файл proc.asm .386P .MODEL FLAT, stdcall PUBLIC COPYSTR ; плоская модель CODE SEGMENT DWORD PUBLIC USE32 'CODE' ; процедура копирования одной строки в другую ; строка, куда копировать [EBP+08Н] ; строка, что копировать [EBP+0CH] ; не учитывает длину строки, куда производится копирование 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 CODE ENDS END