Четверг, 17.07.2025, 18:42 Приветствую Вас Гость

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

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

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

Puc. 3.7.3. Пример подключения объектного модуля к программе на Delphi.

Трансляция.
Вам достаточно только подготовить объектный модуль (с помощью транслятора TASM32) и указать его в директиве {$L copy.obj} - далее транслятор сделает все сам.

II

В этом разделе используется другой тип вызова - быстрый, или регистровый. В соответствии с таблицей в начале главы, этот тип вызова предполагает, что три первых параметра будут передаваться в регистрах (EAX,EDX,ECX), а остальные в стеке, как и в случае соглашения stdcall. При этом если стек был задействован, освобождение его возлагается на вызываемую процедуру. Есть еще один нюанс. В случае быстрого вызова транслятор Си добавляет к имени значок @ спереди, что мы естественно учитываем в ассемблерном модуле.

#include <windows.h>
#include <stdio.h>
// файл ADDC.cpp
// объявляется внешняя функция сложения четырех целых чисел
extern "C" _fastcall ADDD(DWORD, DWORD, DWORD, DWORD);
void main()
{
 DWORD a,b,c,d;
 a=1; b=2; c=3; d=4;
 printf("%lu\n",(DWORD *)ADDD(a,b,c,d));
 ExitProcess(0);
}

; файл add.asm
.386P
.MODEL FLAT, stdcall
PUBLIC @ADDD
; плоская модель
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; процедура возвращает сумму четырех параметров
; передача параметров регистровая
; первые три параметра в регистрах EAX,EDX,ECX
; четвертый параметр в стеке, т.е. [ЕРВ+08Н]
@ADDD PROC
 PUSH EBP
 MOV EBP,ESP
 ADD EAX,ECX
 ADD EAX,EDX
 ADD EAX,DWORD PTR [EBP+08H]
 POP EBP
 RET 4
@ADDD ENDP
_TEXT ENDS
END

Puc. 3.7.4. Пример регистрового соглашения вызова процедуры.

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

tasm32 /ml add.asm
Включаем add.obj в проект addc (Borland C++ 5.0)

III

В данном разделе я показываю, что вызываемая ассемблерная процедура может содержать не только какие-то вспомогательные процедуры, но и работу с функциями API и ресурсами. Причем, ресурсы, разумеется, являются для всех модулей проекта общими. Можно иметь несколько файлов, задающих ресурсы, но главное, чтобы не совпадали имена и идентификаторы.

#include <windows.h>
#include <stdio.h>
// объявляется внешняя функция
extern "C" _stdcall DIAL1();
void main()
{
 DIAL1();
 ExitProcess(0);
}

Рис. 3.7.5. Консольная программа на C++ вызывает процедуру (Рис. 3.7.6), определенную в ассемблерном модуле, которая, в свою очередь, работает в GUI-режиме.




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

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