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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2012, 21:44   #11
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
class A {
private:
	static const int AWX = 3;
	static const int AHY = 5;
	int a[AWX][AHY];

public:
	A() {

		for (int i(0);i<AWX;i++)
                         for(int j(0);j<AHY;j++) a[i][j] = rand();

	}

	int Calc(int i, int j)
	{
		__asm {
                           PUSH esi
                           PUSH ebx

                           MOV esi, ecx
                           ADD esi, A::a

                           XOR edx, edx
                           MOV ecx, [i]
                           MOV eax, A::AHY
                           SHL eax, 2
                           MOV ebx, eax
                           MUL ecx
                           ADD esi, eax

                           MOV ecx, [j]
                           SHL ecx, 2
                           XOR eax, eax
                           ADD esi, ecx

                           ADD eax, [esi-4]
                           ADD eax, [esi+4]

                           ADD eax, [esi+ebx]
                           SUB esi, ebx
                           ADD eax, [esi]

                           SAR eax, 2
                           ADD eax, 1

                           POP ebx
                           POP esi
		}

	}

};

void main()
{
	A a;
	printf("%d\r\n", a.Calc(1, 3));

}
типа так

Последний раз редактировалось f.hump; 10.07.2012 в 22:54. Причина: ADD eax, [esi+edx-ebx]. who cares?
f.hump вне форума Ответить с цитированием
Старый 10.07.2012, 22:19   #12
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Код:
                           ADD eax, [esi+edx-ebx]
fail... double fail...
Somebody вне форума Ответить с цитированием
Старый 11.07.2012, 09:53   #13
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Код:
		__asm {
                           PUSH esi
                           PUSH ebx
это, кстати, делать не обязательно
компилятор сам в состоянии понять какие регистры надо сохранить
(если, конечно, не делать naked функцию)
Vort вне форума Ответить с цитированием
Старый 11.07.2012, 10:03   #14
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2Vort
ассемблерная вставка в VS, это ассемблерная вставка в VS.
и по личному опыту компилятор себя сильно не утруждает в плане сохранения регистров, используемых во вставке. возможно, это к лучшему, и возможно, по этой причине вставки не поддерживаются для 64-х битного кода.
f.hump вне форума Ответить с цитированием
Старый 11.07.2012, 10:41   #15
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

а вот вариант, подсказанный самим компилятором
Код:
// VS2010
#include <stdio.h>
#include <memory.h>

#define AWX 3
#define AHY 5

class A
{
public:
	int i, j, s;
	int a[AWX][AHY];

public:
	A()
	{
		i = 1;
		j = 3;
		s = -1;

		memset(a, 0x00, AWX * AHY * 4);

		a[i][j-1] = 4000;
		a[i-1][j] = 800;
		a[i+1][j] = 120;
		a[i][j+1] = 12;
	}

	void __thiscall Calc();

	void Print()
	{
		printf("%d\r\n", s);
	}
};

__declspec(naked) void __thiscall A::Calc()
{
	__asm
	{
		push eax
		push edx
		mov  edx, [ecx + A::i]
		imul edx, edx, AHY
		add  edx, [ecx + A::j]
		mov  eax, [ecx + A::a + edx * 4 - 1 * 4]
		add  eax, [ecx + A::a + edx * 4 + 1 * 4]
		add  eax, [ecx + A::a + edx * 4 - 4 * AHY]
		add  eax, [ecx + A::a + edx * 4 + 4 * AHY]
		sar  eax, 2
		inc  eax
		mov  [ecx + A::s], eax
		pop  edx
		pop  eax
		ret
	}
}

void main()
{
	A a;
	a.Calc();
	a.Print();
}
Vort вне форума Ответить с цитированием
Старый 12.07.2012, 13:34   #16
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию

всем спасибо, буду пробовать!
Веди вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблерная вставка Serg12 Помощь студентам 5 04.05.2017 19:43
Ассемблерная вставка panter Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.05.2012 22:41
Ассемблерная вставка _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 5 18.09.2010 14:31
Ассемблерная вставка! treki Помощь студентам 0 16.06.2010 00:15