mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 04:30:10 +00:00
Explain the new inline assembler syntax
git-svn-id: svn://svn.cc65.org/cc65/trunk@995 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
8a53f3667c
commit
30388bcf0b
@ -399,22 +399,18 @@ This cc65 version has some extensions to the ISO C standard.
|
|||||||
file. The syntax is
|
file. The syntax is
|
||||||
|
|
||||||
<tscreen><verb>
|
<tscreen><verb>
|
||||||
asm (<string literal>) ;
|
asm (<string literal>[, optional parameters]) ;
|
||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
or
|
or
|
||||||
<tscreen><verb>
|
<tscreen><verb>
|
||||||
__asm__ (<string literal>) ;
|
__asm__ (<string literal>[, optional parameters]) ;
|
||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
|
|
||||||
The first form is in the user namespace and is disabled if the <tt/-A/
|
The first form is in the user namespace and is disabled if the <tt/-A/
|
||||||
switch is given.
|
switch is given.
|
||||||
|
|
||||||
The given string is inserted literally into the output file, and a
|
There is a whole section covering inline assembler statements,
|
||||||
newline is appended. The statements in this string are not checked by
|
<ref id="inline-asm" name="see there">.
|
||||||
the compiler, so be careful!
|
|
||||||
|
|
||||||
The asm statement may be used inside a function and on global file
|
|
||||||
level.
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
<item> There is a special calling convention named "fastcall". This calling
|
<item> There is a special calling convention named "fastcall". This calling
|
||||||
@ -727,6 +723,80 @@ id="pragma-staticlocals"<p>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<sect>Inline assembler<label id="inline-asm"><p>
|
||||||
|
|
||||||
|
The compiler allows to insert assembler statements into the output file. The
|
||||||
|
syntax is
|
||||||
|
|
||||||
|
<tscreen><verb>
|
||||||
|
asm (<string literal>[, optional parameters]) ;
|
||||||
|
</verb></tscreen>
|
||||||
|
or
|
||||||
|
<tscreen><verb>
|
||||||
|
__asm__ (<string literal>[, optional parameters]) ;
|
||||||
|
</verb></tscreen>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The first form is in the user namespace and is disabled by <tt><ref
|
||||||
|
id="option-A" name="-A"></tt>.
|
||||||
|
|
||||||
|
The asm statement may be used inside a function and on global file level. An
|
||||||
|
inline assembler statement is a primary expression, so it may also be used as
|
||||||
|
part of an expression. Please note however that the result of an expression
|
||||||
|
containing just an inline assembler statement is always of type <tt/void/.
|
||||||
|
|
||||||
|
The contents of the string literal are preparsed by the compiler and inserted
|
||||||
|
into the generated assembly output, so that the can be further processed by
|
||||||
|
the backend and especially the optimizer. For this reason, the compiler does
|
||||||
|
only allow regular 6502 opcodes to be used with the inline assembler. Pseudo
|
||||||
|
instructions (like <tt/.import/, <tt/.byte/ and so on) are <em/not/ allowed,
|
||||||
|
even if the ca65 assembler (which is used to translate the generated assembler
|
||||||
|
code) would accept them. The builtin inline assembler is not a replacement for
|
||||||
|
the full blown macro assembler which comes with the compiler.
|
||||||
|
|
||||||
|
Note: Inline assembler statements are subject to all optimizations done by the
|
||||||
|
compiler. There is currently no way to protect an inline assembler statement
|
||||||
|
from being moved or removed completely by the optimizer. If in doubt, check
|
||||||
|
the generated assembler output, or disable optimizations.
|
||||||
|
|
||||||
|
The string literal may contain format specifiers from the following list. For
|
||||||
|
each format specifier, an argument is expected which is inserted instead of
|
||||||
|
the format specifier before passing the assembly code line to the backend.
|
||||||
|
|
||||||
|
<itemize>
|
||||||
|
<item><tt/%b/ - Numerical 8 bit value
|
||||||
|
<item><tt/%w/ - Numerical 16 bit value
|
||||||
|
<item><tt/%l/ - Numerical 32 bit value
|
||||||
|
<item><tt/%v/ - Assembler name of a (global) variable
|
||||||
|
<item><tt/%o/ - Stack offset of a (local) variable
|
||||||
|
<item><tt/%%/ - The % sign itself
|
||||||
|
</itemize><p>
|
||||||
|
|
||||||
|
Using these format specifiers, you can access C <tt/#defines/, variables or
|
||||||
|
similar stuff from the inline assembler. For example, to load the value of
|
||||||
|
a C <tt/#define/ into the Y register, one would use
|
||||||
|
|
||||||
|
<tscreen><verb>
|
||||||
|
#define OFFS 23
|
||||||
|
__asm__ ("ldy #%b", OFFS);
|
||||||
|
</verb></tscreen>
|
||||||
|
|
||||||
|
Or, to access a struct member of a static variable:
|
||||||
|
|
||||||
|
<tscreen><verb>
|
||||||
|
typedef struct {
|
||||||
|
unsigned char x;
|
||||||
|
unsigned char y;
|
||||||
|
unsigned char color;
|
||||||
|
} pixel_t;
|
||||||
|
static pixel_t pixel;
|
||||||
|
__asm__ ("ldy #%b", offsetof(pixel, color));
|
||||||
|
__asm__ ("lda %v,y", pixel);
|
||||||
|
</verb></tscreen>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect>Bugs/Feedback<p>
|
<sect>Bugs/Feedback<p>
|
||||||
|
|
||||||
If you have problems using the compiler, if you find any bugs, or if you're
|
If you have problems using the compiler, if you find any bugs, or if you're
|
||||||
|
Loading…
Reference in New Issue
Block a user