[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
{
> For some routins you may have.. Stuff like converting a String to
> upperCase, padding a String, and things like that.. Mainly stuff to do
> With Strings, as that seems to be my problem.. if you could, please
> document your source so i can see how it is done.
1)The Good Old String UpCase Routine. I'm sure there are at least
several thousand Programmers, who have independently come up With code
exactly like this:
}
Procedure StrUpr(Var S: String); Assembler;
Asm
push ds { Save DS on stack }
lds si, S { Load DS:SI With Pointer to S }
cld { Clear direction flag - String instr. Forward
lodsb { Load first Byte of S (String length Byte) }
sub ah, ah { Clear high Byte of AX }
mov cx, ax { Move AX in CX }
jcxz @Done { Length = 0, done }
mov ax, ds { Set ES to the value in DS through AX }
mov es, ax { (can't move between two segment Registers) }
mov di, si { DI and SI now point to the first Char. }
@UpCase:
lodsb { Load Character }
cmp al, 'a'
jb @notLower { below 'a' -- store as is }
cmp al, 'z'
ja @notLower { above 'z' -- store as is }
sub al, ('a' - 'A') { convert Character in AL to upper Case }
@notLower:
stosb { Store upCased Character in String }
loop @UpCase { Decrement CX, jump if not zero }
@Done:
pop ds { Restore DS from stack }
end;
{
2)Right justify routine. if Length(S) < Width then S will be
padded With spaces on the left.
}
Procedure RightJustify(Var S: String; Width: Byte); Assembler;
Asm
push ds { Save DS }
lds si, S { Load Pointer to String }
mov al, [si] { Move length Byte in AL }
mov ah, Width { Move Width in AH }
sub ah, al { Subtract }
jbe @Done { if Length(S) >= Width then Done... }
push si { Save SI on stack }
mov cl, al
sub ch, ch { CX = length of the String }
add si, cx { SI points to the last Character }
mov dx, ds
mov es, dx { ES = DS }
mov di, si { DI = SI }
mov dl, ah
sub dh, dh { DX = number of spaces to padd }
add di, dx { DI points to the new end of the String }
std { String ops backward }
rep movsb { Copy String to the new location }
pop si { SI points to S }
mov di, si { DI points to S }
add al, ah { AL = new length Byte }
cld { String ops Forward }
stosb { Store new length Byte }
mov al, ' '
mov cx, dx { CX = number of spaces }
rep stosb { store spaces }
@Done:
pop ds { Restore DS }
end;
{
I wrote both examples specifically For posting in this
conference (my regular code is For external Assembler and nowhere Nearly
as well commented). Both Functions appear to work as advertised and
should be very fast.
}
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]