123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- @c Copyright (C) 1991-2015 Free Software Foundation, Inc.
- @c This is part of the GAS manual.
- @c For copying conditions, see the file as.texinfo.
- @ifset GENERIC
- @page
- @node M68HC11-Dependent
- @chapter M68HC11 and M68HC12 Dependent Features
- @end ifset
- @ifclear GENERIC
- @node Machine Dependencies
- @chapter M68HC11 and M68HC12 Dependent Features
- @end ifclear
- @cindex M68HC11 and M68HC12 support
- @menu
- * M68HC11-Opts:: M68HC11 and M68HC12 Options
- * M68HC11-Syntax:: Syntax
- * M68HC11-Modifiers:: Symbolic Operand Modifiers
- * M68HC11-Directives:: Assembler Directives
- * M68HC11-Float:: Floating Point
- * M68HC11-opcodes:: Opcodes
- @end menu
- @node M68HC11-Opts
- @section M68HC11 and M68HC12 Options
- @cindex options, M68HC11
- @cindex M68HC11 options
- The Motorola 68HC11 and 68HC12 version of @code{@value{AS}} have a few machine
- dependent options.
- @table @code
- @cindex @samp{-m68hc11}
- @item -m68hc11
- This option switches the assembler into the M68HC11 mode. In this mode,
- the assembler only accepts 68HC11 operands and mnemonics. It produces
- code for the 68HC11.
- @cindex @samp{-m68hc12}
- @item -m68hc12
- This option switches the assembler into the M68HC12 mode. In this mode,
- the assembler also accepts 68HC12 operands and mnemonics. It produces
- code for the 68HC12. A few 68HC11 instructions are replaced by
- some 68HC12 instructions as recommended by Motorola specifications.
- @cindex @samp{-m68hcs12}
- @item -m68hcs12
- This option switches the assembler into the M68HCS12 mode. This mode is
- similar to @samp{-m68hc12} but specifies to assemble for the 68HCS12
- series. The only difference is on the assembling of the @samp{movb}
- and @samp{movw} instruction when a PC-relative operand is used.
- @cindex @samp{-mm9s12x}
- @item -mm9s12x
- This option switches the assembler into the M9S12X mode. This mode is
- similar to @samp{-m68hc12} but specifies to assemble for the S12X
- series which is a superset of the HCS12.
- @cindex @samp{-mm9s12xg}
- @item -mm9s12xg
- This option switches the assembler into the XGATE mode for the RISC
- co-processor featured on some S12X-family chips.
- @cindex @samp{--xgate-ramoffset}
- @item --xgate-ramoffset
- This option instructs the linker to offset RAM addresses from S12X address
- space into XGATE address space.
- @cindex @samp{-mshort}
- @item -mshort
- This option controls the ABI and indicates to use a 16-bit integer ABI.
- It has no effect on the assembled instructions.
- This is the default.
- @cindex @samp{-mlong}
- @item -mlong
- This option controls the ABI and indicates to use a 32-bit integer ABI.
- @cindex @samp{-mshort-double}
- @item -mshort-double
- This option controls the ABI and indicates to use a 32-bit float ABI.
- This is the default.
- @cindex @samp{-mlong-double}
- @item -mlong-double
- This option controls the ABI and indicates to use a 64-bit float ABI.
- @cindex @samp{--strict-direct-mode}
- @item --strict-direct-mode
- You can use the @samp{--strict-direct-mode} option to disable
- the automatic translation of direct page mode addressing into
- extended mode when the instruction does not support direct mode.
- For example, the @samp{clr} instruction does not support direct page
- mode addressing. When it is used with the direct page mode,
- @code{@value{AS}} will ignore it and generate an absolute addressing.
- This option prevents @code{@value{AS}} from doing this, and the wrong
- usage of the direct page mode will raise an error.
- @cindex @samp{--short-branches}
- @item --short-branches
- The @samp{--short-branches} option turns off the translation of
- relative branches into absolute branches when the branch offset is
- out of range. By default @code{@value{AS}} transforms the relative
- branch (@samp{bsr}, @samp{bgt}, @samp{bge}, @samp{beq}, @samp{bne},
- @samp{ble}, @samp{blt}, @samp{bhi}, @samp{bcc}, @samp{bls},
- @samp{bcs}, @samp{bmi}, @samp{bvs}, @samp{bvs}, @samp{bra}) into
- an absolute branch when the offset is out of the -128 .. 127 range.
- In that case, the @samp{bsr} instruction is translated into a
- @samp{jsr}, the @samp{bra} instruction is translated into a
- @samp{jmp} and the conditional branches instructions are inverted and
- followed by a @samp{jmp}. This option disables these translations
- and @code{@value{AS}} will generate an error if a relative branch
- is out of range. This option does not affect the optimization
- associated to the @samp{jbra}, @samp{jbsr} and @samp{jbXX} pseudo opcodes.
- @cindex @samp{--force-long-branches}
- @item --force-long-branches
- The @samp{--force-long-branches} option forces the translation of
- relative branches into absolute branches. This option does not affect
- the optimization associated to the @samp{jbra}, @samp{jbsr} and
- @samp{jbXX} pseudo opcodes.
- @cindex @samp{--print-insn-syntax}
- @item --print-insn-syntax
- You can use the @samp{--print-insn-syntax} option to obtain the
- syntax description of the instruction when an error is detected.
- @cindex @samp{--print-opcodes}
- @item --print-opcodes
- The @samp{--print-opcodes} option prints the list of all the
- instructions with their syntax. The first item of each line
- represents the instruction name and the rest of the line indicates
- the possible operands for that instruction. The list is printed
- in alphabetical order. Once the list is printed @code{@value{AS}}
- exits.
- @cindex @samp{--generate-example}
- @item --generate-example
- The @samp{--generate-example} option is similar to @samp{--print-opcodes}
- but it generates an example for each instruction instead.
- @end table
- @node M68HC11-Syntax
- @section Syntax
- @cindex M68HC11 syntax
- @cindex syntax, M68HC11
- In the M68HC11 syntax, the instruction name comes first and it may
- be followed by one or several operands (up to three). Operands are
- separated by comma (@samp{,}). In the normal mode,
- @code{@value{AS}} will complain if too many operands are specified for
- a given instruction. In the MRI mode (turned on with @samp{-M} option),
- it will treat them as comments. Example:
- @smallexample
- inx
- lda #23
- bset 2,x #4
- brclr *bot #8 foo
- @end smallexample
- @cindex line comment character, M68HC11
- @cindex M68HC11 line comment character
- The presence of a @samp{;} character or 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, M68HC11
- @cindex statement separator, M68HC11
- @cindex M68HC11 line separator
- The M68HC11 assembler does not currently support a line separator
- character.
- @cindex M68HC11 addressing modes
- @cindex addressing modes, M68HC11
- The following addressing modes are understood for 68HC11 and 68HC12:
- @table @dfn
- @item Immediate
- @samp{#@var{number}}
- @item Address Register
- @samp{@var{number},X}, @samp{@var{number},Y}
- The @var{number} may be omitted in which case 0 is assumed.
- @item Direct Addressing mode
- @samp{*@var{symbol}}, or @samp{*@var{digits}}
- @item Absolute
- @samp{@var{symbol}}, or @samp{@var{digits}}
- @end table
- The M68HC12 has other more complex addressing modes. All of them
- are supported and they are represented below:
- @table @dfn
- @item Constant Offset Indexed Addressing Mode
- @samp{@var{number},@var{reg}}
- The @var{number} may be omitted in which case 0 is assumed.
- The register can be either @samp{X}, @samp{Y}, @samp{SP} or
- @samp{PC}. The assembler will use the smaller post-byte definition
- according to the constant value (5-bit constant offset, 9-bit constant
- offset or 16-bit constant offset). If the constant is not known by
- the assembler it will use the 16-bit constant offset post-byte and the value
- will be resolved at link time.
- @item Offset Indexed Indirect
- @samp{[@var{number},@var{reg}]}
- The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}.
- @item Auto Pre-Increment/Pre-Decrement/Post-Increment/Post-Decrement
- @samp{@var{number},-@var{reg}}
- @samp{@var{number},+@var{reg}}
- @samp{@var{number},@var{reg}-}
- @samp{@var{number},@var{reg}+}
- The number must be in the range @samp{-8}..@samp{+8} and must not be 0.
- The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}.
- @item Accumulator Offset
- @samp{@var{acc},@var{reg}}
- The accumulator register can be either @samp{A}, @samp{B} or @samp{D}.
- The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}.
- @item Accumulator D offset indexed-indirect
- @samp{[D,@var{reg}]}
- The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}.
- @end table
- For example:
- @smallexample
- ldab 1024,sp
- ldd [10,x]
- orab 3,+x
- stab -2,y-
- ldx a,pc
- sty [d,sp]
- @end smallexample
- @node M68HC11-Modifiers
- @section Symbolic Operand Modifiers
- @cindex M68HC11 modifiers
- @cindex syntax, M68HC11
- The assembler supports several modifiers when using symbol addresses
- in 68HC11 and 68HC12 instruction operands. The general syntax is
- the following:
- @smallexample
- %modifier(symbol)
- @end smallexample
- @table @code
- @cindex symbol modifiers
- @item %addr
- This modifier indicates to the assembler and linker to use
- the 16-bit physical address corresponding to the symbol. This is intended
- to be used on memory window systems to map a symbol in the memory bank window.
- If the symbol is in a memory expansion part, the physical address
- corresponds to the symbol address within the memory bank window.
- If the symbol is not in a memory expansion part, this is the symbol address
- (using or not using the %addr modifier has no effect in that case).
- @item %page
- This modifier indicates to use the memory page number corresponding
- to the symbol. If the symbol is in a memory expansion part, its page
- number is computed by the linker as a number used to map the page containing
- the symbol in the memory bank window. If the symbol is not in a memory
- expansion part, the page number is 0.
- @item %hi
- This modifier indicates to use the 8-bit high part of the physical
- address of the symbol.
- @item %lo
- This modifier indicates to use the 8-bit low part of the physical
- address of the symbol.
- @end table
- For example a 68HC12 call to a function @samp{foo_example} stored in memory
- expansion part could be written as follows:
- @smallexample
- call %addr(foo_example),%page(foo_example)
- @end smallexample
- and this is equivalent to
- @smallexample
- call foo_example
- @end smallexample
- And for 68HC11 it could be written as follows:
- @smallexample
- ldab #%page(foo_example)
- stab _page_switch
- jsr %addr(foo_example)
- @end smallexample
- @node M68HC11-Directives
- @section Assembler Directives
- @cindex assembler directives, M68HC11
- @cindex assembler directives, M68HC12
- @cindex M68HC11 assembler directives
- @cindex M68HC12 assembler directives
- The 68HC11 and 68HC12 version of @code{@value{AS}} have the following
- specific assembler directives:
- @table @code
- @item .relax
- @cindex assembler directive .relax, M68HC11
- @cindex M68HC11 assembler directive .relax
- The relax directive is used by the @samp{GNU Compiler} to emit a specific
- relocation to mark a group of instructions for linker relaxation.
- The sequence of instructions within the group must be known to the linker
- so that relaxation can be performed.
- @item .mode [mshort|mlong|mshort-double|mlong-double]
- @cindex assembler directive .mode, M68HC11
- @cindex M68HC11 assembler directive .mode
- This directive specifies the ABI. It overrides the @samp{-mshort},
- @samp{-mlong}, @samp{-mshort-double} and @samp{-mlong-double} options.
- @item .far @var{symbol}
- @cindex assembler directive .far, M68HC11
- @cindex M68HC11 assembler directive .far
- This directive marks the symbol as a @samp{far} symbol meaning that it
- uses a @samp{call/rtc} calling convention as opposed to @samp{jsr/rts}.
- During a final link, the linker will identify references to the @samp{far}
- symbol and will verify the proper calling convention.
- @item .interrupt @var{symbol}
- @cindex assembler directive .interrupt, M68HC11
- @cindex M68HC11 assembler directive .interrupt
- This directive marks the symbol as an interrupt entry point.
- This information is then used by the debugger to correctly unwind the
- frame across interrupts.
- @item .xrefb @var{symbol}
- @cindex assembler directive .xrefb, M68HC11
- @cindex M68HC11 assembler directive .xrefb
- This directive is defined for compatibility with the
- @samp{Specification for Motorola 8 and 16-Bit Assembly Language Input
- Standard} and is ignored.
- @end table
- @node M68HC11-Float
- @section Floating Point
- @cindex floating point, M68HC11
- @cindex M68HC11 floating point
- Packed decimal (P) format floating literals are not supported.
- Feel free to add the code!
- The floating point formats generated by directives are these.
- @table @code
- @cindex @code{float} directive, M68HC11
- @item .float
- @code{Single} precision floating point constants.
- @cindex @code{double} directive, M68HC11
- @item .double
- @code{Double} precision floating point constants.
- @cindex @code{extend} directive M68HC11
- @cindex @code{ldouble} directive M68HC11
- @item .extend
- @itemx .ldouble
- @code{Extended} precision (@code{long double}) floating point constants.
- @end table
- @need 2000
- @node M68HC11-opcodes
- @section Opcodes
- @cindex M68HC11 opcodes
- @cindex opcodes, M68HC11
- @cindex instruction set, M68HC11
- @menu
- * M68HC11-Branch:: Branch Improvement
- @end menu
- @node M68HC11-Branch
- @subsection Branch Improvement
- @cindex pseudo-opcodes, M68HC11
- @cindex M68HC11 pseudo-opcodes
- @cindex branch improvement, M68HC11
- @cindex M68HC11 branch improvement
- Certain pseudo opcodes are permitted for branch instructions.
- They expand to the shortest branch instruction that reach the
- target. Generally these mnemonics are made by prepending @samp{j} to
- the start of Motorola mnemonic. These pseudo opcodes are not affected
- by the @samp{--short-branches} or @samp{--force-long-branches} options.
- The following table summarizes the pseudo-operations.
- @smallexample
- Displacement Width
- +-------------------------------------------------------------+
- | Options |
- | --short-branches --force-long-branches |
- +--------------------------+----------------------------------+
- Op |BYTE WORD | BYTE WORD |
- +--------------------------+----------------------------------+
- bsr | bsr <pc-rel> <error> | jsr <abs> |
- bra | bra <pc-rel> <error> | jmp <abs> |
- jbsr | bsr <pc-rel> jsr <abs> | bsr <pc-rel> jsr <abs> |
- jbra | bra <pc-rel> jmp <abs> | bra <pc-rel> jmp <abs> |
- bXX | bXX <pc-rel> <error> | bNX +3; jmp <abs> |
- jbXX | bXX <pc-rel> bNX +3; | bXX <pc-rel> bNX +3; jmp <abs> |
- | jmp <abs> | |
- +--------------------------+----------------------------------+
- XX: condition
- NX: negative of condition XX
- @end smallexample
- @table @code
- @item jbsr
- @itemx jbra
- These are the simplest jump pseudo-operations; they always map to one
- particular machine instruction, depending on the displacement to the
- branch target.
- @item jb@var{XX}
- Here, @samp{jb@var{XX}} stands for an entire family of pseudo-operations,
- where @var{XX} is a conditional branch or condition-code test. The full
- list of pseudo-ops in this family is:
- @smallexample
- jbcc jbeq jbge jbgt jbhi jbvs jbpl jblo
- jbcs jbne jblt jble jbls jbvc jbmi
- @end smallexample
- For the cases of non-PC relative displacements and long displacements,
- @code{@value{AS}} issues a longer code fragment in terms of
- @var{NX}, the opposite condition to @var{XX}. For example, for the
- non-PC relative case:
- @smallexample
- jb@var{XX} foo
- @end smallexample
- gives
- @smallexample
- b@var{NX}s oof
- jmp foo
- oof:
- @end smallexample
- @end table
|