|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 18, 2003 20:45:46 · Поправил: Asterix И теперь совсем замечательный код :-) .data szBuff db 32 dup (0) format db "%08lX",0 .code start: mov eax, 012ABCDEFh ; !!! теперь переводим сразу DWORD !!! push eax push OFFSET format push OFFSET szBuff call wsprintf xor ecx, ecx invoke MessageBox, ecx, OFFSET szBuff, ecx, ecx invoke ExitProcess, ecx end start |
|
|
Дата: Ноя 18, 2003 21:40:19 Суксь :-( |
|
|
Дата: Ноя 18, 2003 22:19:23 Хто? ;-) |
|
|
Дата: Ноя 18, 2003 22:24:35 wsprintf :-( Как можно сравнивать чистый асм с какой-то апишкой?! Кстати, я уже писал, что invoke в масме иногда неправильно генерирует код для wsprintf? Глюки, однако. |
|
|
Дата: Ноя 18, 2003 22:30:05 В данном случае всё работает! Но мне больше нравится вариант с das. |
|
|
Дата: Ноя 18, 2003 23:11:20 Хотя всё-таки ты прав, действительно не правильно, исправил. |
|
|
Дата: Янв 14, 2004 21:41:49 · Поправил: Asterix Здесь действительно есть ошибка, после push eax push OFFSET format push OFFSET szBuff call wsprintf add esp, 00Ch ; <- этой строчки здесь не хватало |
|
|
Дата: Янв 14, 2004 23:44:58 Ето не Hex2Ascii, а All2Ascii. Только основа в ecx не забывайте. :) Думаю, что возможно самая маленкая в мире. :)))
; ________________________________________________________
;| |
;| NumToStr: |
;| Converts signed integer value to string. |
;| NumToStrU: |
;| Converts unsigned integer value to string. |
;| |
;| EDI - pointer to string buffer |
;| EAX - Number to convert |
;| ECX - radix from 2 to approx. $ff :) |
;| |
;| Note: Don't use 1 as radix. |
;|________________________________________________________|
NumToStr:
test eax,eax
jns NumToStrU
neg eax
mov byte [edi],'-'
inc edi
NumToStrU:
cmp eax,ecx
jb .less
xor edx,edx
div ecx
push edx
call NumToStrU
pop eax
.less:
cmp al,$0a
sbb al,$69
das
mov [edi],ax
inc edi
ret
|
|
|
Дата: Янв 15, 2004 07:49:24 · Поправил: Black_mirror johnfound Ето не Hex2Ascii, а All2Ascii. Только основа в ecx не забывайте. При ecx>16 функция работает некорректно. Вот моя версия: snumtostr:;(eax - signed, ecx - base(2-36), edi - str)
xor edx,edx
sub edx,eax
js unumtostr
mov al,'-'
stosb
xchg eax,edx
unumtostr:;(eax - num, edi-str)
push -'0'
.l0:
xor edx,edx
div ecx
push edx
test eax,eax
jnz .l0
.l1:
pop eax
cmp al,10
jl .l2
add al,7
.l2:
add al,'0'
stosb
jnz .l1
dec edi
ret
Если dec edi убрать, то будет на байт короче вашей 8) |
|
|
Дата: Июн 1, 2004 09:18:56 Black_mirror Снимаю шляпу! :) Но я все таки написал бы так: Ровно 30 байтов.
;| NumToStr:
;| Converts signed integer value to string.
;| NumToStrU:
;| Converts unsigned integer value to string.
;|
;| EDI - pointer to string buffer
;| EAX - Number to convert
;| ECX - radix from 2 to 16
NumToStr:
test eax, eax
jns NumToStrU
neg eax
mov byte [edi], '-'
inc edi
NumToStrU:
pushd $69
.pushloop:
cdq
div ecx
push edx
test eax, eax
jnz .pushloop
.poploop:
pop eax
cmp al, $0a
sbb al, $69
das
stosb
jnz .poploop
retn
|
|
|
Дата: Июн 1, 2004 11:12:04 johnfound Ровно 30 байтов Ну теперь меньше точно не сделать. А вот самый прямой(в смысле без переходов 8) вариант перевода 16-ричного числа: hextostr:;(eax - hex, edi - str)
bswap eax
mov ebx,0f0f0f0fh
and ebx,eax
xor eax,ebx
shr eax,4
lea ecx,[eax+76767676h]
lea edx,[ebx+76767676h]
and ecx,90909090h
and edx,90909090h
shr ecx,4
shr edx,4
lea eax,[eax+ecx+2F2F2F2Fh]
lea ebx,[ebx+edx+2F2F2F2Fh]
xchg bl,ah
rol eax,16
rol ebx,16
xchg bl,ah
rol ebx,16
xchg ax,bx
rol eax,16
stosd
xchg eax,ebx
stosd
ret |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.094 |