[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]
{
A set is just an array of bits, each possible element in the set has a bit in
the array. If the element is in the set, the bit is set, otherwise clear.
If you know that (and asm :), you know how to access a set in BASM.
BvG> How would the following routine look in assembler?
}
type charset=set of char;
function epos(str:string; ch:charset; xst:byte):byte;
var i:byte;
begin
i:=xst;
while (not (str[i] in ch)) and (i<=length(str)) do inc(i);
epos:=i;
end;
function eposasm(str:string; ch:charset; xst:byte):byte; assembler;
{ Same result as pascal version, except for xst=0: }
{ this one returns 0, pascal version returns same as xst=1, }
{ or 0 if chr(length(Str)) exists in ch }
asm
cld
push ds
lds si,Str
lodsb
xor ah,ah
mov bx,ax
mov al,xst
dec ax { assumes xst>0 }
add si,ax
sub bx,ax
jle @NotFnd { jump if xst > length(str) }
les dx,&ch { ch is a reserved word, so use the identifier operator }
@LoopStr:
lodsb
mov di,dx
mov cl,al
and cl,7
shr ax,1
shr ax,1
shr ax,1
mov di,ax
add di,dx
mov al,1
shl al,cl
test es:[di],al
jnz @Fnd
dec bx
jnz @LoopStr
jmp @NotFnd
@Fnd:
dec si { SI already incremented by lodsb, not wanted }
@NotFnd:
mov ax,si
sub ax,word ptr [Str] { The offset of Str }
pop ds
end;
[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]