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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2011, 07:42   #1
progcpp
Новичок
Джуниор
 
Регистрация: 13.09.2011
Сообщений: 3
По умолчанию asm-вставки. перевод в "чистый" c++

Есть две функции в исходнике cpp. Мне нужно создать аналоги в чистом с++, но ассемблера вообще не знаю. Что они делают?
Код:
typedef BYTE *PBYTE

_inline int DUR(PBYTE p) 
{ 
	register int dur;
	_asm
		{
			xor		ebx,ebx
			mov		esi,[p]
			mov		bx,[esi + 5]
			mov		[dur],ebx
		}
	return dur;
}

_inline void SETDUR(void* p, int d) 
{ 
	_asm
		{
			mov		ebx,[d]
			mov		esi,[p]
			mov		[esi + 5],bx
		}
}

Последний раз редактировалось Stilet; 14.09.2011 в 21:42.
progcpp вне форума Ответить с цитированием
Старый 13.09.2011, 12:17   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
return (reinterpret_cast<int *>(p+5)[0] & 0xFFFF);

reinterpret_cast<short *>(p+5)[0] = (d & 0xFFFF);

Последний раз редактировалось f.hump; 13.09.2011 в 12:33.
f.hump вне форума Ответить с цитированием
Старый 13.09.2011, 13:37   #3
progcpp
Новичок
Джуниор
 
Регистрация: 13.09.2011
Сообщений: 3
По умолчанию

reinterpret_cast<short *>(p+5)[0] = (d & 0xFFFF);

void* - неизвестный размер
progcpp вне форума Ответить с цитированием
Старый 13.09.2011, 13:55   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
PBYTE xxx = reinterpret_cast<PBYTE>(p);
reinterpret_cast<short *>(xxx+5)[0] = (d & 0xFFFF);
f.hump вне форума Ответить с цитированием
Старый 13.09.2011, 17:36   #5
progcpp
Новичок
Джуниор
 
Регистрация: 13.09.2011
Сообщений: 3
По умолчанию

ОК, благодарю, все работает. У меня там правда еще 3 функции, но примерно понял, попробую сам разобраться.

Да, беда.. Таки с одной то вроде разобрался:
Код:
_inline void COPYEVNT(void* d, void* s)
{
	//_asm
	//	{
	//		mov		edi,[d]
	//		mov		esi,[s]
	//		movsd
	//		movsd
	//	}
	PBYTE db = reinterpret_cast<PBYTE>(d);
	PBYTE sb = reinterpret_cast<PBYTE>(s);
	*db=*sb;
	db++;
	sb++;
	*db=*sb;
}
Вот с этими двумя сложнее. Пошагово вроде разобрался, и прокомментировал каждый шаг, но..
Код:
_inline int PITCH(PBYTE p)
 {
	register int pch;
	_asm
		{
			mov		esi,[p]	//помещаем значение p в регистр esi
			mov		bx,[4 + esi] //помещаем 4й esi в регистр bx?
			shl		bl,1//умножаем младший байт от bx *2
			shr		bx,1// bx/2
        	sub		bx,0x2000// -8192
			movsx	eax,bx // преобразование числа со знаком в большую размерность
			sar		eax,5 // целое число со знаком делим на 2^5(32)
			mov		[pch],eax // помещаем результат в int
		}
	return pch;
 }



 _inline void SETPITCH(void* p, int pch)

 {
	_asm
		{
			mov		ebx,[pch] // помещаем значение pch в регистр ebx
			sal		ebx,5 // ebx=ebx*2^5(32)
			add		ebx,0x2000 // ebx=ebx+8192
			shl		ebx,1 // ebx=ebx*2
			shr		bl,1 // делим младший байт от bx bl/2
			mov		esi,[p]
			mov		[4 + esi],bx
		}
 }

Последний раз редактировалось Stilet; 14.09.2011 в 21:43.
progcpp вне форума Ответить с цитированием
Старый 14.09.2011, 20:52   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
int * aaa = reinterpret_cast<int *>(d), * bbb = reinterpret_cast<int * >(s);
aaa[0] = bbb[0]; aaa[1] = bbb[1];


int pch = -256 + (p[0] & 0x03) + (p[1]<<2);

reinterpret_cast<short *>(p)[0] = 0x4000+((pch << 5) & 0xFF) + ((pch << 6) & 0xFF00);
че-то типа того
f.hump вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Error: 32-bit record encountered in module 1.ASM : use "/3" option Peroteh Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.03.2011 08:35
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Перевод "пространственных" координат в "экранные" , смена перспективы , вращение. vedro-compota Общие вопросы Delphi 6 08.06.2010 21:59
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04