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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 16:03   #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_ вне форума Ответить с цитированием
Старый 08.11.2010, 08:12   #2
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

велосипед с квадратными колесами в виде ассемблерной вствки.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 08.11.2010, 11:42   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

_ILYA_
test eax,0x80000000 // проверяем знак
jz start // если положительное
or eax,0x7FFFFFFF // после этой команды EAX=0xFFFFFFFF всегда!

вместо этого
js residue // записываем остаток
jmp division // продолжаем деление
residue:

правильнее будет
jns division // продолжаем деление
residue:

и вместо этого
jz end // вывод результата
jmp start // ищем следующее число
end:

аналогично
jnz start // ищем следующее число
end:
Mikl___ вне форума Ответить с цитированием
Старый 08.11.2010, 14:28   #4
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

функция itoa ??

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

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}
r9m вне форума Ответить с цитированием
Старый 08.11.2010, 19:18   #5
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
велосипед с квадратными колесами в виде ассемблерной вствки.
нельзя ли высказаться по существу вопроса?

Цитата:
Сообщение от r9m Посмотреть сообщение
функция itoa ??

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

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}
потому что это будет С++
я хотел на asm
мне казалось что это очевидно

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
_ILYA_
test eax,0x80000000 // проверяем знак
jz start // если положительное
or eax,0x7FFFFFFF // после этой команды EAX=0xFFFFFFFF всегда!

вместо этого
js residue // записываем остаток
jmp division // продолжаем деление
residue:

правильнее будет
jns division // продолжаем деление
residue:

и вместо этого
jz end // вывод результата
jmp start // ищем следующее число
end:

аналогично
jnz start // ищем следующее число
end:
да согласен так будет более логично и красиво
спасибо за то что отловили ощибку
Имею хитрый план по личному обогащению

Последний раз редактировалось Stilet; 09.11.2010 в 09:46.
_ILYA_ вне форума Ответить с цитированием
Старый 09.11.2010, 05:16   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

_ILYA_ медитируйте!
Код:
  ; ---------------------------------------------------------------
  ; This procedure was written by Tim Roberts
  ; Minor fix by Jibz, December 2004
  ; ---------------------------------------------------------------
    .code
dwtoa proc dwValue:DWORD, lpBuffer:DWORD
    ; -------------------------------------------------------------
    ; convert DWORD to ascii string
    ; dwValue is value to be converted
    ; lpBuffer is the address of the receiving buffer
    ; EXAMPLE:
    ; invoke dwtoa,edx,ADDR buffer
    ;
    ; Uses: eax, ecx, edx.
    ; -------------------------------------------------------------
    push ebx
    push esi
    push edi
    mov eax, dwValue
    mov edi, [lpBuffer]
    test eax,eax
    jnz sign
zero: mov word ptr [edi],30h
    jmp dtaexit
sign: jns pos
    mov byte ptr [edi],'-'
    neg eax
    add edi, 1
pos: mov ecx, 3435973837
    mov esi, edi
    .while (eax > 0)
      mov ebx,eax
      mul ecx
      shr edx, 3
      mov eax,edx
      lea edx,[edx*4+edx]
      add edx,edx
      sub ebx,edx
      add bl,'0'
      mov [edi],bl
      add edi, 1
    .endw
    mov byte ptr [edi], 0       ; terminate the string
    ; We now have all the digits, but in reverse order.
    .while (esi < edi)
      sub edi, 1
      mov al, [esi]
      mov ah, [edi]
      mov [edi], al
      mov [esi], ah
      add esi, 1
    .endw
dtaexit: pop edi
    pop esi
    pop ebx
    ret
dwtoa endp
Mikl___ вне форума Ответить с цитированием
Старый 09.11.2010, 10:24   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Еще один вариант -- перевод 64-разрядного числа из edx:eax в строку на которую указывает edi
Код:
.data
string db 20h dup(0);строка для вывода результатов
Data_Int64   dq 0;64-разрядное число
Data_BCD     dt 0;число в BCD-формате
     ....
.code
	mov edi,offset string
	or edx,edx      ;число 64-разрядное?
	jnz b1
	cmp eax,10	;число меньше 10?
        jae b0
	add al,30h
	stosb
        jmp exit
b0:	cmp eax,100    ;число меньше 100?
	jae b1
	aam
	add ax,3030h
	xchg ah,al
	stosw
	jmp exit
b1:	push ecx
	mov dword ptr Data_Int64,eax;младшая часть 64-разрядного числа
	mov dword ptr Data_Int64+4,edx;старшая часть 64-разрядного числа
	fninit			;сброс сопроцессора
	fild Data_Int64		;загрузить число в двоичном коде
	fbstp Data_BCD		;извлечь число в коде BCD
	mov ecx,9               ;в десятом байте информация о знаке числа
b2:     cmp byte ptr [ecx-1+Data_BCD],0
	jnz b3         
	loop b2      		;пропускаем незначащие (нулевые) разряды слева
b3:	mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов
        cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
	ja b4
	add al,30h		;младшую тетраду переводим в ASCII
	stosb
	dec ecx
b4:     xor ax,ax		;распаковываем остальные разряды числа
	mov al,byte ptr [ecx-1+Data_BCD]
	shl ax,4    		;выделяем старшую и младшую тетрады
	shr al,4
	add ax,3030h		;переводим в ASCII-код
	xchg ah,al
	stosw
	loop b4
	pop ecx
exit:

Последний раз редактировалось Mikl___; 09.11.2010 в 11:35.
Mikl___ вне форума Ответить с цитированием
Старый 09.11.2010, 22:08   #8
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

Спасибо Mikl оэто очень интересно, но пока не могу ответить, сильно занят, кто муже пишу алгоритм для перевода double в строку
Имею хитрый план по личному обогащению
_ILYA_ вне форума Ответить с цитированием
Старый 12.11.2010, 16:47   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функции перевода из числа в строку (в любую систему счисления) и из строки в число (только 2, 8, 10, 16 системы счисления)
смотрим и думаем над смыслом жизни.

Цитата:
Сообщение от _ILYA_ Посмотреть сообщение
Спасибо Mikl оэто очень интересно, но пока не могу ответить, сильно занят, кто муже пишу алгоритм для перевода double в строку
http://pblog.ru/?p=241 там есть алгоритмы перевода из вещественного числа в строку и из строки в вещественное число

Последний раз редактировалось rpy3uH; 12.11.2010 в 16:52.
rpy3uH вне форума Ответить с цитированием
Старый 13.11.2010, 23:09   #10
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
функции перевода из числа в строку (в любую систему счисления) и из строки в число (только 2, 8, 10, 16 системы счисления)
смотрим и думаем над смыслом жизни.


http://pblog.ru/?p=241 там есть алгоритмы перевода из вещественного числа в строку и из строки в вещественное число
Спасибо большое, к сожалению лучшее враг хорошего, я вынужден отказаться пока от таких тонкостей и отложить их на период оптимизации
Имею хитрый план по личному обогащению
_ILYA_ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование 32-битного int в строку _ILYA_ Общие вопросы C/C++ 1 07.11.2010 15:42
преобразование 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