[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
{
How do I make from a procedure or function an inline version?
If I run the following program, the computer locks up. What's wrong??
Help!!
}
var
s1, s2: string;
procedure CopySubStr( Str1: string; start, nrchars: byte; var Str2: string );
{ copy part of Str1 (beginning at start for nrchars) to Str2
if start > length of Str1, Str2 will contain a empty string.
if nrchars specifies more characters than remain starting at the
start position, Str2 will contain just that remainder of Str1. }
InLine(
$55/ { push bp }
$89/$E5/ { mov bp,sp }
$C5/$76/$0C/ { lds si,[bp+0C] }
$FC/ { cld }
$C4/$7E/$04/ { les di,[bp+04] }
$8A/$24/ { mov ah,[si] }
$20/$E4/ { and ah,ah }
$74/$16/ { je @null }
$8A/$5E/$0A/ { mov bl,[bp+0A] }
$38/$DC/ { cmp ah,bl }
$72/$0F/ { jb @null }
$8A/$46/$08/ { mov al,[bp+08] }
$88/$C6/ { mov dh,al }
$00/$DE/ { add dh,bl }
$FE/$CE/ { dec dh }
$38/$F4/ { cmp ah,dh }
$72/$06/ { jb @rest }
$EB/$0A/ { jmp @copy }
{ @null: }
$B0/$00/ { mov al,00 }
$EB/$15/ { jmp @done }
{ @rest: }
$28/$DC/ { sub ah,bl }
$FE/$C4/ { inc ah }
$88/$E0/ { mov al,ah }
{ @copy: }
$88/$C1/ { mov cl,al }
$30/$ED/ { xor ch,ch }
$30/$FF/ { xor bh,bh }
$01/$DE/ { add si,bx }
$89/$FA/ { mov dx,di }
$47/ { inc di }
$F3/$A4/ { rep movsb }
$89/$D7/ { mov di,dx }
{ @done: }
$88/$05/ { mov [di],al }
{ @exit: }
$5D { pop bp }
) { CopySubStr };
procedure StrCopy( var Str1, Str2: string );
{ copy str1 to str2 }
InLine(
$89/$EA/ { mov dx,bp }
$89/$E5/ { mov bp,sp }
$C5/$76/$08/ { lds si,[bp+08] }
$FC/ { cld }
$C4/$7E/$04/ { les di,[bp+04] }
$30/$ED/ { xor ch,ch }
$8A/$0C/ { mov cl,[si] }
$41/ { inc cx }
$F3/$A4/ { rep movsb }
$89/$D5 { mov bp,dx }
) { StrCopy };
function StrPos( var str1, str2: string ): byte;
{ returns position of the first occurrence of str1 in str2 }
{ return value in AX }
{ str1 - string to search for }
{ str2 - string to search in }
InLine(
$55/ { push bp }
$89/$E5/ { mov bp,sp }
$FC/ { cld }
$C4/$7E/$04/ { les di,[bp+04] }
$30/$ED/ { xor ch,ch }
$8A/$0D/ { mov cl,[di] }
$21/$C9/ { and cx,cx }
$74/$2A/ { je @negatief }
$47/ { inc di }
$C5/$76/$08/ { lds si,[bp+08] }
$AC/ { lodsb }
$20/$C0/ { and al,al }
$74/$21/ { je @negatief }
$88/$C4/ { mov ah,al }
$FE/$CC/ { dec ah }
$AC/ { lodsb }
{ @start: }
$F2/$AE/ { repnz scasb }
$75/$18/ { jne @negatief }
$38/$E1/ { cmp cl,ah }
$72/$14/ { jb @negatief }
$89/$F2/ { mov dx,si }
$89/$CB/ { mov bx,cx }
$88/$E1/ { mov cl,ah }
$F3/$A6/ { rep cmpsb }
$74/$0E/ { je @positief }
$29/$D6/ { sub si,dx }
$29/$F7/ { sub di,si }
$89/$D6/ { mov si,dx }
$89/$D9/ { mov cx,bx }
$EB/$E4/ { jmp @start }
{ @Negatief: }
$31/$C0/ { xor ax,ax }
$EB/$09/ { jmp @exit }
{ @Positief: }
$30/$E4/ { xor ah,ah }
$C4/$7E/$04/ { les di,[bp+04] }
$8A/$05/ { mov al,[di] }
$29/$D8/ { sub ax,bx }
{ @Exit: }
$5D { pop bp }
) { StrPos };
procedure Trim( var Str: string );
{ remove leading and trailing white space from str }
InLine( { setup }
$55/ { push bp }
$89/$E5/ { mov bp,sp }
$C5/$76/$04/ { lds si,[bp+04] }
$8C/$D8/ { mov ax,ds }
$8E/$C0/ { mov es,ax }
$8A/$04/ { mov al,[si] }
$20/$C0/ { and al,al }
$74/$45/ { je @exit }
$89/$F7/ { mov di,si }
$88/$C4/ { mov ah,al }
{ remove trailing white space }
$30/$ED/ { xor ch,ch }
$88/$E1/ { mov cl,ah }
$01/$CE/ { add si,cx }
{ @start1: }
$8A/$04/ { mov al,[si] }
$3C/$20/ { cmp al,20 }
$77/$09/ { ja @stop1 }
$4E/ { dec si }
$FE/$C9/ { dec cl }
$20/$C9/ { and cl,cl }
$74/$02/ { je @stop1 }
$EB/$F1/ { jmp @start1 }
{ @stop1: }
$20/$C9/ { and cl,cl }
$74/$26/ { je @done }
{ look for leading white space }
$89/$FE/ { mov si,di }
{ @start2: }
$46/ { inc si }
$8A/$04/ { mov al,[si] }
$3C/$20/ { cmp al,20 }
$77/$08/ { ja @stop2 }
$FE/$C9/ { dec cl }
$20/$C9/ { and cl,cl }
$74/$02/ { je @stop2 }
$EB/$F1/ { jmp @start2 }
{ @stop2: }
$89/$F2/ { mov dx,si }
$29/$FA/ { sub dx,di }
$83/$FA/$01/ { cmp dx,0001 }
$74/$0C/ { je @done }
$FC/ { cld }
$89/$CB/ { mov bx,cx }
$89/$FA/ { mov dx,di }
$47/ { inc di }
$F3/$A4/ { rep movsb }
$89/$D7/ { mov di,dx }
$89/$D9/ { mov cx,bx }
{ @done: }
$88/$0D/ { mov [di],cl }
{ @exit: }
$5D { pop bp }
) { Trim };
begin
s1 := '123456789-123456789-';
s2 := '';
CopySubStr( s1, 1, 12, s2 );
writeln( s2 );
s1 := '123qqwerty';
s2 := 'qwerty';
CopySubStr( s1, 1, 12, s2 );
writeln( s2 );
StrCopy( s1, s2 );
writeln( s2 );
s1 := '123456789-123456789-';
s2 := '4567';
writeln( StrPos( s1, s2 ) );
s1 := ' 123qqwerty ';
s2 := 'qwerty';
writeln( StrPos( s1, s2 ) );
Trim( s1 );
writeln( s2 );
end.
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]