Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2015, 00:33   #1
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию Ассемблерные вставки в C++

Может быть, кому-нибудь будет интересно?

Код:
#include <stdio.h>

void main()
{
int a;
int res;
int* r;
int* z;
int y;

z = new int[10];

__asm
{

// a = 5
mov eax, 5
mov ebx, 6
mov ecx, 7
mov edx, 8
mov a, eax

// r = &a
lea ebx, a
mov r, ebx

// y = *r
mov ecx, r
mov edx, [ecx]
mov y, edx

// z[0] = 8
mov ecx, z
mov edx, 5
mov [ecx], edx

// z[1] = 7
mov edx, 7
mov dword ptr [ecx+4], edx

// z[2] = 8
mov edx, 8
mov dword ptr [ecx+8], edx

}

res = *r;

printf("%x %x %x %x %d %d %d\n", r, &a, res, y, z[0], z[1], z[2]);

}

/*
// IDA Pro
// main
sub_401000 proc	near

var_18=	dword ptr -18h
var_14=	dword ptr -14h
var_10=	dword ptr -10h
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4

push	ebp
mov	ebp, esp
sub	esp, 18h
push	ebx //z
push	28h //10

// new
call	sub_40116D

add	esp, 4 //выравнивание стека по размеру аргументов (4 байта)

// z = 
mov	[ebp+var_18], eax
mov	eax, [ebp+var_18]
mov	[ebp+var_10], eax

mov	eax, 5
mov	ebx, 6
mov	ecx, 7
mov	edx, 8

// mov a, eax
mov	[ebp+var_C], eax


// lea ebx, a
lea	ebx, [ebp+var_C]

// mov r, ebx
mov	[ebp+var_14], ebx


// res = *r;
mov	ecx, [ebp+var_14] // ecx = r
mov	edx, [ecx] // edx = *r
mov	[ebp+var_4], edx // res = edx


// printf("%x %x %x %x\n", r, &a, res, y);

mov	eax, [ebp+var_8] // y
push	eax

mov	ecx, [ebp+var_4] // res
push	ecx

lea	edx, [ebp+var_C] // a
push	edx

mov	eax, [ebp+var_14] // r
push	eax

push	offset aXXXX	; "%x %x %x %x\n"

// printf
call	sub_401061 

add	esp, 14h //выравнивание стека на 20 байт

pop	ebx
mov	esp, ebp
pop	ebp
retn
sub_401000 endp
*/
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 17.02.2015, 10:56   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Вставки для работы со структурами и для вызова функции

Код:
#include <stdio.h>
#include <windows.h>

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")


struct q
{
int a;
int b;
};


void main()
{
int a;
int res;
int* r;
int* z;
int y;
q w;

w.a = 3;
w.b = 4;

int c1;
int c2;
int c3;

char* s1 = "a1\0";
char* s2 = "a2\0";

z = new int[10];

__asm
{

// a = 5
mov eax, 5
mov ebx, 6
mov ecx, 7
mov edx, 8
mov a, eax

// r = &a
lea ebx, a
mov r, ebx

// y = *r
mov ecx, r
mov edx, [ecx]
mov y, edx

// z[0] = 8
mov ecx, z
mov edx, 5
mov [ecx], edx

// z[1] = 7
mov edx, 7
mov dword ptr [ecx+4], edx

// z[2] = 8
mov edx, 8
mov dword ptr [ecx+8], edx

// ebx = &w
lea ebx, w
mov edx, ebx
// c3 = &w
mov c3, edx
// c1 = w.a
mov ecx, [edx]
mov c1, ecx
add edx, 4
mov ecx, [edx]
// c2 = w.b
mov c2, ecx

//
push 0

mov ebx, s1
push ebx

mov ecx, s2
push ecx

push 0

call ds:MessageBoxA


}

res = *r;

printf("%x %x %x %x %d %d %d %d %d %d\n", r, &a, res, y, z[0], z[1], z[2], c1, c2, c3);

}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 17.02.2015, 10:58   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Использование двоичных констант в ассемблерной вставке

Код:
#include <stdio.h>
void main()
{
int res;
__asm
{
mov eax, 100000b
mov res, eax
}
printf("%d\n", res);
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 17.02.2015, 11:00   #4
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Программирование простейшего цикла в ассемблерной вставке

Код:
#include <stdio.h>

void main()
{
int d = -175;
int res;

__asm
{
mov eax, d
mov ebx, -54

cycle:
cmp ebx, 0
jz exit
add eax, -1
add ebx, 1
jmp cycle

exit:
mov res, eax
}

printf("%d\n", res);

}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 17.02.2015, 11:49   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

По мне так проще написать код во внешнем ASM модуле и слинковать.
waleri вне форума Ответить с цитированием
Старый 17.02.2015, 11:51   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Простейший цикл обычно через луп делается.
p51x вне форума Ответить с цитированием
Старый 25.02.2015, 06:37   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Вызов функций

Существуют две конвенции передачи параметров в функцию: __stdcall и __cdecl

При __stdcall параметры из стека выталкивает вызывающая функция
При __cdecl параметры из стека выталкивает вызванная функция

Если у функции (arg_0,arg_4) два параметра arg_0 и arg_4,
с которыми функция вызывается,
то при конвенции __cdecl перед вызовом функции параметры помещаются в стек справа налево,
и после этого производится вызов функции
Код:
push arg_4
push arg_0 
call функция
Подробнее: http://win32assembly.programminghorizon.com/tut1.html
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"

Последний раз редактировалось challengerr; 25.02.2015 в 06:42.
challengerr вне форума Ответить с цитированием
Старый 25.02.2015, 08:52   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Вызов функций

Существуют две конвенции передачи параметров в функцию: __stdcall и __cdecl
А __clrcall? __fastcall? __thiscall? __vectorcall?
p51x вне форума Ответить с цитированием
Старый 25.02.2015, 09:19   #9
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А __clrcall? __fastcall? __thiscall? __vectorcall?
Если вы это знаете, то сами и пишите, для чего это нужно.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 25.02.2015, 10:14   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

ну так и не вводите читателей в заблуждение и пишите не "существуют две", а "рассмотрим две"
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблерные вставки пример Evelin_18 Помощь студентам 2 13.12.2013 23:02
Ассемблерные вставки. Stasiksis Общие вопросы C/C++ 2 14.02.2013 22:34
Ассемблерные вставки в СИ sunny_alice Помощь студентам 0 22.12.2012 00:54
ассемблерные вставки в c++ chupchupps Помощь студентам 1 09.02.2011 11:54
Ассемблерные вставки Assassin Помощь студентам 1 26.05.2008 08:19