Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Jun 1998 15:57:02 -0500 (CDT)
From:      Joel Ray Holveck <joelh@gnu.org>
To:        smoergrd@oslo.geco-prakla.slb.com
Cc:        belkovic@albert.osu.cz, smoergrd@oslo.geco-prakla.slb.com, freebsd-hackers@FreeBSD.ORG
Subject:   Re: BROKEN_KEYBOARD_RESET
Message-ID:  <199806292057.PAA28923@detlev.UUCP>
In-Reply-To: <rx490mgnxn5.fsf@oslo.geco-prakla.slb.com> (smoergrd@oslo.geco-prakla.slb.com)
References:  <Pine.BSF.3.95q.980629144018.1658B-100000@albert.osu.cz> <rx490mgnxn5.fsf@oslo.geco-prakla.slb.com>

next in thread | previous in thread | raw e-mail | index | archive | help
>> I wrote mail, because i don't know FreeBSD-asembler syntax
> It's not 'FreeBSD-assembler syntax", but AT&T assembler syntax, upon
> which gas (the GNU assembler), which FreeBSD uses, is based.

So, here's a real quick bit on the differences between what you know
and what you need to.  Most of it was taken from the 'as' info pages
(which you should read).  I am giving you information here which
mostly pertains to a.out without debugging information.

I'll probably be putting this online soon, so anybody's suggestions
are welcome.

* Name your source file with a .S if it needs to be preprocessed with
  cpp, or .s if it doesn't.  Invoke gcc to assemble, as if it were a C
  file.

* Registers are prefixed by '%'.  Immediate operands (including
  labels) are prefixed by '$'.  Absolute jump/call operands are
  prefixed by '*'.  (Relative jump/call operands have no prefix.)
  EXAMPLE:
       INTEL / MASM         AT&T / GAS
         push 4              pushl $4
         push eax            pushl %eax
         jmp A200            jmp *A200

* Intel and MASM use 'opcode dest, source' (eg 'add eax, 4').  AT&T
  Unix uses 'opcode source, dest'. (eg 'addl $4, %eax').

* Opcodes need to have their operand sizes specified with suffixes of
  'b', 'w', and 'l' for 8, 16, and 32 bits.  This replaces
  Intel/MASM's 'byte ptr', 'word ptr', and 'dword ptr', respectively.
  For example, 'mov eax, dword ptr IDENT' becomes 'movl IDENT, %eax'.
  (Note that some other Unix assemblers assume an 'l' suffix.)

* The sign extend and zero extend opcodes (which are changed from
  'movsx' and 'movzx' to 'movs' and 'movz') take two operand size
  suffixes, first from source, second for destination.  (eg: 'movsbl
  %al, %edx')

* Some sign-extend mnemonics have aliases.  (The Intel forms are also
  accepted, but the AT&T forms are preferred.)
    INTEL / MASM     AT&T / GAS
      cbw              cbtw
      cwde             cwtl
      cwd              cwtd
      cdq              cltd

* Long jumps and calls are 'ljmp $SEGMENT,$OFFSET' instead
  of 'jmp far SEGMENT:OFFSET'.  Also, far return is 'lret' instead of
  'ret far'.

* The segment prefixes 'cs:', 'ds:' still work fine (don't forget the
  %).  If they are given on the line before the instruction (like
  debug's `u' command shows, as opposed to as part of the memory
  operand, as is traditionally written), the colon is omitted.  If
  a segment prefix specifies the default segment, then it is omitted
  from the emitted code.

* Indirection is written differently.  Intel writes [BASE +
  INDEX*SCALE + DISP] (where BASE and INDEX are the base and index
  registers, DISP is the optional diplacement, and SCALE is a data
  width for INDEX).  AT&T writes DISP(BASE, INDEX, SCALE) instead.

* I don't believe that the 'repz' aliases for the 'repe' opcodes are
  supported.

* Packed BCD is not supported.  (If you're doing kernel work, then
  floating-point operations are a no-no anyway, IIRC.)

* The 16-, 32-, and 64-bit expanding multiplies can be output only in
  the one operand form.  Thus, `imul %ebx, %eax' does *not* select the
  expanding multiply; the expanding multiply would clobber the `%edx'
  register, and this would confuse `gcc' output.  Use `imul %ebx' to
  get the 64-bit product in `%edx:%eax'.  A two operand form of `imul'
  has been added, where the first operand is an immediate mode
  expression and the second operand is a register.  This is just a
  shorthand, so that, multiplying `%eax' by 69, for example, can be
  done with `imul $69, %eax' rather than `imul $69, %eax, %eax'.

* The following section pseudo-ops are used.  They affect the code up
  to the next section pseudo-op.

  .data              For read-write memory (global variables, etc)
  .text              For program code or other read-only memory

* Symbols are created in the following ways:

  SYMBOL:            What you're used to.
  SYM = EXPR         Used as SYMBOL EQU nn.  (May be used as .set SYM,
                     EXPR or .equ SYM, EXPR)
  .                  Refers to the current address, as with MASM.
  .comm SYM, LEN     Declares an exported zero-initialized symbol LEN
                     bytes long that is allocated at load-time.  This
                     may be in several source files and will result in
                     only one symbol.  (These are placed in the 'bss'
                     section.)
  .lcomm SYM, LEN    Same as .comm, but is not exported.

* The following pseudo-ops insert literals.  Except fill and space,
  each can have several listed.

  .ascii, .asciz (adds a \0), .byte (8-bit), .hword (16-bit), .int
  (32-bit) (aliases: .int, .short, .long), .octa (16-byte bignums),
  .quad (8-byte bignums), .single (alias: .float), .double, 
  .fill (see below), .space (see see below)

* The following various pseudo-ops are availible:

  .abort             Stops assembly.
  .if / .else / .endif   Figure it out.
  .ifdef SYM / .ifndef SYM   Assembles if SYM is defined.
  .include "FILE"    Figure it out.

  .global SYM        Exports a symbol.  (Alias: .globl)
  .extern            Clue to a human that a symbol is external.  (This
                     is assumed if a symbol is not found in the source.)
  .lsym SYM, EXP     Creates a local symbol that cannot be referenced by the
                     assembler.

  .align EXP, PAD    Pads with PAD (default 0) to a location divisable
                     by 2^EXP. 
  .fill CNT,LEN,VAL  Inserts a repeated expression LEN bytes long.
  .space CNT,VAL     Same as .fill CNT,1,VAL
  .org LC, FILL      Fills with FILL until the location LC.

* The following pseudo-ops control assembly listings:

  .list              Turn on listings.
  .nolist            Turn off listings.
  .eject             Emit a page break.
  .psize LINES, COLS Declare a page size.
  .title "TEXT"      Declare a title.
  .sbttl "TEXT"      Declare a subtitle.

* When calling C functions, push the first arguments last, the last
  arguments first.  Don't forget the leading _.  Return values are in
  %eax.  If your function takes arguments, remember that the return
  address is 4 bytes at %esp when you start.  This means that your int
  arguments start at 8(%esp) then 12(%esp) then 16(%esp) and so on.
  (Normally, you will be using %ebp instead, of course.)  When you
  return, have the stack pointer where you found it when you started.

* You can see how gcc will generate the assembly code for your C
  sources by running gcc -S, eg 'gcc -S hello.c' will create
  hello.s as an assembly code file.

Recommended reading includes:
  "Using as: The GNU Assembler" (the as texinfo page), ld(1),
  a.out(5), Intel Architecture Software Developer's Manual,

Happy hacking,
joelh

-- 
Joel Ray Holveck - joelh@gnu.org - http://www.wp.com/piquan
   Fourth law of programming:
   Anything that can go wrong wi
sendmail: segmentation violation - core dumped

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806292057.PAA28923>