- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
int nSymb;
char pCh[32];
char tbldec[] = "0123456789000000";
char tblhex[] = "0123456789ABCDEF";
void MyDWtoStr(DWORD dw)
{
__asm
{
mov eax,dw
test eax,eax
jnz short lab1
mov esi,1//esi = nSymb = 1
mov byte ptr [pCh],30h
jmp short lab2
lab1:
mov ebx,eax
mov ecx,eax//eax = ebx = ecx = dw
xor esi,esi//esi = nSymb = 0
lab4:
mov eax,ecx//eax=ecx=b
mov ebx,0Ah//ebx=10
xor edx,edx
div ebx
mov ebx,edx//ebx=a=b%10
mov al,[tbldec+ebx]
mov [pCh+esi],al//pCh[nSymb]=tbldec[a]
inc esi//nSymb++
mov eax,ecx
sub eax,ebx//eax=b-a
mov ecx,0Ah
xor edx,edx
div ecx
mov ecx,eax//ecx=b=(b - a)/10;
test ecx,ecx
jnz short lab4
mov eax,esi
dec eax//eax = i = nSymb-1
jmp short lab5
lab6:
mov edx,esi//edx = nSymb
sub edx,eax//edx = nSymb-i
mov bl,[edx+pCh-1]//bl = pCh[nSymb-i-1];
mov cl,[eax+pCh]
mov [edx+pCh-1],cl//pCh[nSymb-i-1]=pCh[i];
mov [eax+pCh],bl//pCh[i]=pCh[nSymb];
dec eax
lab5:
mov ecx,eax
shl ecx,1//add ecx,ecx
cmp ecx,esi
jge short lab6
lab2:
mov dword ptr [nSymb],esi
mov byte ptr [esi+pCh],0
}
}
DWORD MyStrtoDW(char *pch)
{
DWORD a;
__asm
{
mov edi,pch
xor eax,eax//eax = a
xor esi,esi//esi = i
mov ecx,10
jmp short lab2
lab1:
mul ecx
and ebx,0FFh
sub ebx,48
add eax,ebx
inc esi
lab2:
mov bl,byte ptr [edi+esi]
test bl,bl
jnz short lab1
mov a,eax
}
return a;
}
>Хочу представить вашему вниманию очень быстрые функции для преобразований DWORD <---> char [].
ctm 26.10.2011 07:11 # +5
2. далеко не оптимально: результат надо возвращать в eax.
3. глобальные переменные - не гуд, не потоко-безопасно
4. tbldec - лишние обращения к памяти.
5. в 1 итерации достаточно 1 операции div.
6. строка 77 + строка 72: movzx ebx, byte ptr [edi + esi]
кстати в процедуре esi вообще не нужен, достаточно edi.
проще не исправлять, а переписать заново.
Впечатление такое: сначала написали код на С, потом скомпилировали без оптимизации, потом дизассемблировали и заменили С-код не задумываясь.
AnimeGovno-_- 26.10.2011 11:46 # −2
Не заметил этого говна. Какие именно регистры нельзя? Вроде это не дельфи, где почти все регистры нужно сохранять.
ctm 26.10.2011 13:27 # 0
за все С++ - компиляторы сказать не могу - не в курсе:(
где-то читал что в Visual C++ нужно сохранять EBX, ESI, EDI, EBP - получается те же...
wecanstoptrain 26.10.2011 15:17 # +2
AnimeGovno-_- 26.10.2011 16:55 # −3
С испорченым EBP - не сможешь обращаться к локальным переменным функции впринципи.
А остальные сохранять то зачем?
ctm 27.10.2011 06:47 # 0
AnimeGovno-_- 27.10.2011 10:18 # −4
ctm 27.10.2011 11:24 # 0
63F45EF45RB65R6VR 26.10.2011 12:24 # −2
вот так писать
mov edi,pch
тоже нельзя если функция не объявлена как __declspec(naked) оптимизатор изменит на вызов где какие то параметры пойдут через стек какие то через регистры а функция внутри будет ссылаться на несуществующие переменные говорю по собственому опыту напарывался уже надо как минимум ставить
__declspec(naked) если на аргуметы ссылаешся
bugmenot 26.10.2011 12:44 # +4
rat4 26.10.2011 17:01 # 0
Psionic 26.10.2011 15:25 # −10
roman-kashitsyn 26.10.2011 15:29 # +1
triple "ХA!"
писал я на ассемблере, тоска смертная
Люблю языки, в которых можно делать многое небольшим количеством кода
Psionic 26.10.2011 15:32 # −1
roman-kashitsyn 26.10.2011 15:46 # −1
В ассемблере нет ничего сложного, просто нужно хорошенько думать, что делаешь.
Часто убеждаюсь, что правильно выбранный алгоритм гораздо важнее языка, на котором он реализован.
Psionic 26.10.2011 15:53 # −2
О да, скажи это людям на моей работе которых от одного вида асма просто в дебагере ввергало в дрожь. И говорят ересь типа прога падает на cmp, а то что после идет скачек в неведомы ебеня, так им незнать.
roman-kashitsyn 26.10.2011 15:59 # +1
> для вас всех мир проца - это страшное потустороннее измерение
По мне так в CL или Haskell въехать посложнее будет, чем в ASM
SmackMyBitchUp 26.10.2011 16:17 # −1
Конечно, пороги вхождения разные.
gegMOPO4 26.10.2011 22:28 # −1
Под современные ОС написано значительно больше 100 программ.
roman-kashitsyn 26.10.2011 22:59 # 0
ок, понижаем до 0.1%
Psionic 27.10.2011 11:33 # 0
roman-kashitsyn 27.10.2011 12:00 # −1
http://en.wikipedia.org/wiki/Source_lines_of_code
Сорцы Debian: 324 млн SLOC (видимо, вместо с базовым набором ПО, там же)
Сорцы Windows XP: 50 млн SLOC (там же)
Сорцы Eclipse 3.7: ~46 млн SLOC http://www.eclipse.org/community/news/eclipseinthenews.php
Один только eclipse весит примерно как ОС, а это лишь одна из огромного числа существующих прикладных программ.
Lure Of Chaos 27.10.2011 12:26 # 0
bugmenot 27.10.2011 15:06 # +4
3.14159265 27.10.2011 16:17 # 0
gegMOPO4 27.10.2011 20:15 # +2
bugmenot 26.10.2011 15:47 # +2
ctm 27.10.2011 06:58 # 0