Einzelnen Beitrag anzeigen

neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#25

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:33
Aus Classes.pas

Delphi-Quellcode:
procedure BinToHex(Buffer, Text: PChar; BufSize: Integer); assembler;
const
  Convert: array[0..15] of Char = '0123456789ABCDEF';
var
  I: Integer;
begin
  for I := 0 to BufSize - 1 do
  begin
    Text[0] := Convert[Byte(Buffer[I]) shr 4];
    Text[1] := Convert[Byte(Buffer[I]) and $F];
    Inc(Text, 2);
  end;
end;
{asm
        PUSH    ESI
        PUSH    EDI
        MOV    ESI,EAX
        MOV    EDI,EDX
        MOV    EDX,0
        JMP    @@1
@@0:    DB      '0123456789ABCDEF'
@@1:    LODSB
        MOV    DL,AL
        AND    DL,0FH
        MOV    AH,@@0.Byte[EDX]
        MOV    DL,AL
        SHR    DL,4
        MOV    AL,@@0.Byte[EDX]
        STOSW
        DEC    ECX
        JNE    @@1
        POP    EDI
        POP    ESI
end;}


function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
var
  I: Integer;
begin
  I := BufSize;
  while I > 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
    Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
    Inc(Buffer);
    Inc(Text, 2);
    Dec(I);
  end;
  Result := BufSize - I;
end;

{asm
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        MOV    ESI,EAX
        MOV    EDI,EDX
        MOV    EBX,EDX
        MOV    EDX,0
        JMP    @@1
@@0:    DB      0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
        DB      -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
        DB      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
        DB      -1,10,11,12,13,14,15
@@1:    LODSW
        CMP    AL,'0'
        JB      @@2
        CMP    AL,'f'
        JA      @@2
        MOV    DL,AL
        MOV    AL,@@0.Byte[EDX-'0']
        CMP    AL,-1
        JE      @@2
        SHL    AL,4
        CMP    AH,'0'
        JB      @@2
        CMP    AH,'f'
        JA      @@2
        MOV    DL,AH
        MOV    AH,@@0.Byte[EDX-'0']
        CMP    AH,-1
        JE      @@2
        OR      AL,AH
        STOSB
        DEC    ECX
        JNE    @@1
@@2:    MOV    EAX,EDI
        SUB    EAX,EBX
        POP    EBX
        POP    EDI
        POP    ESI
end;}
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat