· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› HEX2ASCII

<< . 1 . 2 .

Посл.отвђт Сообщен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

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.094