{
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;