Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод ASCII строки в число  (Прочитано 17752 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Айтишнег
Гость
« : 21-10-2009 17:05 » 

Не могу сделать перевод 10-чного числа введённого с клавиатуры из ASCII строки в число.
Код:
ASCIIDecToBin proc
push ebp
mov ebp,esp
push esi
push ecx
mov esi,[ebp+8]
xor eax,eax
xor ecx,ecx
m2: 
mov cl, byte ptr [esi]
cmp cl, 0Dh
je exit
cmp cl, 39h
jbe m1
invoke StdOut,$CTA0("First number must be in range 1...255")
invoke ExitProcess,0
m1:
sub cl,30h
or al,cl
shl eax,4
inc esi
jmp m2
exit:
shr eax,4
pop ecx
pop esi
pop ebp
ex:
ret 4
ASCIIDecToBin EndP
Входящие параметры : буфер со строкой
Каждый байт с кодом символа перевожу в число. Далее перемещаю его в первые 4 бита ЕАХ.
Сдвигаю ЕАХ на 4 бита влево для ноговго разряда.
Убираю лишний сдвиг после последнего розряда.
Только потом понял что полученное распазнаётся в 16-ричной системе.
Дайте совет.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-10-2009 17:44 » 

Вместо сдвига влево делать умножение на 10. Ну, и делать это сначала, а не в конце: проще умножить 0 на 10, чем потом делить результат на 10, избавляясь от лишнего "сдвига".
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 21-10-2009 17:54 » 

Сдвиг влево - умножение на степень числа 2.
Сдвиг влево на 4 - умножение на 16 (2^4), т.е основание системы 16.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 21-10-2009 20:56 » 

Offtopic:
Извиняюсь - немного поворчу: ну и когда очередной новичок будет поиском пользоваться - каждый раз надо рассказывать заново...
Поставлю в угол.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-10-2009 03:05 » new

это всё потому, что он "айтишнег"
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #5 : 16-02-2010 16:08 » 

Код:
format pe
entry start
section '.data' data readable writeable

bufer db '12345678',0;
section '.code' code readable executable
convert_char:
sub al,'0';
cmp al,10;
jb .done;
add al,'0';
and al,0x5f;
sub al,'A'-10;
and al,0x0f;
.done:
ret;
ASCIToNum:
push esi;
xor eax,eax;
xor ebx,ebx;
cmp byte [esi],'-';
jnz next;
inc esi;
next:
lodsb;
or al,al;
jz .done;
call convert_char;

imul ebx,ecx;
add ebx,eax;
jmp short next;
.done:
xchg ebx,eax;
pop esi;
cmp byte [esi],'-';
jz negative;
ret;
negative:
neg eax;
ret;
start:
mov esi,bufer;
mov ecx,10;
call ASCIToNum;

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines