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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 08:07   #1
nartov55
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 21
Счастье Inline assembler C++ функция swap().

Если написать так, то всё работает.
Код:
#include "stdafx.h"

int main()
{
	int a=1, b=2;
	_asm
	{
		mov eax, a
		mov ecx, b
		mov a, ecx
		mov b, eax
	}
	printf("%d %d\n",a,b);
	return 0;
}
А если написать так, то нет.

Код:
#include "stdafx.h"

void swap(int&,int&);

int main()
{
	int a=1,b=2;
	swap(a,b);
	printf("%d %d\n",a,b);
	return 0;
}

void swap(int &a, int &b)
{
	
	_asm
	{
		mov eax, a
		mov ecx, b
		mov a, ecx
		mov b, eax
	}
}
Вопрос, почему второй вариант работать отказывается?
nartov55 вне форума Ответить с цитированием
Старый 01.04.2012, 09:37   #2
nartov55
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 21
По умолчанию

Ну вот, как слово про ассемблер, так сразу все молчат
nartov55 вне форума Ответить с цитированием
Старый 01.04.2012, 14:44   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Не потому что слово про ассемблер, а потому что вы не можете адекватно описать неработоспособность программы. "Не работает" - это фраза начинающих юзеров, а программист должен объяснить, как именно не работает. Не компилится? Не меняются значения?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 01.04.2012, 15:03   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

а случаем "mov eax, a" не записывает в еах ссылку? что-то мне кажется, что оно значение самого а записывает т.е. адрес переменной с которой вызвали ф-ию
попробуйте:
Код:
void swap(int &a, int &b)
{
	
	_asm
	{
		mov eax, a
		mov ecx, b
		mov a, [ecx]
		mov b, [eax]
	}
}
я не пробовал, извините уж, просто предположение) в Делфи такие ошибки допускал

Последний раз редактировалось GreenWizard; 01.04.2012 в 15:06.
GreenWizard вне форума Ответить с цитированием
Старый 04.04.2012, 12:27   #5
nartov55
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 21
По умолчанию

Фи, уже и пошутить нельзя. Ну да ладно, В данном примере не меняются значения переменных, а сам код компилируется нормально.
nartov55 вне форума Ответить с цитированием
Старый 04.04.2012, 12:33   #6
nartov55
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 21
По умолчанию

GreenWizard, Спасибо за помощь, но увы такой вариант даже компилироваться отказывается. Жалуется на скобки.
nartov55 вне форума Ответить с цитированием
Старый 04.04.2012, 12:55   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

nartov55

Вопрос, почему второй вариант работать отказывается?

потому что ты не умеешь работать с косвенной адресацией.
твой код эквивалентен следующему:

Код:
void swap(int* a, int* b)
{
   int* с = a;
   a = b;
   b = c;
}
Ну вот, как слово про ассемблер, так сразу все молчат

очевидно, никому не интересно объяснять основы ассемблера...
Rififi вне форума Ответить с цитированием
Старый 04.04.2012, 14:28   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от nartov55 Посмотреть сообщение
GreenWizard, Спасибо за помощь, но увы такой вариант даже компилироваться отказывается. Жалуется на скобки.
странно, ведь для асма вполне валидный код
поищите инфу про формат асма в С++ и как там обратиться по адресу записанного в регистре
GreenWizard вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
inline assembler qt lem Qt и кроссплатформенное программирование С/С++ 5 15.08.2011 12:08
SWAP функция moon-guest Общие вопросы C/C++ 4 14.11.2010 18:17
gcc inline assembler - обнуление переменной gvf Помощь студентам 1 13.06.2010 19:33
Swap nusik Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2009 12:45