Difference between revisions of "Label"
(14 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{label}} | {{label}} | ||
− | The | + | The <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> keyword is used for declaration of labels (markers for unconditional jumps using [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]] keyword) used further in the [[Unit|<syntaxhighlight lang="pascal" inline>unit</syntaxhighlight>]]/[[Program|<syntaxhighlight lang="pascal" inline>program</syntaxhighlight>]]. |
− | < | + | It is a [[Reserved words|reserved word]]. |
− | |||
− | [[ | + | == Pascal == |
− | [[Category: | + | |
+ | To declare a label (not defining it) <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> starts a section with (comma separated) identifiers: | ||
+ | <syntaxhighlight lang="pascal" line start="1" highlight="4-8"> | ||
+ | program labelDemo(input, output, stderr); | ||
+ | |||
+ | {$goto on} | ||
+ | // familiarize the compiler with symbols | ||
+ | // that are meant as 'goto' targets | ||
+ | label | ||
+ | // the symbol 'done' becomes of "type" label | ||
+ | done; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | You then define the label, that means associating a symbol with a statement and effectively in the compiled code with an address, by writing the previously declared label in a statement block followed by a colon: | ||
+ | <syntaxhighlight lang="pascal" line start="9" highlight="18"> | ||
+ | var | ||
+ | n: qword; | ||
+ | x, sum, arithmeticMean: real; | ||
+ | begin | ||
+ | n := 0; | ||
+ | sum := 0; | ||
+ | while true do | ||
+ | begin | ||
+ | readLn(x); | ||
+ | if x < 0 then | ||
+ | begin | ||
+ | // leave loop and continue at 'done' | ||
+ | goto done; | ||
+ | end; | ||
+ | sum := sum + x; | ||
+ | inc(n); | ||
+ | end; | ||
+ | done: | ||
+ | arithmeticMean := sum / n; | ||
+ | writeLn('arithemetic mean = ', arithmeticMean); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Pascal imposes further restrictions on labels: | ||
+ | Labels have to be associated with statements: Putting a label right before an [[End|<syntaxhighlight lang="pascal" inline>end</syntaxhighlight>]] is not allowed. To bypass that, you can insert an empty instruction [[;|<syntaxhighlight lang="pascal" inline>;</syntaxhighlight>]] right after the label definition. | ||
+ | |||
+ | In addition to normal [[Identifier|identfiers]], labels may be non-negative integers. | ||
+ | |||
+ | == Assembler == | ||
+ | |||
+ | A <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> section is also required for jump targets in [[Asm|<syntaxhighlight lang="pascal" inline>asm</syntaxhighlight>-blocks]], unless the [[@|<syntaxhighlight lang="pascal" inline>@</syntaxhighlight>-address-operator]] is used. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line highlight="8-12,18,20-21">program sumExample(input, output, stderr); | ||
+ | |||
+ | { iteratively calculates the sum over first n integers } | ||
+ | function iterativeSumFirstNIntegers(const n: longword): qword; | ||
+ | {$ifdef CPUX86_64} // ============= optimized implementation | ||
+ | // assembler modifier appended to routine declaration | ||
+ | assembler; | ||
+ | // you have to familiarize the compiler with symbols | ||
+ | // which are meant to be jump targets | ||
+ | {$goto on} | ||
+ | label | ||
+ | isfni_iterate; | ||
+ | {$asmMode intel} | ||
+ | asm | ||
+ | xor rax, rax // rax := 0 | ||
+ | // ecx is used as counter by loop instruction | ||
+ | mov ecx, n // ecx := n | ||
+ | isfni_iterate: | ||
+ | add rax, qword(ecx) // rax := rax + ecx | ||
+ | loop isfni_iterate // dec(ecx) | ||
+ | // if ecx <> 0 then goto isfni_iterate | ||
+ | |||
+ | // the @result macro represents the functions return value | ||
+ | mov @result, rax // result := rax | ||
+ | // note, a list of modified registers (here ['rax', 'ecx']) | ||
+ | // is ignored for pure assembler routines | ||
+ | end; | ||
+ | {$else} // ========================== default implementation | ||
+ | var | ||
+ | i: longword; | ||
+ | x: qword; | ||
+ | begin | ||
+ | x := 0; // mov rax, 0 | ||
+ | for i := n downto 1 do // mov ecx, n | ||
+ | begin | ||
+ | x := x + i; // add rax, ecx | ||
+ | end; // loop isfni_iterate | ||
+ | iterativeSumFirstNIntegers := x; // mov @result, rax | ||
+ | end; | ||
+ | {$endif} | ||
+ | |||
+ | // M A I N ================================================= | ||
+ | var | ||
+ | n: longword; | ||
+ | begin | ||
+ | readLn(n); | ||
+ | writeLn(iterativeSumFirstNIntegers(n)); | ||
+ | end.</syntaxhighlight> | ||
+ | Of course in a production program, you would use an algorithm applying the formula <syntaxhighlight lang="pascal" inline>sum := (n * (n + 1)) div 2</syntaxhighlight> (“Gaussian sum formula”). | ||
+ | |||
+ | == See also == | ||
+ | |||
+ | * [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight> command]] | ||
+ | * [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto}</syntaxhighlight> compiler directive]] | ||
+ | * {{Doc|package=RTL|unit=system|identifier=setjmp|text=<syntaxhighlight lang="pascal" inline>system.setJmp</syntaxhighlight>}} | ||
+ | |||
+ | [[Category: Code]] |
Latest revision as of 17:20, 6 August 2022
│
Deutsch (de) │
English (en) │
français (fr) │
русский (ru) │
The label
keyword is used for declaration of labels (markers for unconditional jumps using goto
keyword) used further in the unit
/program
.
It is a reserved word.
Pascal
To declare a label (not defining it) label
starts a section with (comma separated) identifiers:
1program labelDemo(input, output, stderr);
2
3{$goto on}
4// familiarize the compiler with symbols
5// that are meant as 'goto' targets
6label
7 // the symbol 'done' becomes of "type" label
8 done;
You then define the label, that means associating a symbol with a statement and effectively in the compiled code with an address, by writing the previously declared label in a statement block followed by a colon:
9var
10 n: qword;
11 x, sum, arithmeticMean: real;
12begin
13 n := 0;
14 sum := 0;
15 while true do
16 begin
17 readLn(x);
18 if x < 0 then
19 begin
20 // leave loop and continue at 'done'
21 goto done;
22 end;
23 sum := sum + x;
24 inc(n);
25 end;
26done:
27 arithmeticMean := sum / n;
28 writeLn('arithemetic mean = ', arithmeticMean);
29end.
Pascal imposes further restrictions on labels:
Labels have to be associated with statements: Putting a label right before an end
is not allowed. To bypass that, you can insert an empty instruction ;
right after the label definition.
In addition to normal identfiers, labels may be non-negative integers.
Assembler
A label
section is also required for jump targets in asm
-blocks, unless the @
-address-operator is used.
1program sumExample(input, output, stderr);
2
3{ iteratively calculates the sum over first n integers }
4function iterativeSumFirstNIntegers(const n: longword): qword;
5{$ifdef CPUX86_64} // ============= optimized implementation
6// assembler modifier appended to routine declaration
7assembler;
8// you have to familiarize the compiler with symbols
9// which are meant to be jump targets
10{$goto on}
11label
12 isfni_iterate;
13{$asmMode intel}
14asm
15 xor rax, rax // rax := 0
16 // ecx is used as counter by loop instruction
17 mov ecx, n // ecx := n
18isfni_iterate:
19 add rax, qword(ecx) // rax := rax + ecx
20 loop isfni_iterate // dec(ecx)
21 // if ecx <> 0 then goto isfni_iterate
22
23 // the @result macro represents the functions return value
24 mov @result, rax // result := rax
25// note, a list of modified registers (here ['rax', 'ecx'])
26// is ignored for pure assembler routines
27end;
28{$else} // ========================== default implementation
29var
30 i: longword;
31 x: qword;
32begin
33 x := 0; // mov rax, 0
34 for i := n downto 1 do // mov ecx, n
35 begin
36 x := x + i; // add rax, ecx
37 end; // loop isfni_iterate
38 iterativeSumFirstNIntegers := x; // mov @result, rax
39end;
40{$endif}
41
42// M A I N =================================================
43var
44 n: longword;
45begin
46 readLn(n);
47 writeLn(iterativeSumFirstNIntegers(n));
48end.
Of course in a production program, you would use an algorithm applying the formula sum := (n * (n + 1)) div 2
(“Gaussian sum formula”).