Re: Fast asm conversion of string of hex chars into binary
- From: Herbert Kleebauer <klee@xxxxxxxxx>
- Date: Sat, 25 Nov 2006 21:32:19 +0100
James Harris wrote:
Is there an obvious way to make this 386+ code faster? It is a
top-of-the-head first sketch for illustration only, not meant to be
working code but I think I have allowed for AGIs and instruction
pairing (for cpus where they apply). I make it circa 6 cycles per loop.
The code should convert up to eight ascii hexadecimal characters to a
number, e.g. "2f4ba7" to 0x002f4ba7.
;setup
mov esi, <address>
mov ecx, <num chars> ;number of characters to convert, up to 8
;
xor eax, eax ;to collect the result
xor ebx, ebx ;workspace; prezero all bits
:loop
mov bl, [esi] ;fetch char
mov bl, convtab[bl] ;convert to (0 to 15)
cmp bl, 15
ja error
inc esi ;point at next char
shl eax, 4 ;move up a nibble
or eax, ebx ;add in new value
dec ecx ;one less to do
jnz loop ;done?
You can reduce the number of instructions for the first n-1
characters (in the loop) by 2 and the instructions for the
last character by 5:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@=$100
move.l #buf,r5
move.l #bufl,r2
eor.l r0,r0
subq.l #1,r2
beq.b _last
bmi.b error
_loop: movu.bl (r5),r1
or.l convtab(r1*4),r0
bmi.b error
lsl.l #4,r0
addq.l #1,r5
subq.l #1,r2
bne.b _loop
_last: movu.bl (r5),r1
or.l convtab(r1*4),r2
bmi.b error
or.b r2,r0
;
;
rts.w
error: ;
;
rts.w
even 16
convtab:blk.l '0',-1
dc.l 0,1,2,3,4,5,6,7,8,9
blk.l 'A'-'9'-1,-1
dc.l 10,11,12,13,14,15
blk.l 'a'-'F'-1,-1
dc.l 10,11,12,13,14,15
blk.l 255-'f',-1
buf: dc.b '134abcd'
bufl=@-buf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Here the listing:
@=$100
00000000: 00000100: 66 be 00000550 move.l #buf,r5
00000006: 00000106: 66 b9 00000007 move.l #bufl,r2
0000000c: 0000010c: 66 31 c0 eor.l r0,r0
0000000f: 0000010f: 66 83 e9 01 subq.l #1,r2
00000013: 00000113: 74 20 beq.b _last
00000015: 00000115: 78 31 bmi.b error
00000017: 00000117: 67 66 0f b6 16 _loop: movu.bl (r5),r1
0000001c: 0000011c: 67 66 0b 04 95
00000021: 00000121: 00000150 or.l convtab(r1*4),r0
00000025: 00000125: 78 21 bmi.b error
00000027: 00000127: 66 c1 e0 04 lsl.l #4,r0
0000002b: 0000012b: 66 83 c6 01 addq.l #1,r5
0000002f: 0000012f: 66 83 e9 01 subq.l #1,r2
00000033: 00000133: 75 e2 bne.b _loop
00000035: 00000135: 67 66 0f b6 16 _last: movu.bl (r5),r1
0000003a: 0000013a: 67 66 0b 0c 95
0000003f: 0000013f: 00000150 or.l convtab(r1*4),r2
00000043: 00000143: 78 03 bmi.b error
00000045: 00000145: 08 c8 or.b r2,r0
;
;
00000047: 00000147: c3 rts.w
error: ;
;
00000048: 00000148: c3 rts.w
00000049: 00000149: 00 00 00 00 00 00
0000004f: 0000014f: 00 even 16
00000050: 00000150: ffffffff ffffffff
00000058: 00000158: ffffffff ffffffff
00000060: 00000160: ffffffff ffffffff
00000068: 00000168: ffffffff ffffffff
00000070: 00000170: ffffffff ffffffff
00000078: 00000178: ffffffff ffffffff
00000080: 00000180: ffffffff ffffffff
00000088: 00000188: ffffffff ffffffff
00000090: 00000190: ffffffff ffffffff
00000098: 00000198: ffffffff ffffffff
000000a0: 000001a0: ffffffff ffffffff
000000a8: 000001a8: ffffffff ffffffff
000000b0: 000001b0: ffffffff ffffffff
000000b8: 000001b8: ffffffff ffffffff
000000c0: 000001c0: ffffffff ffffffff
000000c8: 000001c8: ffffffff ffffffff
000000d0: 000001d0: ffffffff ffffffff
000000d8: 000001d8: ffffffff ffffffff
000000e0: 000001e0: ffffffff ffffffff
000000e8: 000001e8: ffffffff ffffffff
000000f0: 000001f0: ffffffff ffffffff
000000f8: 000001f8: ffffffff ffffffff
00000100: 00000200: ffffffff ffffffff
00000108: 00000208: ffffffff ffffffff convtab:blk.l '0',-1
00000110: 00000210: 00000000 00000001
00000118: 00000218: 00000002 00000003
00000120: 00000220: 00000004 00000005
00000128: 00000228: 00000006 00000007
00000130: 00000230: 00000008 00000009 dc.l 0,1,2,3,4,5,6,7,8,9
00000138: 00000238: ffffffff ffffffff
00000140: 00000240: ffffffff ffffffff
00000148: 00000248: ffffffff ffffffff
00000150: 00000250: ffffffff blk.l 'A'-'9'-1,-1
00000154: 00000254: 0000000a 0000000b
0000015c: 0000025c: 0000000c 0000000d
00000164: 00000264: 0000000e 0000000f dc.l 10,11,12,13,14,15
0000016c: 0000026c: ffffffff ffffffff
00000174: 00000274: ffffffff ffffffff
0000017c: 0000027c: ffffffff ffffffff
00000184: 00000284: ffffffff ffffffff
0000018c: 0000028c: ffffffff ffffffff
00000194: 00000294: ffffffff ffffffff
0000019c: 0000029c: ffffffff ffffffff
000001a4: 000002a4: ffffffff ffffffff
000001ac: 000002ac: ffffffff ffffffff
000001b4: 000002b4: ffffffff ffffffff
000001bc: 000002bc: ffffffff ffffffff
000001c4: 000002c4: ffffffff ffffffff
000001cc: 000002cc: ffffffff ffffffff blk.l 'a'-'F'-1,-1
000001d4: 000002d4: 0000000a 0000000b
000001dc: 000002dc: 0000000c 0000000d
000001e4: 000002e4: 0000000e 0000000f dc.l 10,11,12,13,14,15
000001ec: 000002ec: ffffffff ffffffff
000001f4: 000002f4: ffffffff ffffffff
000001fc: 000002fc: ffffffff ffffffff
00000204: 00000304: ffffffff ffffffff
0000020c: 0000030c: ffffffff ffffffff
00000214: 00000314: ffffffff ffffffff
0000021c: 0000031c: ffffffff ffffffff
00000224: 00000324: ffffffff ffffffff
0000022c: 0000032c: ffffffff ffffffff
00000234: 00000334: ffffffff ffffffff
0000023c: 0000033c: ffffffff ffffffff
00000244: 00000344: ffffffff ffffffff
0000024c: 0000034c: ffffffff ffffffff
00000254: 00000354: ffffffff ffffffff
0000025c: 0000035c: ffffffff ffffffff
00000264: 00000364: ffffffff ffffffff
0000026c: 0000036c: ffffffff ffffffff
00000274: 00000374: ffffffff ffffffff
0000027c: 0000037c: ffffffff ffffffff
00000284: 00000384: ffffffff ffffffff
0000028c: 0000038c: ffffffff ffffffff
00000294: 00000394: ffffffff ffffffff
0000029c: 0000039c: ffffffff ffffffff
000002a4: 000003a4: ffffffff ffffffff
000002ac: 000003ac: ffffffff ffffffff
000002b4: 000003b4: ffffffff ffffffff
000002bc: 000003bc: ffffffff ffffffff
000002c4: 000003c4: ffffffff ffffffff
000002cc: 000003cc: ffffffff ffffffff
000002d4: 000003d4: ffffffff ffffffff
000002dc: 000003dc: ffffffff ffffffff
000002e4: 000003e4: ffffffff ffffffff
000002ec: 000003ec: ffffffff ffffffff
000002f4: 000003f4: ffffffff ffffffff
000002fc: 000003fc: ffffffff ffffffff
00000304: 00000404: ffffffff ffffffff
0000030c: 0000040c: ffffffff ffffffff
00000314: 00000414: ffffffff ffffffff
0000031c: 0000041c: ffffffff ffffffff
00000324: 00000424: ffffffff ffffffff
0000032c: 0000042c: ffffffff ffffffff
00000334: 00000434: ffffffff ffffffff
0000033c: 0000043c: ffffffff ffffffff
00000344: 00000444: ffffffff ffffffff
0000034c: 0000044c: ffffffff ffffffff
00000354: 00000454: ffffffff ffffffff
0000035c: 0000045c: ffffffff ffffffff
00000364: 00000464: ffffffff ffffffff
0000036c: 0000046c: ffffffff ffffffff
00000374: 00000474: ffffffff ffffffff
0000037c: 0000047c: ffffffff ffffffff
00000384: 00000484: ffffffff ffffffff
0000038c: 0000048c: ffffffff ffffffff
00000394: 00000494: ffffffff ffffffff
0000039c: 0000049c: ffffffff ffffffff
000003a4: 000004a4: ffffffff ffffffff
000003ac: 000004ac: ffffffff ffffffff
000003b4: 000004b4: ffffffff ffffffff
000003bc: 000004bc: ffffffff ffffffff
000003c4: 000004c4: ffffffff ffffffff
000003cc: 000004cc: ffffffff ffffffff
000003d4: 000004d4: ffffffff ffffffff
000003dc: 000004dc: ffffffff ffffffff
000003e4: 000004e4: ffffffff ffffffff
000003ec: 000004ec: ffffffff ffffffff
000003f4: 000004f4: ffffffff ffffffff
000003fc: 000004fc: ffffffff ffffffff
00000404: 00000504: ffffffff ffffffff
0000040c: 0000050c: ffffffff ffffffff
00000414: 00000514: ffffffff ffffffff
0000041c: 0000051c: ffffffff ffffffff
00000424: 00000524: ffffffff ffffffff
0000042c: 0000052c: ffffffff ffffffff
00000434: 00000534: ffffffff ffffffff
0000043c: 0000053c: ffffffff ffffffff
00000444: 00000544: ffffffff ffffffff
0000044c: 0000054c: ffffffff blk.l 255-'f',-1
00000450: 00000550: 31 33 34 61 62 63
00000456: 00000556: 64 buf: dc.b '134abcd'
bufl=@-buf
error.......... 00000148 convtab........ 00000150 buf............ 00000550
bufl........... 00000007
.
- Follow-Ups:
- References:
- Fast asm conversion of string of hex chars into binary
- From: James Harris
- Fast asm conversion of string of hex chars into binary
- Prev by Date: Re: Fast asm conversion of string of hex chars into binary
- Next by Date: Re: Fast asm conversion of string of hex chars into binary
- Previous by thread: Re: Fast asm conversion of string of hex chars into binary
- Next by thread: Re: Fast asm conversion of string of hex chars into binary
- Index(es):
Relevant Pages
|