2021-01-01 06:58:58 +08:00
|
|
|
@c Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
2018-05-18 22:26:18 +08:00
|
|
|
@c This is part of the GAS manual.
|
|
|
|
@c For copying conditions, see the file as.texinfo.
|
|
|
|
@ifset GENERIC
|
|
|
|
@page
|
|
|
|
@node S12Z-Dependent
|
2019-05-15 20:16:33 +08:00
|
|
|
@chapter S12Z Dependent Features
|
2018-05-18 22:26:18 +08:00
|
|
|
@end ifset
|
|
|
|
@ifclear GENERIC
|
|
|
|
@node Machine Dependencies
|
2019-05-15 20:16:33 +08:00
|
|
|
@chapter S12Z Dependent Features
|
2018-05-18 22:26:18 +08:00
|
|
|
@end ifclear
|
|
|
|
|
|
|
|
The Freescale S12Z version of @code{@value{AS}} has a few machine
|
|
|
|
dependent features.
|
|
|
|
|
|
|
|
@cindex S12Z support
|
|
|
|
@menu
|
2019-05-18 14:25:18 +08:00
|
|
|
* S12Z Options:: S12Z Options
|
|
|
|
* S12Z Syntax:: Syntax
|
2018-05-18 22:26:18 +08:00
|
|
|
@end menu
|
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
@node S12Z Options
|
2018-05-18 22:26:18 +08:00
|
|
|
@section S12Z Options
|
|
|
|
|
|
|
|
@cindex options, S12Z
|
|
|
|
@cindex S12Z options
|
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
The S12Z version of @code{@value{AS}} recognizes the following options:
|
2019-05-15 20:16:33 +08:00
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
@table @samp
|
|
|
|
|
|
|
|
@item -mreg-prefix=@var{prefix}
|
2019-05-15 20:16:33 +08:00
|
|
|
@cindex @samp{-mreg-prefix=@var{prefix}} option, reg-prefix
|
|
|
|
You can use the @samp{-mreg-prefix=@var{pfx}} option to indicate
|
2019-05-18 14:25:18 +08:00
|
|
|
that the assembler should expect all register names to be prefixed with the
|
2019-05-15 20:16:33 +08:00
|
|
|
string @var{pfx}.
|
|
|
|
|
|
|
|
For an explanation of what this means and why it might be needed,
|
2019-05-18 14:25:18 +08:00
|
|
|
see @ref{S12Z Register Notation}.
|
2019-05-22 13:16:14 +08:00
|
|
|
|
|
|
|
|
|
|
|
@item -mdollar-hex
|
|
|
|
@cindex @samp{-mdollar-hex} option, dollar-hex
|
|
|
|
@cindex hexadecimal prefix, S12Z
|
|
|
|
The @samp{-mdollar-hex} option affects the way that literal hexadecimal constants
|
|
|
|
are represented. When this option is specified, the assembler will consider
|
|
|
|
the @samp{$} character as the start of a hexadecimal integer constant. Without
|
|
|
|
this option, the standard value of @samp{0x} is expected.
|
|
|
|
|
|
|
|
If you use this option, then you cannot have symbol names starting with @samp{$}.
|
|
|
|
@samp{-mdollar-hex} is implied if the @samp{--traditional-format}
|
|
|
|
(@pxref{traditional-format}) is used.
|
2019-05-18 14:25:18 +08:00
|
|
|
@end table
|
2019-05-15 20:16:33 +08:00
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
@node S12Z Syntax
|
2018-05-18 22:26:18 +08:00
|
|
|
@section Syntax
|
|
|
|
|
2019-05-15 20:16:33 +08:00
|
|
|
|
|
|
|
@menu
|
2019-05-18 14:25:18 +08:00
|
|
|
* S12Z Syntax Overview:: General description
|
|
|
|
* S12Z Addressing Modes:: Operands and their semantics
|
|
|
|
* S12Z Register Notation:: How to refer to registers
|
2019-05-15 20:16:33 +08:00
|
|
|
@end menu
|
|
|
|
|
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
@cindex S12Z syntax
|
|
|
|
@cindex syntax, S12Z
|
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
@node S12Z Syntax Overview
|
|
|
|
@subsection Overview
|
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
In the S12Z syntax, the instruction name comes first and it may
|
2019-05-18 14:25:18 +08:00
|
|
|
be followed by one, or by several operands.
|
2018-05-18 22:26:18 +08:00
|
|
|
In most cases the maximum number of operands is three.
|
2019-05-18 14:25:18 +08:00
|
|
|
Operands are separated by a comma (@samp{,}).
|
|
|
|
A comma however does not act as a separator if it appears within parentheses
|
|
|
|
(@samp{()}) or within square brackets (@samp{[]}).
|
|
|
|
@code{@value{AS}} will complain if too many, too few or inappropriate operands
|
|
|
|
are specified for a given instruction.
|
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
Some instructions accept and (in certain situations require) a suffix
|
|
|
|
indicating the size of the operand.
|
|
|
|
The suffix is separated from the instruction name by a period (@samp{.})
|
|
|
|
and may be one of @samp{b}, @samp{w}, @samp{p} or @samp{l} indicating
|
|
|
|
`byte' (a single byte), `word' (2 bytes), `pointer' (3 bytes) or `long' (4 bytes)
|
|
|
|
respectively.
|
2019-05-18 14:25:18 +08:00
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
Example:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
bset.b 0xA98, #5
|
|
|
|
mov.b #6, 0x2409
|
|
|
|
ld d0, #4
|
|
|
|
mov.l (d0, x), 0x2409
|
|
|
|
inc d0
|
|
|
|
cmp d0, #12
|
|
|
|
blt *-4
|
|
|
|
lea x, 0x2409
|
|
|
|
st y, (1, x)
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
@cindex line comment character, S12Z
|
|
|
|
The presence of a @samp{;} character anywhere
|
|
|
|
on a line indicates the start of a comment that extends to the end of
|
|
|
|
that line.
|
|
|
|
|
|
|
|
A @samp{*} or a @samp{#} character at the start of a line also
|
|
|
|
introduces a line comment, but these characters do not work elsewhere
|
|
|
|
on the line. If the first character of the line is a @samp{#} then as
|
|
|
|
well as starting a comment, the line could also be logical line number
|
|
|
|
directive (@pxref{Comments}) or a preprocessor control command
|
|
|
|
(@pxref{Preprocessing}).
|
|
|
|
|
|
|
|
@cindex line separator, S12Z
|
|
|
|
@cindex statement separator, S12Z
|
|
|
|
@cindex S12Z line separator
|
|
|
|
The S12Z assembler does not currently support a line separator
|
|
|
|
character.
|
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
|
|
|
|
@node S12Z Addressing Modes
|
|
|
|
@subsection Addressing Modes
|
2018-05-18 22:26:18 +08:00
|
|
|
@cindex S12Z addressing modes
|
|
|
|
@cindex addressing modes, S12Z
|
2019-05-18 14:25:18 +08:00
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
The following addressing modes are understood for the S12Z.
|
|
|
|
@table @dfn
|
|
|
|
@item Immediate
|
|
|
|
@samp{#@var{number}}
|
|
|
|
|
|
|
|
@item Immediate Bit Field
|
|
|
|
@samp{#@var{width}:@var{offset}}
|
|
|
|
|
|
|
|
Bit field instructions in the immediate mode require the width and offset to
|
|
|
|
be specified.
|
2019-05-18 14:25:18 +08:00
|
|
|
The @var{width} parameter specifies the number of bits in the field.
|
2018-05-18 22:26:18 +08:00
|
|
|
It should be a number in the range [1,32].
|
|
|
|
@var{Offset} determines the position within the field where the operation
|
|
|
|
should start.
|
|
|
|
It should be a number in the range [0,31].
|
|
|
|
|
|
|
|
@item Relative
|
|
|
|
@samp{*@var{symbol}}, or @samp{*[+-]@var{digits}}
|
|
|
|
|
|
|
|
Program counter relative addresses have a width of 15 bits.
|
|
|
|
Thus, they must be within the range [-32768, 32767].
|
|
|
|
|
|
|
|
@item Register
|
|
|
|
@samp{@var{reg}}
|
|
|
|
|
2019-05-15 20:16:33 +08:00
|
|
|
@cindex register names, S12Z
|
2018-05-18 22:26:18 +08:00
|
|
|
Some instructions accept a register as an operand.
|
2019-05-15 20:16:33 +08:00
|
|
|
In general, @var{reg} may be a
|
|
|
|
data register (@samp{D0}, @samp{D1} @dots{} @samp{D7}),
|
|
|
|
the @samp{X} register or the @samp{Y} register.
|
2018-05-18 22:26:18 +08:00
|
|
|
|
|
|
|
A few instructions accept as an argument the stack pointer
|
|
|
|
register (@samp{S}), and/or the program counter (@samp{P}).
|
|
|
|
|
|
|
|
Some very special instructions accept arguments which refer to the
|
|
|
|
condition code register. For these arguments the syntax is
|
2019-05-15 20:16:33 +08:00
|
|
|
@samp{CCR}, @samp{CCH} or @samp{CCL} which refer to the complete
|
|
|
|
condition code register, the condition code register high byte
|
|
|
|
and the condition code register low byte respectively.
|
|
|
|
|
2018-05-18 22:26:18 +08:00
|
|
|
|
|
|
|
@item Absolute Direct
|
|
|
|
@samp{@var{symbol}}, or @samp{@var{digits}}
|
|
|
|
|
|
|
|
@item Absolute Indirect
|
|
|
|
@samp{[@var{symbol}}, or @samp{@var{digits}]}
|
|
|
|
|
|
|
|
|
|
|
|
@item Constant Offset Indexed
|
|
|
|
@samp{(@var{number},@var{reg})}
|
|
|
|
|
|
|
|
@var{Reg} may be either @samp{X}, @samp{Y}, @samp{S} or
|
|
|
|
@samp{P} or one of the data registers @samp{D0}, @samp{D1} @dots{}
|
|
|
|
@samp{D7}.
|
|
|
|
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then the
|
|
|
|
register value is treated as a signed value.
|
|
|
|
Otherwise it is treated as unsigned.
|
|
|
|
@var{Number} may be any integer in the range [-8388608,8388607].
|
|
|
|
|
|
|
|
@item Offset Indexed Indirect
|
|
|
|
@samp{[@var{number},@var{reg}]}
|
|
|
|
|
|
|
|
@var{Reg} may be either @samp{X}, @samp{Y}, @samp{S} or
|
|
|
|
@samp{P}.
|
|
|
|
@var{Number} may be any integer in the range [-8388608,8388607].
|
|
|
|
|
|
|
|
@item Auto Pre-Increment/Pre-Decrement/Post-Increment/Post-Decrement
|
|
|
|
@samp{-@var{reg}},
|
|
|
|
@samp{+@var{reg}},
|
|
|
|
@samp{@var{reg}-} or
|
|
|
|
@samp{@var{reg}+}
|
|
|
|
|
|
|
|
This addressing mode is typically used to access a value at an address,
|
|
|
|
and simultaneously to increment/decrement the register pointing to that
|
|
|
|
address.
|
|
|
|
Thus @var{reg} may be any of the 24 bit registers @samp{X}, @samp{Y}, or
|
|
|
|
@samp{S}.
|
|
|
|
Pre-increment and post-decrement are not available for
|
|
|
|
register @samp{S} (only post-increment and pre-decrement are available).
|
|
|
|
|
|
|
|
@item Register Offset Direct
|
|
|
|
@samp{(@var{data-reg},@var{reg})}
|
|
|
|
|
|
|
|
@var{Reg} can be either @samp{X}, @samp{Y}, or @samp{S}.
|
|
|
|
@var{Data-reg}
|
|
|
|
must be one of the data registers @samp{D0}, @samp{D1} @dots{} @samp{D7}.
|
|
|
|
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then
|
|
|
|
the register value is treated as a signed value.
|
|
|
|
Otherwise it is treated as unsigned.
|
|
|
|
|
|
|
|
@item Register Offset Indirect
|
|
|
|
@samp{[@var{data-reg},@var{reg}]}
|
|
|
|
|
|
|
|
@var{Reg} can be either @samp{X} or @samp{Y}.
|
|
|
|
@var{Data-reg}
|
|
|
|
must be one of the data registers @samp{D0}, @samp{D1} @dots{} @samp{D7}.
|
|
|
|
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then
|
|
|
|
the register value is treated as a signed value.
|
|
|
|
Otherwise it is treated as unsigned.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
@smallexample
|
2019-05-18 14:25:18 +08:00
|
|
|
trap #197 ;; Immediate mode
|
|
|
|
bra *+49 ;; Relative mode
|
|
|
|
bra .L0 ;; ditto
|
|
|
|
jmp 0xFE0034 ;; Absolute direct mode
|
|
|
|
jmp [0xFD0012] ;; Absolute indirect mode
|
|
|
|
inc.b (4,x) ;; Constant offset indexed mode
|
|
|
|
jsr (45, d0) ;; ditto
|
|
|
|
dec.w [4,y] ;; Constant offset indexed indirect mode
|
|
|
|
clr.p (-s) ;; Pre-decrement mode
|
|
|
|
neg.l (d0, s) ;; Register offset direct mode
|
|
|
|
com.b [d1, x] ;; Register offset indirect mode
|
|
|
|
psh cch ;; Register mode
|
2018-05-18 22:26:18 +08:00
|
|
|
@end smallexample
|
|
|
|
|
2019-05-18 14:25:18 +08:00
|
|
|
@node S12Z Register Notation
|
2019-05-15 20:16:33 +08:00
|
|
|
@subsection Register Notation
|
|
|
|
|
|
|
|
@cindex register notation, S12Z
|
2019-05-18 14:25:18 +08:00
|
|
|
Without a register prefix (@pxref{S12Z Options}), S12Z assembler code is expected in the traditional
|
2019-05-15 20:16:33 +08:00
|
|
|
format like this:
|
|
|
|
@smallexample
|
|
|
|
lea s, (-2,s)
|
|
|
|
st d2, (0,s)
|
|
|
|
ld x, symbol
|
|
|
|
tfr d2, d6
|
|
|
|
cmp d6, #1532
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
@noindent
|
|
|
|
However, if @code{@value{AS}} is started with (for example) @samp{-mreg-prefix=%}
|
|
|
|
then all register names must be prefixed with @samp{%} as follows:
|
|
|
|
@smallexample
|
|
|
|
lea %s, (-2,%s)
|
|
|
|
st %d2, (0,%s)
|
|
|
|
ld %x, symbol
|
|
|
|
tfr %d2, %d6
|
|
|
|
cmp %d6, #1532
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
The register prefix feature is intended to be used by compilers
|
|
|
|
to avoid ambiguity between symbols and register names.
|
|
|
|
Consider the following assembler instruction:
|
|
|
|
@smallexample
|
|
|
|
st d0, d1
|
|
|
|
@end smallexample
|
|
|
|
@noindent
|
2019-05-18 14:25:18 +08:00
|
|
|
The destination operand of this instruction could either refer to the register
|
|
|
|
@samp{D1}, or it could refer to the symbol named ``d1''.
|
|
|
|
If the latter is intended then @code{@value{AS}} must be invoked with
|
2019-05-15 20:16:33 +08:00
|
|
|
@samp{-mreg-prefix=@var{pfx}} and the code written as
|
|
|
|
@smallexample
|
|
|
|
st @var{pfx}d0, d1
|
|
|
|
@end smallexample
|
|
|
|
@noindent
|
|
|
|
where @var{pfx} is the chosen register prefix.
|
|
|
|
For this reason, compiler back-ends should choose a register prefix which
|
|
|
|
cannot be confused with a symbol name.
|