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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 15:25   #1
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию преобразование 32-битного int в строку

Код:
PCHAR CharStr::TrancfType (const int number) {
		__asm {
			mov eax,number			// получаем number
			test eax,0x80000000		// проверяем знак
			jz	start			// если положительное

			or	eax,0x7FFFFFFF		// приводим к "псевдо" положительному значению
			push 0x2D			// знак '-'
			inc	eax
			test eax,0x80000000		// проверяем переполнение
			jz	start			// если нет

			mov eax,0x30000000 		// если да
			mov ebx,0x28000000
			mov edx,1
			jmp division

start:			mov ebx,0x50000000		// инициализируем делитель /10
			xor edx,edx			// очищаем результат деления
			
division:			sub eax,ebx			// вычитаем делитель
			js	minus			// обработка отрицательного результата

			sal edx,1			// смещаем результат
			inc edx				// добавляем бит '1' в результат
			jmp next1

minus:			sal edx,1			// добавляем бит '0' в результат
			add eax,ebx			// востанавливаем number
			
next1:			sar ebx,1			// смещаем делитель
			cmp ebx,0xA			// проверяем на valid-ость
			js	residue			// записываем остаток
			jmp division			// продолжаем деление
			
residue:			add eax,0x30			// приводим к символу ASCII
			push eax			// записывае символ ASCII
			inc ecx				// подсчитываем кол. символов
			mov eax,edx			// записываем новый number
			test eax,eax			// проверяем на окончание числа
			jz end				// вывод результата
			jmp start			// ищем следующее число

end:			push ecx
			test ecx,0x3
			jz next2
			add ecx,4

next2:			sar ecx,2
			push ecx			// сохраняем требуемое количество BYTE
			call new				// вызываем new
			add esp,4
			mov ebx,eax			// копируем адрес свободной памяти
			pop ecx				// настраиваем счетчик
print:			pop edx				// извлекаем символ ASCII
			mov byte ptr [ebx],dl		// записывае символ ASCII
			inc ebx				// переводим указатель на следуйщий элемент
			loop print			// выбраны ли все символы
			mov byte ptr [ebx],0
	};
};
Буду признателен за любой комментарий
Если Вам нравится код то ...
Имею хитрый план по личному обогащению

Последний раз редактировалось _ILYA_; 07.11.2010 в 15:35. Причина: думаю медленно
_ILYA_ вне форума Ответить с цитированием
Старый 07.11.2010, 15:42   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Наверное, все-таки стоило это поместить в Форум Программистов > Низкоуровневое Программирование > Assembler
Кстати, зачем точки с запятой после закрытия блоков и где возвращаемое значение?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 07.11.2010 в 15:47.
Syuf вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Char строку в int массив (C) Ael Общие вопросы C/C++ 6 06.11.2010 00:22
преобразование 8-битного набора символов в 7-битный. 0479 Помощь студентам 4 21.09.2010 21:34
int в строку. VintProg Visual C++ 15 03.07.2010 10:04
Преобразование int в String^ в С++ Mixasik Помощь студентам 1 21.06.2009 18:57
преобразование int в double Си++ t1empo Помощь студентам 11 27.04.2009 19:31