[Back to CMDLINE SWAG index] [Back to Main SWAG index] [Original]

    {
    I have two BAsm Procedures I have written to speed up a Program which scans a
    comma delimited line.    My testing has shown 50,000 iterations of this
    Function to be approx 3 seconds faster than TP's  Var := Pos(',',String);

    I am fairly new to Assembly.   This Function doES in fact work, but not as fast
    as I feel it should.    Can anyone see any places I have gone wrong in speed?
    I've avoided copying the String to the stack, by just declaring a Pointer
    Variable as the Function's input.  I'd like to squeeze a couple more seconds
    out of it if I could.   The Procedures will deal With about 6 megs of data all
    on comma delimited lines.

    I suppose I COULD speed it up, by not declaring ANY Variable, and hard-code it
    to specifically use the String Variable I am currently passing to it.
     }

    Function Commapos(Var STRNG) : Byte; Assembler; Asm
     LES DI, STRNG     { Point ES:DI to beginning of STRNG }
     xor CH, CH        { Just in Case anything is in Register CH }
     MOV CL, [ES:DI]   { Load String Length into CL }
     MOV AH, CL        { Save len to Compute commapos later }
     inC DI            { Point to First Char in String }
     MOV AL, ','       { Looking For Comma }
     CLD
    @SCANForCOMMALOOP:
     SCASB             { Compare [ES:DI] to contents of AL, inc DI, Dec CL}
     JE @FOUND_COMMA   { Found a Comma! }
     LOOP @SCANForCOMMALOOP  { No Such Luck! }
     MOV AL, 0         { Loop Fell through, no comma exists, set position to 0 }
     JMP @OUTTAHERE    { JumpOut of Loop and Exit } @FOUND_COMMA:
     DEC CL            { Reduce by one, since DI was advanced past the comma }
     SUB AH, CL        { Subtract CL from AH to give the position }
     MOV AL, AH        { Put the result into AL to return to Turbo } @OUTTAHERE:
    end;

[Back to CMDLINE SWAG index] [Back to Main SWAG index] [Original]