Вторник, 15.07.2025, 22:33 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Глава 7. Использование ассемблера с языками высокого уровня(2)

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

Трансляция модулей на 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
END

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

Комментарий к программе на Рис. 3.7.2.

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

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

Трансляция.

  1. В проект Visual C++ включается уже объектный модуль, откомпилированный первоначально с помощью ml.exe.
  2. Если Вы хотите включить в проект ассемблерный текст. Вам придется для него указать способ трансляции, т.е. командную строку для программы 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


Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0