Go to the first, previous, next, last section, table of contents.

# H8/300 Dependent Features

- H8/300 Options: Options
- H8/300 Syntax: Syntax
- H8/300 Floating Point: Floating Point
- H8/300 Directives: H8/300 Machine Directives
- H8/300 Opcodes: Opcodes

## Options

`as` has no additional command-line options for the Hitachi H8/300 family.

## Syntax

- H8/300-Chars: Special Characters
- H8/300-Regs: Register Names
- H8/300-Addressing: Addressing Modes

### Special Characters

``;'` is the line comment character.

``$'` can be used instead of a newline to separate statements. Therefore you may not use ``$'` in symbol names on the H8/300.

### Register Names

You can use predefined symbols of the form ``rnh'` and ``rnl'` to refer to the H8/300 registers as sixteen 8-bit general-purpose registers. n is a digit from ``0'` to ``7'`); for instance, both ``r0h'` and ``r7l'` are valid register names.

You can also use the eight predefined symbols ``rn'` to refer to the H8/300 registers as 16-bit registers (you must use this form for addressing).

On the H8/300H, you can also use the eight predefined symbols ``ern'` (``er0'` ... ``er7'`) to refer to the 32-bit general purpose registers.

The two control registers are called `pc` (program counter; a 16-bit register, except on the H8/300H where it is 24 bits) and `ccr` (condition code register; an 8-bit register). `r7` is used as the stack pointer, and can also be called `sp`.

### Addressing Modes

as understands the following addressing modes for the H8/300:

`rn`
  Register direct
`@rn`
  Register indirect
`@(d, rn)`
`@(d:16, rn)`
`@(d:24, rn)`
  Register indirect: 16-bit or 24-bit displacement d from register n. (24-bit displacements are only meaningful on the H8/300H.)
`@rn+`
  Register indirect with post-increment
`@-rn`
  Register indirect with pre-decrement
``@`aa`
``@`aa:8`
``@`aa:16`
``@`aa:24`
  Absolute address `aa`. (The address size ``:24'` only makes sense on the H8/300H.)
`#xx`
`#xx:8`
`#xx:16`
`#xx:32`
  Immediate data xx. You may specify the ``:8'`, ``:16'`, or ``:32'` for clarity, if you wish; but `as` neither requires this nor uses it--the data size required is taken from context.
``@``@`aa`
``@``@`aa:8`
  Memory indirect. You may specify the ``:8'` for clarity, if you wish; but `as` neither requires this nor uses it.

## Floating Point

The H8/300 family has no hardware floating point, but the `.float` directive generates IEEE floating-point numbers for compatibility with other development tools.

## H8/300 Machine Directives

`as` has only one machine-dependent directive for the H8/300:

`.h8300h`
  Recognize and emit additional instructions for the H8/300H variant, and also make `.int` emit 32-bit numbers rather than the usual (16-bit) for the H8/300 family.

On the H8/300 family (including the H8/300H) ``.word'` directives generate 16-bit numbers.

## Opcodes

For detailed information on the H8/300 machine instruction set, see H8/300 Series Programming Manual (Hitachi ADE--602--025). For information specific to the H8/300H, see H8/300H Series Programming Manual (Hitachi).

`as` implements all the standard H8/300 opcodes. No additional pseudo-instructions are needed on this family.

Four H8/300 instructions (`add`, `cmp`, `mov`, `sub`) are defined with variants using the suffixes ``.b'`, ``.w'`, and ``.l'` to specify the size of a memory operand. `as` supports these suffixes, but does not require them; since one of the operands is always a register, `as` can deduce the correct size.

For example, since `r0` refers to a 16-bit register,

    mov    r0,@foo
    is equivalent to
    mov.w  r0,@foo

If you use the size suffixes, `as` issues a warning when the suffix and the register size do not match.

Go to the first, previous, next, last section, table of contents.