![kueller](/assets/img/avatar_default.png)
git-svn-id: svn://svn.compuextreme.de/Viitor/V961/Viitor_cc65@4236 504e572c-2e33-0410-9681-be2bf7408885
202 lines
6.4 KiB
HTML
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>
|