[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]