Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
1

StrToInt - можно ли быстрее и компактнее

19.07.2011, 13:06. Показов 2274. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
StrToInt:
        push      ebp
        xor       ebx,ebx
        xor       edi,edi
        mov       ebp,1
        mov       al,[esi]
        cmp       al,'+'
        je       .sign_no
        cmp       al,'-'
        je       .sign_yes
        jmp      .sign_end
  .sign_yes:
        bts       ebx,16
  .sign_no:
        inc       esi
        dec       ecx
  .sign_end:
        add       esi,ecx
        xchg      cl,ch
        dec       ch
        dec       esi
        mov       al,[esi]
        mov       [.hex],bh
        mov       [.oct],bh
        inc       cl
        add       bl,9
        cmp       al,'d'
        je       .start
        add       bh,4
        mov       [.oct],bh
        sub       bl,8
        cmp       al,'b'
        je       .start
        add       cl,2
        add       bl,6
        cmp       al,'o'
        je       .start
        shl       bh,1
        mov       [.hex],bh
        inc       cl
        add       bl,2
        cmp       al,'h'
        je       .start
        inc       esi
        inc       ch
  .start:
        dec       esi
        movzx     eax,byte [esi]
        and       al,11001111b
        js       .error_lexem
        cmp       al,bl
        jg       .error_lexem
        jmp      .go
  .error_lexem:
        db        $eb
  .hex  db        $00
  .error_lex:
        mov       eax,not_correct_value
        pop       ebp
        clc
        ret
        sub       al,55
        cmp       al,15
        ja       .error_lex
  .go:
        mul       ebp
        jc       .error_value
        add       edi,eax
        shl       ebp,cl
        db        $eb
  .oct  db        $00
        lea       ebp,[ebp+(ebp*4)]
        dec       ch
        jnz      .start
        mov       eax,edi
        bt        ebx,16
        jnc      .finish
        neg       eax
  .finish:
        pop       ebp
        stc
        ret
  .error_value:
        mov       eax,big_write_bytes
        pop       ebp
        clc
        ret
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2011, 13:06
Ответы с готовыми решениями:

Как можно сделать программу более компактнее
решил использовать новый способ в программе. так вот как можно этот код сделать болие компактнее:...

Задача про кирпич - как можно написать компактнее программу, чтобы она работала?
Sub Кирпич() a = InputBox("Ширина кирпича a") b = InputBox(" Высота кирпича b") c =...

Как можно быстрее!
Привет всем! У меня возникла проблема. Вылезает вот такая ошибка: "Parse error: syntax error,...

Как можно быстрее
1) y=a*(x+b)-c 2) y=a-x/b-c :-|:(%-)O_o:handshake: ismagulov, вы нарушаете Правила форума,...

6
4164 / 1816 / 216
Регистрация: 06.10.2010
Сообщений: 4,070
19.07.2011, 17:33 2
Число заносится в регистр edx.
Assembler
1
2
3
4
5
6
7
8
mov    ecx,<Длина строки>
mov    esi,<Указатель на строку>
xor    eax,eax
xor    edx,edx
@@:lodsb
   lea edx,[edx*4+edx]
   lea edx,[edx*2+eax-48]
loop @b
Это было тут.
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
19.07.2011, 20:16  [ТС] 3
murderer,
Причём длина строки в переводе чисел уважаемый!!!!
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.07.2011, 08:35 4
IOAN, насколько я понял, ты пытаешься создать универсальный алгоритм, который объединяет StrToBin, StrToDec, StrToHex, StrToOct, IMHO:
1) нужно каждый перевод отшлифовать по отдельности, а уже потом объединять их
2) проверка на +/- нужна только для StrToDec для StrToBin, StrToHex и StrToOct знак определяется старшим битом
3)
Assembler
1
2
3
        je       .sign_yes
        jmp      .sign_end
.sign_yes:
плохой стиль программирования на асм, да и в байтах короче будет так
Assembler
1
2
        jne       .sign_end
.sign_yes:
1
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
20.07.2011, 18:09  [ТС] 5
Спасибо Mikl всё правильно.
1) Каждый перевод изначально был сделан отдельно, а потом делал объединение для уменьшение размера кода, но в итоге это выполняется медленнее чем каждый перевод в отдельности!
2) Знак я проверяю и устанавливаю старший бит после перевода если надо.
Assembler
1
     neg       eax
3) За третий совет отдельно спасибо!
0
4164 / 1816 / 216
Регистрация: 06.10.2010
Сообщений: 4,070
21.07.2011, 17:24 6
IOAN
Посмотри ещё раз как работает мой код. Я просматриваю строку от старших знаков к младшим и на каждой итерации умножаю число на основание CC. Получается так

1) Берём строку '4567'
2) edx = edx*10+4=4
3) edx = edx*10+5=45
4) edx = edx*10+6=456
5) edx = edx*10+7=4567

У тебя же строка просматривается в обратном порядке

1) Берём строку '4567'
2) edi = edi+7*1=7
3) edi = edi+6*10=67
4) edi = edi+5*100=567
5) edi = edi+4*1000=4567

Добавлено через 20 минут
Если основание СС является степенью двойки можно сделать так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char2byte db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
...
mov ebx,offset char2byte
mov esi,<указатель на строку>
mov edi,<длина строки>
mov ecx,<log2(основание СС)> ;например для hex это 4
xor eax,eax
cdq
@1:lodsb
   xlatb
   shl edx,cl
   or  edx,eax
   dec edi
jne @1
Число заносится в edx

Добавлено через 10 минут
Если разрешено использовать SSSE3, то подумав можно свести перевод строки в число к такой последовательности команд pmaddubsw, maddwd, pmulld, phaddd.
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
21.07.2011, 23:07  [ТС] 7
Цитата Сообщение от murderer Посмотреть сообщение
1) Берём строку '4567'
2) edi = edi+7*1=7
3) edi = edi+6*10=67
4) edi = edi+5*100=567
5) edi = edi+4*1000=4567
1) Берём строку '1010h'
2) edx = edx*16+1=1
3) edx = edx*16+0=16
4) edx = edx*16+1=257
5) edx = edx*16+0=4112

1) Берём строку '1010d'
2) edx = edx*10+1=1
3) edx = edx*10+0=10
4) edx = edx*10+1=101
5) edx = edx*10+0=1010

1) Берём строку '1010o'
2) edx = edx*8+1=1
3) edx = edx*8+0=8
4) edx = edx*8+1=65
5) edx = edx*8+0=520

1) Берём строку '1010b'
2) edx = edx*2+1=1
3) edx = edx*2+0=2
4) edx = edx*2+1=5
5) edx = edx*2+0=10

Примерно это и делает мой код.
Второй предложенный вариант хорош возьму, но не увинерсален.
А FPU, SSE не использую.
Пишу транслятор для записи пользовательских команд в бинарный файл.
Стандартных комманд достаточно.
0
21.07.2011, 23:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2011, 23:07
Помогаю со студенческими работами здесь

Можно ли сделать быстрее?
Привет! Есть каталог товаров, есть куча прайс-листов в экселе, которые вкачиваются в лотус. ...

Нужна \ как можно быстрее !
Решите пожалуйста задачи наиболее простейшими способами, и пожалуйста прокомментируйте код...

Можно ли заставить ЖД работать быстрее?
Подключил я внешний хард ко второму пню, чтобы перегнать туда инфу с компа, но появилась надпись...

создать программу в c++ как можно быстрее
П.5.4. Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;, &quot;Вопрос&quot; и...

Олимпиадная задача (как можно быстрее)
Сижу, не могу разобраться, прошу сделать задачу на PascalABC, заранее спасибо Легенда гласит, что...

Ребят Требуется как можно быстрее!
Ребят нужно составить программу для этих 2-х задач, заранее спасибо) №1 Даны три действительные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru