Viitor_cc65/usr/share/doc/cc65/webdoc/ca65-5.html
kueller 223cc6685e Neue Version V963
git-svn-id: svn://svn.compuextreme.de/Viitor/V963/Viitor_cc65@5933 504e572c-2e33-0410-9681-be2bf7408885
2011-01-03 10:48:06 +00:00

202 lines
6.4 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.20">
<TITLE>ca65 Users Guide: Symbols and labels</TITLE>
<LINK HREF="ca65-6.html" REL=next>
<LINK HREF="ca65-4.html" REL=previous>
<LINK HREF="ca65.html#toc5" REL=contents>
</HEAD>
<BODY>
<A HREF="ca65-6.html">Next</A>
<A HREF="ca65-4.html">Previous</A>
<A HREF="ca65.html#toc5">Contents</A>
<HR>
<H2><A NAME="s5">5.</A> <A HREF="ca65.html#toc5">Symbols and labels</A></H2>
<P>The assembler allows you to use symbols instead of naked values to make
the source more readable. There are a lot of different ways to define and
use symbols and labels, giving a lot of flexibility.</P>
<H2><A NAME="ss5.1">5.1</A> <A HREF="ca65.html#toc5.1">Numeric constants</A>
</H2>
<P>Numeric constants are defined using the equal sign or the label assignment
operator. After doing</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
two = 2
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>may use the symbol "two" in every place where a number is expected, and it is
evaluated to the value 2 in this context. The label assignment operator causes
the same, but causes the symbol to be marked as a label, which may cause a
different handling in the debugger:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
io := $d000
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>The right side can of course be an expression:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
four = two * two
</PRE>
</CODE></BLOCKQUOTE>
</P>
<H2><A NAME="ss5.2">5.2</A> <A HREF="ca65.html#toc5.2">Standard labels</A>
</H2>
<P>A label is defined by writing the name of the label at the start of the line
(before any instruction mnemonic, macro or pseudo directive), followed by a
colon. This will declare a symbol with the given name and the value of the
current program counter.</P>
<H2><A NAME="ss5.3">5.3</A> <A HREF="ca65.html#toc5.3">Local labels and symbols</A>
</H2>
<P>Using the <CODE>
<A HREF="ca65-10.html#.PROC">.PROC</A></CODE> directive, it is possible to
create regions of code where the names of labels and symbols are local to this
region. They are not known outside of this region and cannot be accessed from
there. Such regions may be nested like PROCEDUREs in Pascal.</P>
<P>See the description of the <CODE>
<A HREF="ca65-10.html#.PROC">.PROC</A></CODE>
directive for more information.</P>
<H2><A NAME="ss5.4">5.4</A> <A HREF="ca65.html#toc5.4">Cheap local labels</A>
</H2>
<P>Cheap local labels are defined like standard labels, but the name of the
label must begin with a special symbol (usually '@', but this can be
changed by the <CODE>
<A HREF="ca65-10.html#.LOCALCHAR">.LOCALCHAR</A></CODE>
directive).</P>
<P>Cheap local labels are visible only between two non cheap labels. As soon as a
standard symbol is encountered (this may also be a local symbol if inside a
region defined with the <CODE>
<A HREF="ca65-10.html#.PROC">.PROC</A></CODE> directive), the
cheap local symbol goes out of scope.</P>
<P>You may use cheap local labels as an easy way to reuse common label
names like "Loop". Here is an example:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
Clear: lda #$00 ; Global label
ldy #$20
@Loop: sta Mem,y ; Local label
dey
bne @Loop ; Ok
rts
Sub: ... ; New global label
bne @Loop ; ERROR: Unknown identifier!
</PRE>
</CODE></BLOCKQUOTE>
</P>
<H2><A NAME="ss5.5">5.5</A> <A HREF="ca65.html#toc5.5">Unnamed labels</A>
</H2>
<P>If you really want to write messy code, there are also unnamed labels. These
labels do not have a name (you guessed that already, didn't you?). A colon is
used to mark the absence of the name.</P>
<P>Unnamed labels may be accessed by using the colon plus several minus or plus
characters as a label designator. Using the '-' characters will create a back
reference (use the n'th label backwards), using '+' will create a forward
reference (use the n'th label in forward direction). An example will help to
understand this:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
: lda (ptr1),y ; #1
cmp (ptr2),y
bne :+ ; -> #2
tax
beq :+++ ; -> #4
iny
bne :- ; -> #1
inc ptr1+1
inc ptr2+1
bne :- ; -> #1
: bcs :+ ; #2 -> #3
ldx #$FF
rts
: ldx #$01 ; #3
: rts ; #4
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>As you can see from the example, unnamed labels will make even short
sections of code hard to understand, because you have to count labels
to find branch targets (this is the reason why I for my part do
prefer the "cheap" local labels). Nevertheless, unnamed labels are
convenient in some situations, so it's your decision.</P>
<H2><A NAME="ss5.6">5.6</A> <A HREF="ca65.html#toc5.6">Using macros to define labels and constants</A>
</H2>
<P>While there are drawbacks with this approach, it may be handy in some
situations. Using <CODE>
<A HREF="ca65-10.html#.DEFINE">.DEFINE</A></CODE>, it is
possible to define symbols or constants that may be used elsewhere. Since
the macro facility works on a very low level, there is no scoping. On the
other side, you may also define string constants this way (this is not
possible with the other symbol types).</P>
<P>Example:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
.DEFINE two 2
.DEFINE version "SOS V2.3"
four = two * two ; Ok
.byte version ; Ok
.PROC ; Start local scope
two = 3 ; Will give "2 = 3" - invalid!
.ENDPROC
</PRE>
</CODE></BLOCKQUOTE>
</P>
<H2><A NAME="ss5.7">5.7</A> <A HREF="ca65.html#toc5.7">Symbols and <CODE>.DEBUGINFO</CODE></A>
</H2>
<P>If <CODE>
<A HREF="ca65-10.html#.DEBUGINFO">.DEBUGINFO</A></CODE> is enabled (or
<A HREF="ca65-2.html#option-g">-g</A> is given on the command line), global, local and
cheap local labels are written to the object file and will be available in the
symbol file via the linker. Unnamed labels are not written to the object file,
because they don't have a name which would allow to access them.</P>
<HR>
<A HREF="ca65-6.html">Next</A>
<A HREF="ca65-4.html">Previous</A>
<A HREF="ca65.html#toc5">Contents</A>
</BODY>
</HTML>