.data?
hResult dd ?
call/invoke SomeFunc
mov hResult,eax
В Си аналогичный код выглядит проще:
HANDLE hResult;
hResult = SomeFunc();
Казалось бы чего там, одна строчка, но в большом проекте таких строк может быть много, можно ошибиться, забыть. Для упрощения можно использовать макрос FUNC.
mov hResult,FUNC(SomeFunc)
;(переменную hResult нужно объявлять)
mov hFile, fcreate("test.log")
Узнать размер файла:
mov flen, fsize(hFile)
Записать туда данные:
mov bwritten, fwrite(hFile,buffer,bcnt);хендл,адрес буфера с данными, к-тво ;байт для записи
invoke write_disk_file, chr$("file.txt"),addr lpData,fl;имя, буфер, к-тво байт для ;записи
invoke StdOut,chr$("console")
Или даже так:
print "console"
Естественно, никакого волшебства тут нет, в основе всего этого лежит тот жe WinApi.
Особенности:
Создаётся отдельный .ASM файл, процедуры которого вызываются из высокоуровневого С++ кода.
Преимущества:
Относительно простой способ;
Недостатки:
Ассемблерный код будет размещён всегда отдельном файле;
Необходимость прописывать прототипы ASM функций в С++ коде
Особенности:
Если надо вызывать из ассемблера библиотечные методы, достаточно в начале секции кода указать, какие именно методы мы собираемся использовать.
(ASM)
EXTRN printf : proc ;we'll use printf
Далее можно просто использовать call:
(ASM)
;printf(ebx,eax)
push eax;
push ebx
call printf
add esp, 8 ;pop x2
Если же вы захотите использовать invoke (что удобнее и логичнее), то нужно прописать прототип
(ASM)
.data
helloFormat BYTE "Hello, %s!", 10, 13, 0
whatToPrint DWORD “PrintIt”
printf PROTO arg1:Ptr Byte, printlist: VARARG ; Мы используем Сишный printf с ;описанием прототипа
Далее можно просто использовать invoke:
(ASM)
invoke printf, ADDR helloFormat, whatToPrint
Если вы хотите из Asm файла вызывать методы С++ то используется указанный ранее подход, но при этом в С++ файле у вызываемого метода вы должны сделать приписку extern "C"
(C++)
extern "C"
void* readName()
{
char* name = (char*)calloc(1, 255);
scanf("%s", name);
while (getchar() != '\n');
return name; //eax= name
}
(ASM)
invoke readName ; eax=name
Если вам нужно вызвать ASM методы из C++, то в С++ нужно прописать прототип:
(C++)
extern "C"
{
long calcSumm(long a, long * retAddr);
}
…
int _tmain(int argc, _TCHAR* argv[])
{
long retVar=1;
long res=calcSumm(31,&retVar);
}
(ASM)
calcSumm PROC a:DWORD,retAddr:DWORD
…
ret
calcSumm ENDP
Особенности:
На основе ASM файла генерируется *.DLL, которая вызывается в языках высокого уровня.
Преимущества:
Универсальный способ, подходящий для связи многих языков;
Недостатки:
Ассемблерный код будет размещён в отдельном файле;
Необходимость приписывать вызов функций из DLL.
Быстро создать шаблон DLL для MASM вы можете из редактора MASM32
Далее нужную функцию или функции нужно просто вызвать из DLL средствами вашего языка программирования. Например так:
(C++)
include "stdafx.h"
#include
#pragma comment(lib,"..\\Debug\\MasmDLL.lib")
extern "C" void _stdcall TestProc1(char lpString[]);
int _tmain(int argc, _TCHAR* argv[])
{
char hello[] = "Hello World!";
TestProc1(hello);
printf("Press Enter To Exit...");
getchar();
return 0;
}
(С++)
__asm push ebp
__asm mov ebp, esp
__asm sub esp, __LOCAL_SIZE
Кроме того, можно поставить __asm перед каждой инструкцией по сборке.
Поскольку ключевое слово __asm является разделителем операторов, можно также помещать инструкции ассемблера на одной строке.
(С++)
__asm push ebp __asm mov ebp, esp __asm sub esp, __LOCAL_SIZE
(С++)
__asm{…}
(C++)
int _tmain(int argc, _TCHAR* argv[])
{
char format[] = "%s %s\n";
char hello[6] = "Hello";
char world[] = "World";
__asm //Ассемблерная вставка
{
lea eax,world // eax = адрес earth
push eax // поместить eax в вершину стека
lea eax,hello // eax = адрес hello
push eax
lea eax,format
push eax
call DWORD ptr printf
// или использя непрямой вызов
// mov eax, printf
// call eax
pop ebx // чистим стек
pop ebx
pop ebx
}
getchar();// ждем нажатие кнопки
return 0;
}
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть