diff options
| author | Peter Wemm <peter@FreeBSD.org> | 1995-12-30 19:02:48 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 1995-12-30 19:02:48 +0000 |
| commit | a5b996a7ecea192e05c848269fbfb40c1e7c50ef (patch) | |
| tree | b43d0e66d9963acc026a6322b81fd219d273736b /gnu/usr.bin/as | |
| parent | df2fbf15a2e56a16c3b54b93a3369b662b6f20e5 (diff) | |
Notes
Diffstat (limited to 'gnu/usr.bin/as')
28 files changed, 0 insertions, 11780 deletions
diff --git a/gnu/usr.bin/as/Makefile.gnu b/gnu/usr.bin/as/Makefile.gnu deleted file mode 100644 index 4b81b0c1adf1b..0000000000000 --- a/gnu/usr.bin/as/Makefile.gnu +++ /dev/null @@ -1,356 +0,0 @@ -# Makefile for GAS. -# Copyright (C) 1989, Free Software Foundation -# -# This file is part of GAS, the GNU Assembler. -# -# GAS is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 1, or (at your option) -# any later version. -# -# GAS is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GAS; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# This makefile may be used to make the VAX, 68020, 80386, -# SPARC, ns32k, or i860 assembler(s). - -BINDIR = /usr/local/bin -#CC=gcc - -# If you are on a BSD system, un-comment the next two lines, and comment out -# the lines for SystemV and HPUX below -G0 = -g -I. #-O -Wall -LDFLAGS = $(CFLAGS) -# -# To compile gas on a System Five machine, comment out the two lines above -# and un-comment out the next three lines -# Comment out the -lPW on the LOADLIBES line if you are using GCC. -# G0 = -g -I. -DUSG -# LDFLAGS = $(CFLAGS) -# LOADLIBES = -lmalloc -lPW -# -# To compile gas for HPUX, link m-hpux.h to m68k.h , and un-comment the -# next two lines. (If you are using GCC, comment out the alloca.o part) -# (Get alloca from the emacs distribution, or use GCC.) -# HPUX 7.0 may have a bug in setvbuf. gas gives an error message like -# 1:"Unknown operator" -- Statement 'NO_APP' ignored -# if setvbuf is broken. Re-compile input-file.c (and only input-file.c -# with -DVMS and the problem should go away. -# -# G0 = -g -I. -DUSG -# LOADLIBES = alloca.o -# -# To compile gas for a Sequent Symmetry, comment out all the above lines, -# and un-comment the next two lines. -# G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1 -# LOADLIBES = -lc /usr/att/lib/libc.a - -# If you just want to compile the vax assembler, type 'make avax' - -# If you just want to compile the i386 assembler, type 'make a386' - -# If you just want to compile the ns32k assembler, type 'make a32k' - -# If you just want to compile the sparc assembler, type 'make asparc' - -# If you just want to compile the mc68020 assembler, make sure m68k.h -# is correctly set up, and type type 'make a68' (Except on HPUX machines, -# where you will have to make the changes marked below before typing -# 'make a68' -# m68k.h should be a symbolic or hard-link to one of -# m-sun3.h , m-hpux.h or m-generic.h -# depending on which machine you want to compile the 68020 assembler for. -# -# If you want the 68k assembler to be completely compatable with the the -# SUN one, un-comment the -DSUN_ASM_SYNTAX line below. -# -# If you machine does not have vfprintf, but does have _doprnt(), -# remove the # from the -DNO_VARARGS line below. -# -# If the return-type of a signal-hander is void (instead of int), -# remove the # from the -DSIGTY line below. -# -# To include the mc68851 mmu coprocessor instructions in the 68020 assembler, -# remove the # from the -Dm68851 line below. -# -# If you want the 68020 assembler use a register prefix character, un-comment -# the REGISTER_PREFIX line, and (maybe) change the '%' to the appropriate -# character. -# -# If you want the assembler to treat .L* or ..* symbols as local, instead of -# the usual L* symbols, un-comment the DOT_LABEL_PREFIX line. -# -# If you want the 80386 assembler to correctly handle fsub/fsubr and fdiv/fdivr -# opcodes (unlike most 80386 assemblers), remove the # from -# the -DNON_BROKEN_WORDS line below. -# -# To compile 80386 Gas for the Sequent Symmetry, un-comment the -DEXEC_VERSION -# and the -DUSE_SYSTEM_HDR lines below. -# -# To compile gas for the HP 9000/300 un-comment the -DUSE_HP_HDR line below. -# -# For the ns32k, the options are 32532 or 32032 CPU and 32381 or 32081 FPU. -# To select the NS32532, remove the # from the -DNS32532 line below. -# To compile in tne NS32381 opcodes in addition to the NS32081 opcodes -# (the 32381 is a superset of the 32081), remove the # from the -DNS32381 -# line below. -# -# For the ns32k on a Sequent, uncomment the SEQUENT_COMPATABILITY line below. -# -# If you want the .align N directive to align to the next N byte boundry, -# instead of the next 1<<N boundry, un-comment the OTHER_ALIGN line below. -# (This option is automatically enabled when building the sparc assembler. -# - -O1 = -DNO_VARARGS -O2 = # -DNON_BROKEN_WORDS -O3 = # -Dm68851 -O4 = # -DEXEC_VERSION=1 -O5 = # -DSIGTY=void -O6 = # -DNS32532 -O6 = # -DNS32381 -O7 = # -DDOT_LABEL_PREFIX -O8 = # -DSEQUENT_COMPATABILITY -O9 = # -DREGISTER_PREFIX=\'%\' -O10= # -DOTHER_ALIGN - -G1 = # -DUSE_SYSTEM_HDR -G2 = # -DUSE_HP_HDR -G3 = # -DSUN_ASM_SYNTAX - -OPTIONS = $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(O7) $(O8) $(O9) $(O10) - -CFLAGS = $(G0) $(G1) $(G2) $(G3) $(G4) - -# -# To make the 68020 assembler compile as the default, un-comment the next -# line, and comment out all the other lines that start with DEFAULT_GAS -DEFAULT_GAS=a68 -# -# To make the VAX assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=avax -# -# To make the 80386 assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a386 -# -# To make the ns32k assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a32k -# -# To make the sparc assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=asparc -# -# To make the i860 assembler compile as the default, un-comment the next -# line and comment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a860 - -# Global Sources ------------------------------------------------------------- - -a =\ -as.o xrealloc.o xmalloc.o hash.o hex-value.o \ -atof-generic.o append.o messages.o expr.o app.o \ -frags.o input-file.o input-scrub.o output-file.o \ -subsegs.o symbols.o version.o \ -flonum-const.o flonum-copy.o flonum-mult.o strstr.o bignum-copy.o \ -obstack.o -#gdb.o gdb-file.o gdb-symbols.o gdb-blocks.o gdb-lines.o - -a: $(DEFAULT_GAS) - @rm -f a - @ln $(DEFAULT_GAS) a - -# I860 GAS ------------------------------------------------------------------ -u = i860.o atof-ieee.o write-i860.o read-i860.o - -U = i860.c i860.h i860-opcode.h - -i860.o: i860.c i860.h i860-opcode.h as.h frags.h struc-symbol.h -i860.o: flonum.h expr.h hash.h md.h write.h read.h symbols.h - $(CC) -c $(CFLAGS) -DI860 i860.c - -atof-ieee.o: flonum.h - -write-i860.o: write.c i860.h - $(CC) -c -DI860 $(CFLAGS) write.c - mv write.o write-i860.o - -read-i860.o: read.c i860.h - $(CC) -c -DI860 $(CFLAGS) read.c - mv read.o read-i860.o - -a860: $a $u - $(CC) -o a860 $(LDFLAGS) $a $u $(LOADLIBES) - -# SPARC GAS ------------------------------------------------------------------ -v = sparc.o atof-ieee.o write-sparc.o read-sparc.o - -V = sparc.c sparc.h sparc-opcode.h - -atof-ieee.o: flonum.h -sparc.o: sparc.c sparc.h sparc-opcode.h as.h frags.h struc-symbol.h -sparc.o: flonum.h expr.h hash.h md.h write.h read.h symbols.h - $(CC) -c $(CFLAGS) -DSPARC sparc.c - -write-sparc.o: write.c - $(CC) -c -DSPARC $(CFLAGS) write.c - mv write.o write-sparc.o - -read-sparc.o: read.c - $(CC) -c -DSPARC $(CFLAGS) read.c - mv read.o read-sparc.o - -asparc: $a $v - $(CC) -o asparc $(LDFLAGS) $a $v $(LOADLIBES) - -# NS32K GAS ------------------------------------------------------------------ -w = ns32k.o atof-ieee.o write-ns32k.o read-ns32k.o - -W = ns32k.c ns32k-opcode.h - -atof-ieee.o: flonum.h -ns32k.o: as.h frags.h struc-symbol.h flonum.h expr.h md.h hash.h -ns32k.o: write.h symbols.h ns32k-opcode.h ns32k.c - $(CC) $(CFLAGS) $(OPTIONS) -c ns32k.c - -write-ns32k.o: write.c - $(CC) -c -DNS32K $(CFLAGS) write.c - mv write.o write-ns32k.o - -read-ns32k.o: - $(CC) -c -DNS32K $(CFLAGS) read.c - mv read.o read-ns32k.o - -a32k: $a $w - $(CC) -o a32k $(LDFLAGS) $a $w $(LOADLIBES) - -# 80386 GAS ------------------------------------------------------------------ -x = i386.o atof-ieee.o write.o read.o - -X = i386.c i386.h i386-opcode.h - -i386.o: i386.c as.h read.h flonum.h frags.h struc-symbol.h expr.h -i386.o: symbols.h hash.h md.h i386.h i386-opcode.h - $(CC) $(CFLAGS) $(OPTIONS) -c i386.c - -atof-ieee.o: flonum.h - -a386: $a $x - $(CC) -o a386 $(LDFLAGS) $a $x $(LOADLIBES) - -# 68020 GAS ------------------------------------------------------------------ -y = m68k.o atof-ieee.o write.o read.o - -Y = m68k.c atof-ieee.c m68k-opcode.h m-hpux.h m-sun3.h m-generic.h - -atof-ieee.o: flonum.h - -m68k.o: m68k.c a.out.gnu.h as.h expr.h flonum.h frags.h hash.h -m68k.o: m68k-opcode.h m68k.h md.h obstack.h struc-symbol.h - $(CC) $(CFLAGS) $(OPTIONS) -c m68k.c - -a68: $a $y - $(CC) -o a68 $(LDFLAGS) $a $y $(LOADLIBES) - -# VAX GAS -------------------------------------------------------------------- -z = vax.o atof-vax.o write.o read.o - -Z = vax.c atof-vax.c vax-opcode.h vax-inst.h \ - make-gas.com objrecdef.h vms.c vms-dbg.c README-vms-dbg - -vax.o: vax.c a.out.gnu.h as.h expr.h flonum.h frags.h md.h obstack.h -vax.o: read.h struc-symbol.h symbols.h vax-inst.h vax-opcode.h -atof-vax.o: as.h flonum.h read.h - -avax: $a $z - $(CC) -o avax $(LDFLAGS) $a $z $(LOADLIBES) - -# global files --------------------------------------------------------------- - -as.o: as.c - $(CC) $(CFLAGS) $(OPTIONS) -c as.c - -messages.o: messages.c - $(CC) $(CFLAGS) $(OPTIONS) -c messages.c - -hash.o: hash.c - $(CC) $(CFLAGS) -Derror=as_fatal -c hash.c - -xmalloc.o: xmalloc.c - $(CC) $(CFLAGS) -Derror=as_fatal -c xmalloc.c - -xrealloc.o: xrealloc.c - $(CC) $(CFLAGS) -Derror=as_fatal -c xrealloc.c - -A =\ -as.c xrealloc.c xmalloc.c hash.c hex-value.c \ -atof-generic.c append.c messages.c expr.c bignum-copy.c \ -frags.c input-file.c input-scrub.c output-file.c read.c \ -subsegs.c symbols.c write.c strstr.c \ -flonum-const.c flonum-copy.c flonum-mult.c app.c version.c \ -obstack.c \ -#gdb.c gdb-file.c gdb-symbols.c gdb-blocks.c \ -#gdb-lines.c - -H = \ -a.out.gnu.h as.h bignum.h expr.h flonum.h \ -frags.h hash.h input-file.h md.h \ -obstack.h read.h struc-symbol.h subsegs.h \ -symbols.h write.h - -dist: COPYING README ChangeLog $A $H $Z $Y $X $W $V $U Makefile - echo gas-`sed -n -e '/ version /s/[^0-9.]*\([0-9.]*\).*/\1/p' < version.c` > .fname - mkdir `cat .fname` - - ln COPYING README ChangeLog $A $H $Z $Y $X $W $V $U Makefile `cat .fname` - tar cvhZf `cat .fname`.tar.Z `cat .fname` - -rm -r `cat .fname` - -rm .fname - -clean: - rm -f a avax a68 a386 a32k asparc $a $v $w $x $y $z a core gmon.out bugs a.out - -install: a - cp a $(BINDIR)/gas - - -# General .o-->.h dependencies - -app.o: as.h -as.o: a.out.gnu.h as.h read.h struc-symbol.h write.h -atof-generic.o: flonum.h -bignum-copy.o: bignum.h -expr.o: a.out.gnu.h as.h expr.h flonum.h obstack.h read.h struc-symbol.h -expr.o: symbols.h -flonum-const.o: flonum.h -flonum-copy.o: flonum.h -flonum-mult.o: flonum.h -flonum-normal.o:flonum.h -flonum-print.o: flonum.h -frags.o: a.out.gnu.h as.h frags.h obstack.h struc-symbol.h subsegs.h -#gdb.o: as.h -#gdb-blocks.o: as.h -#gdb-lines.o: as.h frags.h obstack.h -#gdb-symbols.o: a.out.gnu.h as.h struc-symbol.h -hash.o: hash.h -input-file.o: input-file.h -input-scrub.o: as.h input-file.h read.h -messages.o: as.h -obstack.o: obstack.h -read.o: a.out.gnu.h as.h expr.h flonum.h frags.h hash.h md.h obstack.h -read.o: read.h struc-symbol.h symbols.h -subsegs.o: a.out.gnu.h as.h frags.h obstack.h struc-symbol.h subsegs.h write.h -symbols.o: a.out.gnu.h as.h frags.h hash.h obstack.h struc-symbol.h symbols.h -write.o: a.out.gnu.h as.h md.h obstack.h struc-symbol.h subsegs.h -write.o: symbols.h write.h - -flonum.h: bignum.h - diff --git a/gnu/usr.bin/as/README.gnu b/gnu/usr.bin/as/README.gnu deleted file mode 100644 index 46f135fcfd86a..0000000000000 --- a/gnu/usr.bin/as/README.gnu +++ /dev/null @@ -1,133 +0,0 @@ -This is the beta-test version of the GNU assembler. (Probably -around Version 1.35, but check version.c which gets updated more -often than this readme.) - -The assembler has been modified to support a feature that is -potentially useful when assembling compiler output, but which may -confuse assembly language programmers. If assembler encounters a -.word pseudo-op of the form symbol1-symbol2 (the difference of two -symbols), and the difference of those two symbols will not fit in 16 -bits, the assembler will create a branch around a long jump to -symbol1, and insert this into the output directly before the next -label: The .word will (instead of containing garbage, or giving an -error message) contain (the address of the long jump)-symbol2. This -allows the assembler to assemble jump tables that jump to locations -very far away into code that works properly. If the next label is -more than 32K away from the .word, you lose (silently) RMS claims -this will never happen. If the -k option is given, you will get a -warning message when this happens. - -These files are currently set up to allow you to compile all of the -versions of the assembler (68020, VAX, ns32k, and i386) on the same -machine. To compile the 68020 version, type 'make a68'. To compile -the VAX version, type 'make avax'. To compile the ns32k version, -type 'make a32k'. To compile the Intel 80386 version, type 'make -a386'. The Makefile contains instructions on how to make one of the -assemblers compile as the default. - -Before you can compile the 68020 version of the assembler, you must -make m68k.h be a link to m-sun3.h , m-hpux.h or m-generic.h . If -you are on a SUN-3 (or other machine that uses a magic number of -(2 << 16) | OMAGIC type 'ln -s m-sun3.h m68k.h' else if you are on a -machine running HP-UX, type 'ln m-hpux.h m689k.h' else type -'ln -s m-generic.h m68k.h' If your machine does not support symbolic -links, omit the '-s'. - -See the instructions in the Makefile for compiling gas for the Sequent -Symmetry (dynix 3.0.12 + others?) or for the HP 9000/300 - -If your machine does not have both varargs.h and vfprintf(), but does have -_doprnt() add -DNO_VARARGS to the CFLAGS line in the makefile. If your -machine has neither vfprintf() or _doprnt(), you will have to change -messages.c in order to get readable error messages from the assembler. - - - REPORTING BUGS IN GAS - -Bugs in gas should be reported to bug-gnu-utils@prep.ai.mit.edu If you can't -get through to prep, try hack@gnu.ai.mit.edu or hack@media-lab.media.mit.edu - -If you report a bug in GAS, please remember to include: - -A description of exactly what went wrong. - -The type of machine GAS was running on (VAX, 68020, etc), - -The Operating System GAS was running under. - -The options given to GAS. - -The actual input file that caused the problem. - -It is silly to report a bug in GAS without including an input file for -GAS. Don't ask us to generate the file just because you made it from -files you think we have access to. - -1. You might be mistaken. -2. It might take us a lot of time to install things to regenerate that file. -3. We might get a different file from the one you got, and might not see any -bug. - -To save us these delays and uncertainties, always send the input file -for the program that failed. - -If the input file is very large, and you are on the internet, you may -want to make it avaliable for anonymous FTP instead of mailing it. If you -do, include instructions for FTP'ing it in your bug report. - ------------------------------- README.APOLLO --------------------------------- - -The changes required to get the GNU C compiler running on -Apollo 68K platforms are available via anonymous ftp from -labrea.stanford.edu (36.8.0.47) in the form of a compressed -tar file named "/pub/gnu/apollo-gcc-1.37.tar.Z". -The size of the file is 84145 bytes. - -To build GCC for the Apollo you'll need the virgin FSF -distributions of bison-1.03, gas-1.34, and gcc-1.37. They -are also on labrea.stanford.edu as well as prep.ai.mit.edu. -My changes are to enable gas to produce Apollo COFF object -files and allow gcc to parse some of the syntax extensions -which appear in Apollo C header files. Note that the -COFF encapsulation technique cannot be used on the Apollo. - -The tar file should be unpacked in the directory containing -the gas-1.34 and gcc-1.37 directories; a few files will be overlaid, -and an APOLLO-GCC-README file will appear in the top directory. -This file contains detailed instructions on how to proceed. - -These changes will only work for SR10.1 or later systems, using -the 6.6 or later version of the Apollo C compiler. - -If you do not have ftp access, I can mail you the changes in the -form of diffs; they are approximately 40K in length. If you request -them, be sure to give me a voice phone number so I can contact you -in case I can't send you mail; I've had several requests in the -past from people I can't contact. - -By the way, I'm working on getting the GNU C++ compiler running; -there are a couple problems to solve. I hope to be able to announce -the Apollo version shortly after the 1.37 version is released. - -John Vasta Hewlett-Packard Apollo Systems Division -vasta@apollo.hp.com M.S. CHA-01-LT -(508) 256-6600 x6362 300 Apollo Drive, Chelmsford, MA 01824 -UUCP: {decwrl!decvax, mit-eddie, attunix}!apollo!vasta - ------------------------------------- - -You might refer others who are interested in a similar thing. - -Kevin Buchs buchs@mayo.edu - - ------------------------------- README.COFF ----------------------------------- - -If you have a COFF system, you may wish to aquire - - UUCP: osu-cis!~/gnu/coff/gnu-coff.tar.Z - or - FTP: tut.cis.ohio-state.edu:/pub/gnu/coff/gnu-coff.tar.Z - -These contain patches for gas that will make it produce COFF output. -I have never seen these patches, so I don't know how well they work. diff --git a/gnu/usr.bin/as/append.c b/gnu/usr.bin/as/append.c deleted file mode 100644 index d51a27fc65fca..0000000000000 --- a/gnu/usr.bin/as/append.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Append a string ontp another string - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* JF: This is silly. Why not stuff this in some other file? */ -#ifdef USG -#define bcopy(from,to,n) memcpy(to,from,n) -#endif - -void -append (charPP, fromP, length) -char **charPP; -char *fromP; -unsigned long length; -{ - if (length) { /* Don't trust bcopy() of 0 chars. */ - bcopy (fromP, * charPP,(int) length); - *charPP += length; - } -} - -/* end: append.c */ diff --git a/gnu/usr.bin/as/config/a.out.gnu.h b/gnu/usr.bin/as/config/a.out.gnu.h deleted file mode 100644 index 71b09a058fab1..0000000000000 --- a/gnu/usr.bin/as/config/a.out.gnu.h +++ /dev/null @@ -1,261 +0,0 @@ -#ifndef __A_OUT_GNU_H__ -#define __A_OUT_GNU_H__ - -#define __GNU_EXEC_MACROS__ - -#ifndef __STRUCT_EXEC_OVERRIDE__ - -struct exec -{ - unsigned long a_info; /* Use macros N_MAGIC, etc for access */ - unsigned a_text; /* length of text, in bytes */ - unsigned a_data; /* length of data, in bytes */ - unsigned a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned a_syms; /* length of symbol table data in file, in bytes */ - unsigned a_entry; /* start address */ - unsigned a_trsize; /* length of relocation info for text, in bytes */ - unsigned a_drsize; /* length of relocation info for data, in bytes */ -}; - -#endif /* __STRUCT_EXEC_OVERRIDE__ */ - -/* these go in the N_MACHTYPE field */ -enum machine_type { -#if defined (M_OLDSUN2) - M__OLDSUN2 = M_OLDSUN2, -#else - M_OLDSUN2 = 0, -#endif -#if defined (M_68010) - M__68010 = M_68010, -#else - M_68010 = 1, -#endif -#if defined (M_68020) - M__68020 = M_68020, -#else - M_68020 = 2, -#endif -#if defined (M_SPARC) - M__SPARC = M_SPARC, -#else - M_SPARC = 3, -#endif - /* skip a bunch so we don't run into any of sun's numbers */ - M_386 = 100, -}; - -#if !defined (N_MAGIC) -#define N_MAGIC(exec) ((exec).a_info & 0xffff) -#endif -#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) -#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0xff) << 16) \ - | (((flags) & 0xff) << 24)) -#define N_SET_MAGIC(exec, magic) \ - ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) - -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) - -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) - -/* Code indicating object file or impure executable. */ -#define OMAGIC 0407 -/* Code indicating pure executable. */ -#define NMAGIC 0410 -/* Code indicating demand-paged executable. */ -#define ZMAGIC 0413 - -#if !defined (N_BADMAG) -#define N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) -#endif - -#define _N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) - -#define _N_HDROFF(x) (1024 - sizeof (struct exec)) - -#if !defined (N_TXTOFF) -#define N_TXTOFF(x) \ - (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec)) -#endif - -#if !defined (N_DATOFF) -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) -#endif - -#if !defined (N_TRELOFF) -#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) -#endif - -#if !defined (N_DRELOFF) -#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) -#endif - -#if !defined (N_SYMOFF) -#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize) -#endif - -#if !defined (N_STROFF) -#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) -#endif - -/* Address of text segment in memory after it is loaded. */ -#if !defined (N_TXTADDR) -#define N_TXTADDR(x) 0 -#endif - -/* Address of data segment in memory after it is loaded. - Note that it is up to you to define SEGMENT_SIZE - on machines not listed here. */ -#if defined(vax) || defined(hp300) || defined(pyr) -#define SEGMENT_SIZE page_size -#endif -#ifdef sony -#define SEGMENT_SIZE 0x2000 -#endif /* Sony. */ -#ifdef is68k -#define SEGMENT_SIZE 0x20000 -#endif -#if defined(m68k) && defined(PORTAR) -#define PAGE_SIZE 0x400 -#define SEGMENT_SIZE PAGE_SIZE -#endif - -#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1)) - -#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) - -#ifndef N_DATADDR -#define N_DATADDR(x) \ - (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ - : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) -#endif - -/* Address of bss segment in memory after it is loaded. */ -#if !defined (N_BSSADDR) -#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) -#endif - -#if !defined (N_NLIST_DECLARED) -struct nlist { - union { - char *n_name; - struct nlist *n_next; - long n_strx; - } n_un; - unsigned char n_type; - char n_other; - short n_desc; - unsigned long n_value; -}; -#endif /* no N_NLIST_DECLARED. */ - -#if !defined (N_UNDF) -#define N_UNDF 0 -#endif -#if !defined (N_ABS) -#define N_ABS 2 -#endif -#if !defined (N_TEXT) -#define N_TEXT 4 -#endif -#if !defined (N_DATA) -#define N_DATA 6 -#endif -#if !defined (N_BSS) -#define N_BSS 8 -#endif -#if !defined (N_FN) -#define N_FN 15 -#endif - -#if !defined (N_EXT) -#define N_EXT 1 -#endif -#if !defined (N_TYPE) -#define N_TYPE 036 -#endif -#if !defined (N_STAB) -#define N_STAB 0340 -#endif - -/* The following type indicates the definition of a symbol as being - an indirect reference to another symbol. The other symbol - appears as an undefined reference, immediately following this symbol. - - Indirection is asymmetrical. The other symbol's value will be used - to satisfy requests for the indirect symbol, but not vice versa. - If the other symbol does not have a definition, libraries will - be searched to find a definition. */ -#define N_INDR 0xa - -/* The following symbols refer to set elements. - All the N_SET[ATDB] symbols with the same name form one set. - Space is allocated for the set in the text section, and each set - element's value is stored into one word of the space. - The first word of the space is the length of the set (number of elements). - - The address of the set is made into an N_SETV symbol - whose name is the same as the name of the set. - This symbol acts like a N_DATA global symbol - in that it can satisfy undefined external references. */ - -/* These appear as input to LD, in a .o file. */ -#define N_SETA 0x14 /* Absolute set element symbol */ -#define N_SETT 0x16 /* Text set element symbol */ -#define N_SETD 0x18 /* Data set element symbol */ -#define N_SETB 0x1A /* Bss set element symbol */ - -/* This is output from LD. */ -#define N_SETV 0x1C /* Pointer to set vector in data area. */ - -#if !defined (N_RELOCATION_INFO_DECLARED) -/* This structure describes a single relocation to be performed. - The text-relocation section of the file is a vector of these structures, - all of which apply to the text section. - Likewise, the data-relocation section applies to the data section. */ - -struct relocation_info -{ - /* Address (within segment) to be relocated. */ - int r_address; - /* The meaning of r_symbolnum depends on r_extern. */ - unsigned int r_symbolnum:24; - /* Nonzero means value is a pc-relative offset - and it should be relocated for changes in its own address - as well as for changes in the symbol or section specified. */ - unsigned int r_pcrel:1; - /* Length (as exponent of 2) of the field to be relocated. - Thus, a value of 2 indicates 1<<2 bytes. */ - unsigned int r_length:2; - /* 1 => relocate with value of symbol. - r_symbolnum is the index of the symbol - in file's the symbol table. - 0 => relocate with the address of a segment. - r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS - (the N_EXT bit may be set also, but signifies nothing). */ - unsigned int r_extern:1; - /* Four bits that aren't used, but when writing an object file - it is desirable to clear them. */ -#ifdef NS32K - unsigned r_bsr:1; - unsigned r_disp:1; - unsigned r_pad:2; -#else - unsigned int r_pad:4; -#endif -}; -#endif /* no N_RELOCATION_INFO_DECLARED. */ - - -#endif /* __A_OUT_GNU_H__ */ diff --git a/gnu/usr.bin/as/config/i386-opcode.h b/gnu/usr.bin/as/config/i386-opcode.h deleted file mode 100644 index cace0c356d396..0000000000000 --- a/gnu/usr.bin/as/config/i386-opcode.h +++ /dev/null @@ -1,806 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - * - * @(#)i386-opcode.h 6.3 (Berkeley) 5/8/91 - */ - -/* i386-opcode.h -- Intel 80386 opcode table - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -template i386_optab[] = { - -#define _ None -/* move instructions */ -{ "mov", 2, 0xa0, _, DW|NoModrm, Disp32, Acc, 0 }, -{ "mov", 2, 0x88, _, DW|Modrm, Reg, Reg|Mem, 0 }, -{ "mov", 2, 0xb0, _, ShortFormW, Imm, Reg, 0 }, -{ "mov", 2, 0xc6, _, W|Modrm, Imm, Reg|Mem, 0 }, -{ "mov", 2, 0x8c, _, D|Modrm, SReg3|SReg2, Reg16|Mem16, 0 }, -/* move to/from control debug registers */ -{ "mov", 2, 0x0f20, _, D|Modrm, Control, Reg32, 0}, -{ "mov", 2, 0x0f21, _, D|Modrm, Debug, Reg32, 0}, -{ "mov", 2, 0x0f24, _, D|Modrm, Test, Reg32, 0}, - -/* move with sign extend */ -/* "movsbl" & "movsbw" must not be unified into "movsb" to avoid - conflict with the "movs" string move instruction. Thus, - {"movsb", 2, 0x0fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16|Reg32, 0}, - is not kosher; we must seperate the two instructions. */ -{"movsbl", 2, 0x0fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg32, 0}, -{"movsbw", 2, 0x660fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16, 0}, -{"movswl", 2, 0x0fbf, _, ReverseRegRegmem|Modrm, Reg16|Mem, Reg32, 0}, - -/* move with zero extend */ -{"movzb", 2, 0x0fb6, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16|Reg32, 0}, -{"movzwl", 2, 0x0fb7, _, ReverseRegRegmem|Modrm, Reg16|Mem, Reg32, 0}, - -/* push instructions */ -{"push", 1, 0x50, _, ShortForm, WordReg,0,0 }, -{"push", 1, 0xff, 0x6, Modrm, WordReg|WordMem, 0, 0 }, -{"push", 1, 0x6a, _, NoModrm, Imm8S, 0, 0}, -{"push", 1, 0x68, _, NoModrm, Imm16|Imm32, 0, 0}, -{"push", 1, 0x06, _, Seg2ShortForm, SReg2,0,0 }, -{"push", 1, 0x0fa0, _, Seg3ShortForm, SReg3,0,0 }, -/* push all */ -{"pusha", 0, 0x60, _, NoModrm, 0, 0, 0 }, - -/* pop instructions */ -{"pop", 1, 0x58, _, ShortForm, WordReg,0,0 }, -{"pop", 1, 0x8f, 0x0, Modrm, WordReg|WordMem, 0, 0 }, -#define POP_SEG_SHORT 0x7 -{"pop", 1, 0x07, _, Seg2ShortForm, SReg2,0,0 }, -{"pop", 1, 0x0fa1, _, Seg3ShortForm, SReg3,0,0 }, -/* pop all */ -{"popa", 0, 0x61, _, NoModrm, 0, 0, 0 }, - -/* xchg exchange instructions - xchg commutes: we allow both operand orders */ -{"xchg", 2, 0x90, _, ShortForm, WordReg, Acc, 0 }, -{"xchg", 2, 0x90, _, ShortForm, Acc, WordReg, 0 }, -{"xchg", 2, 0x86, _, W|Modrm, Reg, Reg|Mem, 0 }, -{"xchg", 2, 0x86, _, W|Modrm, Reg|Mem, Reg, 0 }, - -/* in/out from ports */ -{"in", 2, 0xe4, _, W|NoModrm, Imm8, Acc, 0 }, -{"in", 2, 0xec, _, W|NoModrm, InOutPortReg, Acc, 0 }, -{"out", 2, 0xe6, _, W|NoModrm, Acc, Imm8, 0 }, -{"out", 2, 0xee, _, W|NoModrm, Acc, InOutPortReg, 0 }, - -/* load effective address */ -{"lea", 2, 0x8d, _, Modrm, WordMem, WordReg, 0 }, - -/* load segment registers from memory */ -{"lds", 2, 0xc5, _, Modrm, Mem, Reg32, 0}, -{"les", 2, 0xc4, _, Modrm, Mem, Reg32, 0}, -{"lfs", 2, 0x0fb4, _, Modrm, Mem, Reg32, 0}, -{"lgs", 2, 0x0fb5, _, Modrm, Mem, Reg32, 0}, -{"lss", 2, 0x0fb2, _, Modrm, Mem, Reg32, 0}, - -/* flags register instructions */ -{"clc", 0, 0xf8, _, NoModrm, 0, 0, 0}, -{"cld", 0, 0xfc, _, NoModrm, 0, 0, 0}, -{"cli", 0, 0xfa, _, NoModrm, 0, 0, 0}, -{"clts", 0, 0x0f06, _, NoModrm, 0, 0, 0}, -{"cmc", 0, 0xf5, _, NoModrm, 0, 0, 0}, -{"lahf", 0, 0x9f, _, NoModrm, 0, 0, 0}, -{"sahf", 0, 0x9e, _, NoModrm, 0, 0, 0}, -{"pushf", 0, 0x9c, _, NoModrm, 0, 0, 0}, -{"popf", 0, 0x9d, _, NoModrm, 0, 0, 0}, -{"stc", 0, 0xf9, _, NoModrm, 0, 0, 0}, -{"std", 0, 0xfd, _, NoModrm, 0, 0, 0}, -{"sti", 0, 0xfb, _, NoModrm, 0, 0, 0}, - -{"add", 2, 0x0, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"add", 2, 0x83, 0, Modrm, Imm8S, WordReg|WordMem, 0}, -{"add", 2, 0x4, _, W|NoModrm, Imm, Acc, 0}, -{"add", 2, 0x80, 0, W|Modrm, Imm, Reg|Mem, 0}, - -{"inc", 1, 0x40, _, ShortForm, WordReg, 0, 0}, -{"inc", 1, 0xfe, 0, W|Modrm, Reg|Mem, 0, 0}, - -{"sub", 2, 0x28, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"sub", 2, 0x83, 5, Modrm, Imm8S, WordReg|WordMem, 0}, -{"sub", 2, 0x2c, _, W|NoModrm, Imm, Acc, 0}, -{"sub", 2, 0x80, 5, W|Modrm, Imm, Reg|Mem, 0}, - -{"dec", 1, 0x48, _, ShortForm, WordReg, 0, 0}, -{"dec", 1, 0xfe, 1, W|Modrm, Reg|Mem, 0, 0}, - -{"sbb", 2, 0x18, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"sbb", 2, 0x83, 3, Modrm, Imm8S, WordReg|WordMem, 0}, -{"sbb", 2, 0x1c, _, W|NoModrm, Imm, Acc, 0}, -{"sbb", 2, 0x80, 3, W|Modrm, Imm, Reg|Mem, 0}, - -{"cmp", 2, 0x38, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"cmp", 2, 0x83, 7, Modrm, Imm8S, WordReg|WordMem, 0}, -{"cmp", 2, 0x3c, _, W|NoModrm, Imm, Acc, 0}, -{"cmp", 2, 0x80, 7, W|Modrm, Imm, Reg|Mem, 0}, - -{"test", 2, 0x84, _, W|Modrm, Reg|Mem, Reg, 0}, -{"test", 2, 0x84, _, W|Modrm, Reg, Reg|Mem, 0}, -{"test", 2, 0xa8, _, W|NoModrm, Imm, Acc, 0}, -{"test", 2, 0xf6, 0, W|Modrm, Imm, Reg|Mem, 0}, - -{"and", 2, 0x20, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"and", 2, 0x83, 4, Modrm, Imm8S, WordReg|WordMem, 0}, -{"and", 2, 0x24, _, W|NoModrm, Imm, Acc, 0}, -{"and", 2, 0x80, 4, W|Modrm, Imm, Reg|Mem, 0}, - -{"or", 2, 0x08, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"or", 2, 0x83, 1, Modrm, Imm8S, WordReg|WordMem, 0}, -{"or", 2, 0x0c, _, W|NoModrm, Imm, Acc, 0}, -{"or", 2, 0x80, 1, W|Modrm, Imm, Reg|Mem, 0}, - -{"xor", 2, 0x30, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"xor", 2, 0x83, 6, Modrm, Imm8S, WordReg|WordMem, 0}, -{"xor", 2, 0x34, _, W|NoModrm, Imm, Acc, 0}, -{"xor", 2, 0x80, 6, W|Modrm, Imm, Reg|Mem, 0}, - -{"adc", 2, 0x10, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"adc", 2, 0x83, 2, Modrm, Imm8S, WordReg|WordMem, 0}, -{"adc", 2, 0x14, _, W|NoModrm, Imm, Acc, 0}, -{"adc", 2, 0x80, 2, W|Modrm, Imm, Reg|Mem, 0}, - -{"neg", 1, 0xf6, 3, W|Modrm, Reg|Mem, 0, 0}, -{"not", 1, 0xf6, 2, W|Modrm, Reg|Mem, 0, 0}, - -{"aaa", 0, 0x37, _, NoModrm, 0, 0, 0}, -{"aas", 0, 0x3f, _, NoModrm, 0, 0, 0}, -{"daa", 0, 0x27, _, NoModrm, 0, 0, 0}, -{"das", 0, 0x2f, _, NoModrm, 0, 0, 0}, -{"aad", 0, 0xd50a, _, NoModrm, 0, 0, 0}, -{"aam", 0, 0xd40a, _, NoModrm, 0, 0, 0}, - -/* conversion insns */ -/* conversion: intel naming */ -{"cbw", 0, 0x6698, _, NoModrm, 0, 0, 0}, -{"cwd", 0, 0x6699, _, NoModrm, 0, 0, 0}, -{"cwde", 0, 0x98, _, NoModrm, 0, 0, 0}, -{"cdq", 0, 0x99, _, NoModrm, 0, 0, 0}, -/* att naming */ -{"cbtw", 0, 0x6698, _, NoModrm, 0, 0, 0}, -{"cwtl", 0, 0x98, _, NoModrm, 0, 0, 0}, -{"cwtd", 0, 0x6699, _, NoModrm, 0, 0, 0}, -{"cltd", 0, 0x99, _, NoModrm, 0, 0, 0}, - -/* Warning! the mul/imul (opcode 0xf6) must only have 1 operand! They are - expanding 64-bit multiplies, and *cannot* be selected to accomplish - 'imul %ebx, %eax' (opcode 0x0faf must be used in this case) - These multiplies can only be selected with single opearnd forms. */ -{"mul", 1, 0xf6, 4, W|Modrm, Reg|Mem, 0, 0}, -{"imul", 1, 0xf6, 5, W|Modrm, Reg|Mem, 0, 0}, - - - - -/* imulKludge here is needed to reverse the i.rm.reg & i.rm.regmem fields. - These instructions are exceptions: 'imul $2, %eax, %ecx' would put - '%eax' in the reg field and '%ecx' in the regmem field if we did not - switch them. */ -{"imul", 2, 0x0faf, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"imul", 3, 0x6b, _, Modrm|ReverseRegRegmem, Imm8S, WordReg|Mem, WordReg}, -{"imul", 3, 0x69, _, Modrm|ReverseRegRegmem, Imm16|Imm32, WordReg|Mem, WordReg}, -/* - imul with 2 operands mimicks imul with 3 by puting register both - in i.rm.reg & i.rm.regmem fields -*/ -{"imul", 2, 0x6b, _, Modrm|imulKludge, Imm8S, WordReg, 0}, -{"imul", 2, 0x69, _, Modrm|imulKludge, Imm16|Imm32, WordReg, 0}, -{"div", 1, 0xf6, 6, W|Modrm, Reg|Mem, 0, 0}, -{"div", 2, 0xf6, 6, W|Modrm, Reg|Mem, Acc, 0}, -{"idiv", 1, 0xf6, 7, W|Modrm, Reg|Mem, 0, 0}, -{"idiv", 2, 0xf6, 7, W|Modrm, Reg|Mem, Acc, 0}, - -{"rol", 2, 0xd0, 0, W|Modrm, Imm1, Reg|Mem, 0}, -{"rol", 2, 0xc0, 0, W|Modrm, Imm8, Reg|Mem, 0}, -{"rol", 2, 0xd2, 0, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rol", 1, 0xd0, 0, W|Modrm, Reg|Mem, 0, 0}, - -{"ror", 2, 0xd0, 1, W|Modrm, Imm1, Reg|Mem, 0}, -{"ror", 2, 0xc0, 1, W|Modrm, Imm8, Reg|Mem, 0}, -{"ror", 2, 0xd2, 1, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"ror", 1, 0xd0, 1, W|Modrm, Reg|Mem, 0, 0}, - -{"rcl", 2, 0xd0, 2, W|Modrm, Imm1, Reg|Mem, 0}, -{"rcl", 2, 0xc0, 2, W|Modrm, Imm8, Reg|Mem, 0}, -{"rcl", 2, 0xd2, 2, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rcl", 1, 0xd0, 2, W|Modrm, Reg|Mem, 0, 0}, - -{"rcr", 2, 0xd0, 3, W|Modrm, Imm1, Reg|Mem, 0}, -{"rcr", 2, 0xc0, 3, W|Modrm, Imm8, Reg|Mem, 0}, -{"rcr", 2, 0xd2, 3, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rcr", 1, 0xd0, 3, W|Modrm, Reg|Mem, 0, 0}, - -{"sal", 2, 0xd0, 4, W|Modrm, Imm1, Reg|Mem, 0}, -{"sal", 2, 0xc0, 4, W|Modrm, Imm8, Reg|Mem, 0}, -{"sal", 2, 0xd2, 4, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"sal", 1, 0xd0, 4, W|Modrm, Reg|Mem, 0, 0}, -{"shl", 2, 0xd0, 4, W|Modrm, Imm1, Reg|Mem, 0}, -{"shl", 2, 0xc0, 4, W|Modrm, Imm8, Reg|Mem, 0}, -{"shl", 2, 0xd2, 4, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"shl", 1, 0xd0, 4, W|Modrm, Reg|Mem, 0, 0}, - -{"shld", 3, 0x0fa4, _, Modrm, Imm8, WordReg, WordReg|Mem}, -{"shld", 3, 0x0fa5, _, Modrm, ShiftCount, WordReg, WordReg|Mem}, - -{"shr", 2, 0xd0, 5, W|Modrm, Imm1, Reg|Mem, 0}, -{"shr", 2, 0xc0, 5, W|Modrm, Imm8, Reg|Mem, 0}, -{"shr", 2, 0xd2, 5, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"shr", 1, 0xd0, 5, W|Modrm, Reg|Mem, 0, 0}, - -{"shrd", 3, 0x0fac, _, Modrm, Imm8, WordReg, WordReg|Mem}, -{"shrd", 3, 0x0fad, _, Modrm, ShiftCount, WordReg, WordReg|Mem}, - -{"sar", 2, 0xd0, 7, W|Modrm, Imm1, Reg|Mem, 0}, -{"sar", 2, 0xc0, 7, W|Modrm, Imm8, Reg|Mem, 0}, -{"sar", 2, 0xd2, 7, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"sar", 1, 0xd0, 7, W|Modrm, Reg|Mem, 0, 0}, - -/* control transfer instructions */ -#define CALL_PC_RELATIVE 0xe8 -{"call", 1, 0xe8, _, JumpDword, Disp32, 0, 0}, -{"call", 1, 0xff, 2, Modrm, Reg|Mem|JumpAbsolute, 0, 0}, -#define CALL_FAR_IMMEDIATE 0x9a -{"lcall", 2, 0x9a, _, JumpInterSegment, Imm16, Imm32, 0}, -{"lcall", 1, 0xff, 3, Modrm, Mem, 0, 0}, - -#define JUMP_PC_RELATIVE 0xeb -{"jmp", 1, 0xeb, _, Jump, Disp, 0, 0}, -{"jmp", 1, 0xff, 4, Modrm, Reg32|Mem|JumpAbsolute, 0, 0}, -#define JUMP_FAR_IMMEDIATE 0xea -{"ljmp", 2, 0xea, _, JumpInterSegment, Imm16, Imm32, 0}, -{"ljmp", 1, 0xff, 5, Modrm, Mem, 0, 0}, - -{"ret", 0, 0xc3, _, NoModrm, 0, 0, 0}, -{"ret", 1, 0xc2, _, NoModrm, Imm16, 0, 0}, -{"lret", 0, 0xcb, _, NoModrm, 0, 0, 0}, -{"lret", 1, 0xca, _, NoModrm, Imm16, 0, 0}, -{"enter", 2, 0xc8, _, NoModrm, Imm16, Imm8, 0}, -{"leave", 0, 0xc9, _, NoModrm, 0, 0, 0}, - -/* conditional jumps */ -{"jo", 1, 0x70, _, Jump, Disp, 0, 0}, - -{"jno", 1, 0x71, _, Jump, Disp, 0, 0}, - -{"jb", 1, 0x72, _, Jump, Disp, 0, 0}, -{"jc", 1, 0x72, _, Jump, Disp, 0, 0}, -{"jnae", 1, 0x72, _, Jump, Disp, 0, 0}, - -{"jnb", 1, 0x73, _, Jump, Disp, 0, 0}, -{"jnc", 1, 0x73, _, Jump, Disp, 0, 0}, -{"jae", 1, 0x73, _, Jump, Disp, 0, 0}, - -{"je", 1, 0x74, _, Jump, Disp, 0, 0}, -{"jz", 1, 0x74, _, Jump, Disp, 0, 0}, - -{"jne", 1, 0x75, _, Jump, Disp, 0, 0}, -{"jnz", 1, 0x75, _, Jump, Disp, 0, 0}, - -{"jbe", 1, 0x76, _, Jump, Disp, 0, 0}, -{"jna", 1, 0x76, _, Jump, Disp, 0, 0}, - -{"jnbe", 1, 0x77, _, Jump, Disp, 0, 0}, -{"ja", 1, 0x77, _, Jump, Disp, 0, 0}, - -{"js", 1, 0x78, _, Jump, Disp, 0, 0}, - -{"jns", 1, 0x79, _, Jump, Disp, 0, 0}, - -{"jp", 1, 0x7a, _, Jump, Disp, 0, 0}, -{"jpe", 1, 0x7a, _, Jump, Disp, 0, 0}, - -{"jnp", 1, 0x7b, _, Jump, Disp, 0, 0}, -{"jpo", 1, 0x7b, _, Jump, Disp, 0, 0}, - -{"jl", 1, 0x7c, _, Jump, Disp, 0, 0}, -{"jnge", 1, 0x7c, _, Jump, Disp, 0, 0}, - -{"jnl", 1, 0x7d, _, Jump, Disp, 0, 0}, -{"jge", 1, 0x7d, _, Jump, Disp, 0, 0}, - -{"jle", 1, 0x7e, _, Jump, Disp, 0, 0}, -{"jng", 1, 0x7e, _, Jump, Disp, 0, 0}, - -{"jnle", 1, 0x7f, _, Jump, Disp, 0, 0}, -{"jg", 1, 0x7f, _, Jump, Disp, 0, 0}, - -/* these turn into pseudo operations when disp is larger than 8 bits */ -#define IS_JUMP_ON_CX_ZERO(o) \ - (o == 0x67e3) -#define IS_JUMP_ON_ECX_ZERO(o) \ - (o == 0xe3) - -{"jcxz", 1, 0x67e3, _, JumpByte, Disp, 0, 0}, -{"jecxz", 1, 0xe3, _, JumpByte, Disp, 0, 0}, - -#define IS_LOOP_ECX_TIMES(o) \ - (o == 0xe2 || o == 0xe1 || o == 0xe0) - -{"loop", 1, 0xe2, _, JumpByte, Disp, 0, 0}, - -{"loopz", 1, 0xe1, _, JumpByte, Disp, 0, 0}, -{"loope", 1, 0xe1, _, JumpByte, Disp, 0, 0}, - -{"loopnz", 1, 0xe0, _, JumpByte, Disp, 0, 0}, -{"loopne", 1, 0xe0, _, JumpByte, Disp, 0, 0}, - -/* set byte on flag instructions */ -{"seto", 1, 0x0f90, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setno", 1, 0x0f91, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setb", 1, 0x0f92, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnae", 1, 0x0f92, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnb", 1, 0x0f93, 0, Modrm, Reg8|Mem, 0, 0}, -{"setae", 1, 0x0f93, 0, Modrm, Reg8|Mem, 0, 0}, - -{"sete", 1, 0x0f94, 0, Modrm, Reg8|Mem, 0, 0}, -{"setz", 1, 0x0f94, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setne", 1, 0x0f95, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnz", 1, 0x0f95, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setbe", 1, 0x0f96, 0, Modrm, Reg8|Mem, 0, 0}, -{"setna", 1, 0x0f96, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnbe", 1, 0x0f97, 0, Modrm, Reg8|Mem, 0, 0}, -{"seta", 1, 0x0f97, 0, Modrm, Reg8|Mem, 0, 0}, - -{"sets", 1, 0x0f98, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setns", 1, 0x0f99, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setp", 1, 0x0f9a, 0, Modrm, Reg8|Mem, 0, 0}, -{"setpe", 1, 0x0f9a, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnp", 1, 0x0f9b, 0, Modrm, Reg8|Mem, 0, 0}, -{"setpo", 1, 0x0f9b, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setl", 1, 0x0f9c, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnge", 1, 0x0f9c, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnl", 1, 0x0f9d, 0, Modrm, Reg8|Mem, 0, 0}, -{"setge", 1, 0x0f9d, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setle", 1, 0x0f9e, 0, Modrm, Reg8|Mem, 0, 0}, -{"setng", 1, 0x0f9e, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnle", 1, 0x0f9f, 0, Modrm, Reg8|Mem, 0, 0}, -{"setg", 1, 0x0f9f, 0, Modrm, Reg8|Mem, 0, 0}, - -#define IS_STRING_INSTRUCTION(o) \ - ((o) == 0xa6 || (o) == 0x6c || (o) == 0x6e || (o) == 0x6e || \ - (o) == 0xac || (o) == 0xa4 || (o) == 0xae || (o) == 0xaa || \ - (o) == 0xd7) - -/* string manipulation */ -{"cmps", 0, 0xa6, _, W|NoModrm, 0, 0, 0}, -{"ins", 0, 0x6c, _, W|NoModrm, 0, 0, 0}, -{"outs", 0, 0x6e, _, W|NoModrm, 0, 0, 0}, -{"lods", 0, 0xac, _, W|NoModrm, 0, 0, 0}, -{"movs", 0, 0xa4, _, W|NoModrm, 0, 0, 0}, -{"scas", 0, 0xae, _, W|NoModrm, 0, 0, 0}, -{"stos", 0, 0xaa, _, W|NoModrm, 0, 0, 0}, -{"xlat", 0, 0xd7, _, NoModrm, 0, 0, 0}, - -/* bit manipulation */ -{"bsf", 2, 0x0fbc, _, Modrm|ReverseRegRegmem, Reg|Mem, Reg, 0}, -{"bsr", 2, 0x0fbd, _, Modrm|ReverseRegRegmem, Reg|Mem, Reg, 0}, -{"bt", 2, 0x0fa3, _, Modrm, Reg, Reg|Mem, 0}, -{"bt", 2, 0x0fba, 4, Modrm, Imm8, Reg|Mem, 0}, -{"btc", 2, 0x0fbb, _, Modrm, Reg, Reg|Mem, 0}, -{"btc", 2, 0x0fba, 7, Modrm, Imm8, Reg|Mem, 0}, -{"btr", 2, 0x0fb3, _, Modrm, Reg, Reg|Mem, 0}, -{"btr", 2, 0x0fba, 6, Modrm, Imm8, Reg|Mem, 0}, -{"bts", 2, 0x0fab, _, Modrm, Reg, Reg|Mem, 0}, -{"bts", 2, 0x0fba, 5, Modrm, Imm8, Reg|Mem, 0}, - -/* interrupts & op. sys insns */ -/* See i386.c for conversion of 'int $3' into the special int 3 insn. */ -#define INT_OPCODE 0xcd -#define INT3_OPCODE 0xcc -{"int", 1, 0xcd, _, NoModrm, Imm8, 0, 0}, -{"int3", 0, 0xcc, _, NoModrm, 0, 0, 0}, -{"into", 0, 0xce, _, NoModrm, 0, 0, 0}, -{"iret", 0, 0xcf, _, NoModrm, 0, 0, 0}, - -{"boundl", 2, 0x62, _, Modrm, Reg32, Mem, 0}, -{"boundw", 2, 0x6662, _, Modrm, Reg16, Mem, 0}, - -{"hlt", 0, 0xf4, _, NoModrm, 0, 0, 0}, -{"wait", 0, 0x9b, _, NoModrm, 0, 0, 0}, -/* nop is actually 'xchgl %eax, %eax' */ -{"nop", 0, 0x90, _, NoModrm, 0, 0, 0}, - -/* protection control */ -{"arpl", 2, 0x63, _, Modrm, Reg16, Reg16|Mem, 0}, -{"lar", 2, 0x0f02, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"lgdt", 1, 0x0f01, 2, Modrm, Mem, 0, 0}, -{"lidt", 1, 0x0f01, 3, Modrm, Mem, 0, 0}, -{"lldt", 1, 0x0f00, 2, Modrm, WordReg|Mem, 0, 0}, -{"lmsw", 1, 0x0f01, 6, Modrm, WordReg|Mem, 0, 0}, -{"lsl", 2, 0x0f03, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"ltr", 1, 0x0f00, 3, Modrm, WordReg|Mem, 0, 0}, - -{"sgdt", 1, 0x0f01, 0, Modrm, Mem, 0, 0}, -{"sidt", 1, 0x0f01, 1, Modrm, Mem, 0, 0}, -{"sldt", 1, 0x0f00, 0, Modrm, WordReg|Mem, 0, 0}, -{"smsw", 1, 0x0f01, 4, Modrm, WordReg|Mem, 0, 0}, -{"str", 1, 0x0f00, 1, Modrm, Reg16|Mem, 0, 0}, - -{"verr", 1, 0x0f00, 4, Modrm, WordReg|Mem, 0, 0}, -{"verw", 1, 0x0f00, 5, Modrm, WordReg|Mem, 0, 0}, - -/* floating point instructions */ - -/* load */ -{"fld", 1, 0xd9c0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"flds", 1, 0xd9, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem float */ -{"fildl", 1, 0xdb, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem word */ -{"fldl", 1, 0xdd, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem double */ -{"fldl", 1, 0xd9c0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"filds", 1, 0xdf, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem dword */ -{"fildq", 1, 0xdf, 5, Modrm, Mem, 0, 0}, /* %st0 <-- mem qword */ -{"fldt", 1, 0xdb, 5, Modrm, Mem, 0, 0}, /* %st0 <-- mem efloat */ -{"fbld", 1, 0xdf, 4, Modrm, Mem, 0, 0}, /* %st0 <-- mem bcd */ - -/* store (no pop) */ -{"fst", 1, 0xddd0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fsts", 1, 0xd9, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem float */ -{"fistl", 1, 0xdb, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem dword */ -{"fstl", 1, 0xdd, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem double */ -{"fstl", 1, 0xddd0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fists", 1, 0xdf, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem word */ - -/* store (with pop) */ -{"fstp", 1, 0xddd8, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fstps", 1, 0xd9, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem float */ -{"fistpl", 1, 0xdb, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem word */ -{"fstpl", 1, 0xdd, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem double */ -{"fstpl", 1, 0xddd8, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fistps", 1, 0xdf, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem dword */ -{"fistpq", 1, 0xdf, 7, Modrm, Mem, 0, 0}, /* %st0 --> mem qword */ -{"fstpt", 1, 0xdb, 7, Modrm, Mem, 0, 0}, /* %st0 --> mem efloat */ -{"fbstp", 1, 0xdf, 6, Modrm, Mem, 0, 0}, /* %st0 --> mem bcd */ - -/* exchange %st<n> with %st0 */ -{"fxch", 1, 0xd9c8, _, ShortForm, FloatReg, 0, 0}, - -/* comparison (without pop) */ -{"fcom", 1, 0xd8d0, _, ShortForm, FloatReg, 0, 0}, -{"fcoms", 1, 0xd8, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem float */ -{"ficoml", 1, 0xda, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem word */ -{"fcoml", 1, 0xdc, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem double */ -{"fcoml", 1, 0xd8d0, _, ShortForm, FloatReg, 0, 0}, -{"ficoms", 1, 0xde, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem dword */ - -/* comparison (with pop) */ -{"fcomp", 1, 0xd8d8, _, ShortForm, FloatReg, 0, 0}, -{"fcomps", 1, 0xd8, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem float */ -{"ficompl", 1, 0xda, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem word */ -{"fcompl", 1, 0xdc, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem double */ -{"fcompl", 1, 0xd8d8, _, ShortForm, FloatReg, 0, 0}, -{"ficomps", 1, 0xde, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem dword */ -{"fcompp", 0, 0xded9, _, NoModrm, 0, 0, 0}, /* compare %st0, %st1 & pop twice */ - -/* unordered comparison (with pop) */ -{"fucom", 1, 0xdde0, _, ShortForm, FloatReg, 0, 0}, -{"fucomp", 1, 0xdde8, _, ShortForm, FloatReg, 0, 0}, -{"fucompp", 0, 0xdae9, _, NoModrm, 0, 0, 0}, /* ucompare %st0, %st1 & pop twice */ - -{"ftst", 0, 0xd9e4, _, NoModrm, 0, 0, 0}, /* test %st0 */ -{"fxam", 0, 0xd9e5, _, NoModrm, 0, 0, 0}, /* examine %st0 */ - -/* load constants into %st0 */ -{"fld1", 0, 0xd9e8, _, NoModrm, 0, 0, 0}, /* %st0 <-- 1.0 */ -{"fldl2t", 0, 0xd9e9, _, NoModrm, 0, 0, 0}, /* %st0 <-- log2(10) */ -{"fldl2e", 0, 0xd9ea, _, NoModrm, 0, 0, 0}, /* %st0 <-- log2(e) */ -{"fldpi", 0, 0xd9eb, _, NoModrm, 0, 0, 0}, /* %st0 <-- pi */ -{"fldlg2", 0, 0xd9ec, _, NoModrm, 0, 0, 0}, /* %st0 <-- log10(2) */ -{"fldln2", 0, 0xd9ed, _, NoModrm, 0, 0, 0}, /* %st0 <-- ln(2) */ -{"fldz", 0, 0xd9ee, _, NoModrm, 0, 0, 0}, /* %st0 <-- 0.0 */ - -/* arithmetic */ - -/* add */ -{"fadd", 1, 0xd8c0, _, ShortForm, FloatReg, 0, 0}, -{"fadd", 2, 0xd8c0, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fadd", 0, 0xdcc1, _, NoModrm, 0, 0, 0}, /* alias for fadd %st, %st(1) */ -{"faddp", 1, 0xdac0, _, ShortForm, FloatReg, 0, 0}, -{"faddp", 2, 0xdac0, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"faddp", 0, 0xdec1, _, NoModrm, 0, 0, 0}, /* alias for faddp %st, %st(1) */ -{"fadds", 1, 0xd8, 0, Modrm, Mem, 0, 0}, -{"fiaddl", 1, 0xda, 0, Modrm, Mem, 0, 0}, -{"faddl", 1, 0xdc, 0, Modrm, Mem, 0, 0}, -{"fiadds", 1, 0xde, 0, Modrm, Mem, 0, 0}, - -/* sub */ -/* Note: intel has decided that certain of these operations are reversed - in assembler syntax. */ -{"fsub", 1, 0xd8e0, _, ShortForm, FloatReg, 0, 0}, -{"fsub", 2, 0xd8e0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsub", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsub", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsub", 0, 0xdce1, _, NoModrm, 0, 0, 0}, -{"fsubp", 1, 0xdae0, _, ShortForm, FloatReg, 0, 0}, -{"fsubp", 2, 0xdae0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubp", 0, 0xdee1, _, NoModrm, 0, 0, 0}, -{"fsubs", 1, 0xd8, 4, Modrm, Mem, 0, 0}, -{"fisubl", 1, 0xda, 4, Modrm, Mem, 0, 0}, -{"fsubl", 1, 0xdc, 4, Modrm, Mem, 0, 0}, -{"fisubs", 1, 0xde, 4, Modrm, Mem, 0, 0}, - -/* sub reverse */ -{"fsubr", 1, 0xd8e8, _, ShortForm, FloatReg, 0, 0}, -{"fsubr", 2, 0xd8e8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubr", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubr", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubr", 0, 0xdce9, _, NoModrm, 0, 0, 0}, -{"fsubrp", 1, 0xdae8, _, ShortForm, FloatReg, 0, 0}, -{"fsubrp", 2, 0xdae8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubrp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubrp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubrp", 0, 0xdee9, _, NoModrm, 0, 0, 0}, -{"fsubrs", 1, 0xd8, 5, Modrm, Mem, 0, 0}, -{"fisubrl", 1, 0xda, 5, Modrm, Mem, 0, 0}, -{"fsubrl", 1, 0xdc, 5, Modrm, Mem, 0, 0}, -{"fisubrs", 1, 0xde, 5, Modrm, Mem, 0, 0}, - -/* mul */ -{"fmul", 1, 0xd8c8, _, ShortForm, FloatReg, 0, 0}, -{"fmul", 2, 0xd8c8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fmul", 0, 0xdcc9, _, NoModrm, 0, 0, 0}, -{"fmulp", 1, 0xdac8, _, ShortForm, FloatReg, 0, 0}, -{"fmulp", 2, 0xdac8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fmulp", 0, 0xdec9, _, NoModrm, 0, 0, 0}, -{"fmuls", 1, 0xd8, 1, Modrm, Mem, 0, 0}, -{"fimull", 1, 0xda, 1, Modrm, Mem, 0, 0}, -{"fmull", 1, 0xdc, 1, Modrm, Mem, 0, 0}, -{"fimuls", 1, 0xde, 1, Modrm, Mem, 0, 0}, - -/* div */ -/* Note: intel has decided that certain of these operations are reversed - in assembler syntax. */ -{"fdiv", 1, 0xd8f0, _, ShortForm, FloatReg, 0, 0}, -{"fdiv", 2, 0xd8f0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdiv", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdiv", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdiv", 0, 0xdcf1, _, NoModrm, 0, 0, 0}, -{"fdivp", 1, 0xdaf0, _, ShortForm, FloatReg, 0, 0}, -{"fdivp", 2, 0xdaf0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivp", 0, 0xdef1, _, NoModrm, 0, 0, 0}, -{"fdivs", 1, 0xd8, 6, Modrm, Mem, 0, 0}, -{"fidivl", 1, 0xda, 6, Modrm, Mem, 0, 0}, -{"fdivl", 1, 0xdc, 6, Modrm, Mem, 0, 0}, -{"fidivs", 1, 0xde, 6, Modrm, Mem, 0, 0}, - -/* div reverse */ -{"fdivr", 1, 0xd8f8, _, ShortForm, FloatReg, 0, 0}, -{"fdivr", 2, 0xd8f8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivr", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivr", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivr", 0, 0xdcf9, _, NoModrm, 0, 0, 0}, -{"fdivrp", 1, 0xdaf8, _, ShortForm, FloatReg, 0, 0}, -{"fdivrp", 2, 0xdaf8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivrp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivrp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivrp", 0, 0xdef9, _, NoModrm, 0, 0, 0}, -{"fdivrs", 1, 0xd8, 7, Modrm, Mem, 0, 0}, -{"fidivrl", 1, 0xda, 7, Modrm, Mem, 0, 0}, -{"fdivrl", 1, 0xdc, 7, Modrm, Mem, 0, 0}, -{"fidivrs", 1, 0xde, 7, Modrm, Mem, 0, 0}, - -{"f2xm1", 0, 0xd9f0, _, NoModrm, 0, 0, 0}, -{"fyl2x", 0, 0xd9f1, _, NoModrm, 0, 0, 0}, -{"fptan", 0, 0xd9f2, _, NoModrm, 0, 0, 0}, -{"fpatan", 0, 0xd9f3, _, NoModrm, 0, 0, 0}, -{"fxtract", 0, 0xd9f4, _, NoModrm, 0, 0, 0}, -{"fprem1", 0, 0xd9f5, _, NoModrm, 0, 0, 0}, -{"fdecstp", 0, 0xd9f6, _, NoModrm, 0, 0, 0}, -{"fincstp", 0, 0xd9f7, _, NoModrm, 0, 0, 0}, -{"fprem", 0, 0xd9f8, _, NoModrm, 0, 0, 0}, -{"fyl2xp1", 0, 0xd9f9, _, NoModrm, 0, 0, 0}, -{"fsqrt", 0, 0xd9fa, _, NoModrm, 0, 0, 0}, -{"fsincos", 0, 0xd9fb, _, NoModrm, 0, 0, 0}, -{"frndint", 0, 0xd9fc, _, NoModrm, 0, 0, 0}, -{"fscale", 0, 0xd9fd, _, NoModrm, 0, 0, 0}, -{"fsin", 0, 0xd9fe, _, NoModrm, 0, 0, 0}, -{"fcos", 0, 0xd9ff, _, NoModrm, 0, 0, 0}, - -{"fchs", 0, 0xd9e0, _, NoModrm, 0, 0, 0}, -{"fabs", 0, 0xd9e1, _, NoModrm, 0, 0, 0}, - -/* processor control */ -{"fninit", 0, 0xdbe3, _, NoModrm, 0, 0, 0}, -{"finit", 0, 0xdbe3, _, NoModrm, 0, 0, 0}, -{"fldcw", 1, 0xd9, 5, Modrm, Mem, 0, 0}, -{"fnstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0}, -{"fstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0}, -{"fnstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0}, -{"fnstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0}, -{"fnstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0}, -{"fstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0}, -{"fstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0}, -{"fstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0}, -{"fnclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0}, -{"fclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0}, -/* - We ignore the short format (287) versions of fstenv/fldenv & fsave/frstor - instructions; i'm not sure how to add them or how they are different. - My 386/387 book offers no details about this. -*/ -{"fnstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0}, -{"fstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0}, -{"fldenv", 1, 0xd9, 4, Modrm, Mem, 0, 0}, -{"fnsave", 1, 0xdd, 6, Modrm, Mem, 0, 0}, -{"fsave", 1, 0xdd, 6, Modrm, Mem, 0, 0}, -{"frstor", 1, 0xdd, 4, Modrm, Mem, 0, 0}, - -{"ffree", 1, 0xddc0, _, ShortForm, FloatReg, 0, 0}, -{"fnop", 0, 0xd9d0, _, NoModrm, 0, 0, 0}, -{"fwait", 0, 0x9b, _, NoModrm, 0, 0, 0}, - -/* - opcode prefixes; we allow them as seperate insns too - (see prefix table below) -*/ -{"aword", 0, 0x67, _, NoModrm, 0, 0, 0}, -{"word", 0, 0x66, _, NoModrm, 0, 0, 0}, -{"lock", 0, 0xf0, _, NoModrm, 0, 0, 0}, -{"cs", 0, 0x2e, _, NoModrm, 0, 0, 0}, -{"ds", 0, 0x3e, _, NoModrm, 0, 0, 0}, -{"es", 0, 0x26, _, NoModrm, 0, 0, 0}, -{"fs", 0, 0x64, _, NoModrm, 0, 0, 0}, -{"gs", 0, 0x65, _, NoModrm, 0, 0, 0}, -{"ss", 0, 0x36, _, NoModrm, 0, 0, 0}, -{"rep", 0, 0xf3, _, NoModrm, 0, 0, 0}, -{"repe", 0, 0xf3, _, NoModrm, 0, 0, 0}, -{ "repne", 0, 0xf2, _, NoModrm, 0, 0, 0}, - -{"", 0, 0, 0, 0, 0, 0, 0} /* sentinal */ -}; -#undef _ - -template *i386_optab_end - = i386_optab + sizeof (i386_optab)/sizeof(i386_optab[0]); - -/* 386 register table */ - -reg_entry i386_regtab[] = { - /* 8 bit regs */ - {"al", Reg8|Acc, 0}, {"cl", Reg8|ShiftCount, 1}, {"dl", Reg8, 2}, - {"bl", Reg8, 3}, - {"ah", Reg8, 4}, {"ch", Reg8, 5}, {"dh", Reg8, 6}, {"bh", Reg8, 7}, - /* 16 bit regs */ - {"ax", Reg16|Acc, 0}, {"cx", Reg16, 1}, {"dx", Reg16|InOutPortReg, 2}, {"bx", Reg16, 3}, - {"sp", Reg16, 4}, {"bp", Reg16, 5}, {"si", Reg16, 6}, {"di", Reg16, 7}, - /* 32 bit regs */ - {"eax", Reg32|Acc, 0}, {"ecx", Reg32, 1}, {"edx", Reg32, 2}, {"ebx", Reg32, 3}, - {"esp", Reg32, 4}, {"ebp", Reg32, 5}, {"esi", Reg32, 6}, {"edi", Reg32, 7}, - /* segment registers */ - {"es", SReg2, 0}, {"cs", SReg2, 1}, {"ss", SReg2, 2}, - {"ds", SReg2, 3}, {"fs", SReg3, 4}, {"gs", SReg3, 5}, - /* control registers */ - {"cr0", Control, 0}, {"cr2", Control, 2}, {"cr3", Control, 3}, - /* debug registers */ - {"db0", Debug, 0}, {"db1", Debug, 1}, {"db2", Debug, 2}, - {"db3", Debug, 3}, {"db6", Debug, 6}, {"db7", Debug, 7}, - /* test registers */ - {"tr6", Test, 6}, {"tr7", Test, 7}, - /* float registers */ - {"st(0)", FloatReg|FloatAcc, 0}, - {"st", FloatReg|FloatAcc, 0}, - {"st(1)", FloatReg, 1}, {"st(2)", FloatReg, 2}, - {"st(3)", FloatReg, 3}, {"st(4)", FloatReg, 4}, {"st(5)", FloatReg, 5}, - {"st(6)", FloatReg, 6}, {"st(7)", FloatReg, 7} -}; - -#define MAX_REG_NAME_SIZE 8 /* for parsing register names from input */ - -reg_entry *i386_regtab_end - = i386_regtab + sizeof(i386_regtab)/sizeof(i386_regtab[0]); - -/* segment stuff */ -seg_entry cs = { "cs", 0x2e }; -seg_entry ds = { "ds", 0x3e }; -seg_entry ss = { "ss", 0x36 }; -seg_entry es = { "es", 0x26 }; -seg_entry fs = { "fs", 0x64 }; -seg_entry gs = { "gs", 0x65 }; -seg_entry null = { "", 0x0 }; - -/* - This table is used to store the default segment register implied by all - possible memory addressing modes. - It is indexed by the mode & modrm entries of the modrm byte as follows: - index = (mode<<3) | modrm; -*/ -seg_entry *one_byte_segment_defaults[] = { - /* mode 0 */ - &ds, &ds, &ds, &ds, &null, &ds, &ds, &ds, - /* mode 1 */ - &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds, - /* mode 2 */ - &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds, - /* mode 3 --- not a memory reference; never referenced */ -}; - -seg_entry *two_byte_segment_defaults[] = { - /* mode 0 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 1 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 2 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 3 --- not a memory reference; never referenced */ -}; - -prefix_entry i386_prefixtab[] = { - { "addr16", 0x67 }, /* address size prefix ==> 16bit addressing - * (How is this useful?) */ -#define WORD_PREFIX_OPCODE 0x66 - { "data16", 0x66 }, /* operand size prefix */ - { "lock", 0xf0 }, /* bus lock prefix */ - { "wait", 0x9b }, /* wait for coprocessor */ - { "cs", 0x2e }, { "ds", 0x3e }, /* segment overrides ... */ - { "es", 0x26 }, { "fs", 0x64 }, - { "gs", 0x65 }, { "ss", 0x36 }, -/* REPE & REPNE used to detect rep/repne with a non-string instruction */ -#define REPNE 0xf2 -#define REPE 0xf3 - { "rep", 0xf3 }, { "repe", 0xf3 }, /* repeat string instructions */ - { "repne", 0xf2 } -}; - -prefix_entry *i386_prefixtab_end - = i386_prefixtab + sizeof(i386_prefixtab)/sizeof(i386_prefixtab[0]); - diff --git a/gnu/usr.bin/as/config/i386.c b/gnu/usr.bin/as/config/i386.c deleted file mode 100644 index 2281acd06fb07..0000000000000 --- a/gnu/usr.bin/as/config/i386.c +++ /dev/null @@ -1,1946 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)i386.c 6.4 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* i386.c -- Assemble code for the Intel 80386 - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - Intel 80386 machine specific gas. - Written by Eliot Dresselhaus (eliot@mgm.mit.edu). - Bugs & suggestions are completely welcome. This is free software. - Please help us make it better. -*/ - -#include <stdio.h> -#include <varargs.h> -#include <ctype.h> - -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else -extern char *alloca(); -#endif -#ifdef USG -#define index strchr -#endif - -#include "as.h" -#include "read.h" -#include "flonum.h" -#include "obstack.h" -#include "frags.h" -#include "struc-symbol.h" -#include "expr.h" -#include "symbols.h" -#include "hash.h" -#include "md.h" -#include "i386.h" -#include "i386-opcode.h" - -long omagic = OMAGIC; -char FLT_CHARS[] = "fFdDxX"; -char EXP_CHARS[] = "eE"; -char line_comment_chars[] = "#"; -char comment_chars[] = "#"; - -/* tables for lexical analysis */ -static char opcode_chars[256]; -static char register_chars[256]; -static char operand_chars[256]; -static char space_chars[256]; -static char identifier_chars[256]; -static char digit_chars[256]; - -/* lexical macros */ -#define is_opcode_char(x) (opcode_chars[(unsigned char) x]) -#define is_operand_char(x) (operand_chars[(unsigned char) x]) -#define is_register_char(x) (register_chars[(unsigned char) x]) -#define is_space_char(x) (space_chars[(unsigned char) x]) -#define is_identifier_char(x) (identifier_chars[(unsigned char) x]) -#define is_digit_char(x) (digit_chars[(unsigned char) x]) - -/* put here all non-digit non-letter charcters that may occur in an operand */ -static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:"; - -static char *ordinal_names[] = { "first", "second", "third" }; /* for printfs */ - -/* md_assemble() always leaves the strings it's passed unaltered. To - effect this we maintain a stack of saved characters that we've smashed - with '\0's (indicating end of strings for various sub-fields of the - assembler instruction). */ -static char save_stack[32]; -static char *save_stack_p; /* stack pointer */ -#define END_STRING_AND_SAVE(s) *save_stack_p++ = *s; *s = '\0' -#define RESTORE_END_STRING(s) *s = *--save_stack_p - -/* The instruction we're assembling. */ -static i386_insn i; - -/* Per instruction expressionS buffers: 2 displacements & 2 immediate max. */ -static expressionS disp_expressions[2], im_expressions[2]; - -/* pointers to ebp & esp entries in reg_hash hash table */ -static reg_entry *ebp, *esp; - -static int this_operand; /* current operand we are working on */ - -/* -Interface to relax_segment. -There are 2 relax states for 386 jump insns: one for conditional & one -for unconditional jumps. This is because the these two types of jumps -add different sizes to frags when we're figuring out what sort of jump -to choose to reach a given label. */ - -/* types */ -#define COND_JUMP 1 /* conditional jump */ -#define UNCOND_JUMP 2 /* unconditional jump */ -/* sizes */ -#define BYTE 0 -#define WORD 1 -#define DWORD 2 -#define UNKNOWN_SIZE 3 - -#define ENCODE_RELAX_STATE(type,size) ((type<<2) | (size)) -#define SIZE_FROM_RELAX_STATE(s) \ - ( (((s) & 0x3) == BYTE ? 1 : (((s) & 0x3) == WORD ? 2 : 4)) ) - -const relax_typeS md_relax_table[] = { -/* - The fields are: - 1) most positive reach of this state, - 2) most negative reach of this state, - 3) how many bytes this mode will add to the size of the current frag - 4) which index into the table to try if we can't fit into this one. -*/ - {1, 1, 0, 0}, - {1, 1, 0, 0}, - {1, 1, 0, 0}, - {1, 1, 0, 0}, - - /* For now we don't use word displacement jumps: they may be - untrustworthy. */ - {127+1, -128+1, 0, ENCODE_RELAX_STATE(COND_JUMP,DWORD) }, - /* word conditionals add 3 bytes to frag: - 2 opcode prefix; 1 displacement bytes */ - {32767+2, -32768+2, 3, ENCODE_RELAX_STATE(COND_JUMP,DWORD) }, - /* dword conditionals adds 4 bytes to frag: - 1 opcode prefix; 3 displacement bytes */ - {0, 0, 4, 0}, - {1, 1, 0, 0}, - - {127+1, -128+1, 0, ENCODE_RELAX_STATE(UNCOND_JUMP,DWORD) }, - /* word jmp adds 2 bytes to frag: - 1 opcode prefix; 1 displacement bytes */ - {32767+2, -32768+2, 2, ENCODE_RELAX_STATE(UNCOND_JUMP,DWORD) }, - /* dword jmp adds 3 bytes to frag: - 0 opcode prefix; 3 displacement bytes */ - {0, 0, 3, 0}, - {1, 1, 0, 0}, - -}; - -void float_cons (), cons (); - -/* Ignore certain directives generated by gcc. This probably should - not be here. */ -void dummy () -{ - while (*input_line_pointer && *input_line_pointer != '\n') - input_line_pointer++; -} - -const pseudo_typeS md_pseudo_table[] = { - { "ffloat", float_cons, 'f' }, - { "dfloat", float_cons, 'd' }, - { "tfloat", float_cons, 'x' }, - { "value", cons, 2 }, - { "ident", dummy, 0 }, /* ignore these directives */ - { "def", dummy, 0 }, - { "optim", dummy, 0 }, /* For sun386i cc */ - { "version", dummy, 0 }, - { "ln", dummy, 0 }, - { 0, 0, 0 } -}; - -/* for interface with expression () */ -extern char * input_line_pointer; -char * index (); - -char * output_invalid (); -reg_entry * parse_register (); - -/* obstack for constructing various things in md_begin */ -struct obstack o; - -/* hash table for opcode lookup */ -static struct hash_control *op_hash = (struct hash_control *) 0; -/* hash table for register lookup */ -static struct hash_control *reg_hash = (struct hash_control *) 0; -/* hash table for prefix lookup */ -static struct hash_control *prefix_hash = (struct hash_control *) 0; - - -void md_begin () -{ - char * hash_err; - - obstack_begin (&o,4096); - - /* initialize op_hash hash table */ - op_hash = hash_new(); /* xmalloc handles error */ - - { - register template *optab; - register templates *core_optab; - char *prev_name; - - optab = i386_optab; /* setup for loop */ - prev_name = optab->name; - obstack_grow (&o, optab, sizeof(template)); - core_optab = (templates *) xmalloc (sizeof (templates)); - - for (optab++; optab < i386_optab_end; optab++) { - if (! strcmp (optab->name, prev_name)) { - /* same name as before --> append to current template list */ - obstack_grow (&o, optab, sizeof(template)); - } else { - /* different name --> ship out current template list; - add to hash table; & begin anew */ - /* Note: end must be set before start! since obstack_next_free changes - upon opstack_finish */ - core_optab->end = (template *) obstack_next_free(&o); - core_optab->start = (template *) obstack_finish(&o); - hash_err = hash_insert (op_hash, prev_name, (char *) core_optab); - if (hash_err && *hash_err) { - hash_error: - as_fatal("Internal Error: Can't hash %s: %s",prev_name, hash_err); - } - prev_name = optab->name; - core_optab = (templates *) xmalloc (sizeof(templates)); - obstack_grow (&o, optab, sizeof(template)); - } - } - } - - /* initialize reg_hash hash table */ - reg_hash = hash_new(); - { - register reg_entry *regtab; - - for (regtab = i386_regtab; regtab < i386_regtab_end; regtab++) { - hash_err = hash_insert (reg_hash, regtab->reg_name, regtab); - if (hash_err && *hash_err) goto hash_error; - } - } - - esp = (reg_entry *) hash_find (reg_hash, "esp"); - ebp = (reg_entry *) hash_find (reg_hash, "ebp"); - - /* initialize reg_hash hash table */ - prefix_hash = hash_new(); - { - register prefix_entry *prefixtab; - - for (prefixtab = i386_prefixtab; - prefixtab < i386_prefixtab_end; prefixtab++) { - hash_err = hash_insert (prefix_hash, prefixtab->prefix_name, prefixtab); - if (hash_err && *hash_err) goto hash_error; - } - } - - /* fill in lexical tables: opcode_chars, operand_chars, space_chars */ - { - register unsigned int c; - - bzero (opcode_chars, sizeof(opcode_chars)); - bzero (operand_chars, sizeof(operand_chars)); - bzero (space_chars, sizeof(space_chars)); - bzero (identifier_chars, sizeof(identifier_chars)); - bzero (digit_chars, sizeof(digit_chars)); - - for (c = 0; c < 256; c++) { - if (islower(c) || isdigit(c)) { - opcode_chars[c] = c; - register_chars[c] = c; - } else if (isupper(c)) { - opcode_chars[c] = tolower(c); - register_chars[c] = opcode_chars[c]; - } else if (c == PREFIX_SEPERATOR) { - opcode_chars[c] = c; - } else if (c == ')' || c == '(') { - register_chars[c] = c; - } - - if (isupper(c) || islower(c) || isdigit(c)) - operand_chars[c] = c; - else if (c && index(operand_special_chars, c)) - operand_chars[c] = c; - - if (isdigit(c) || c == '-') digit_chars[c] = c; - - if (isalpha(c) || c == '_' || c == '.' || isdigit(c)) - identifier_chars[c] = c; - - if (c == ' ' || c == '\t') space_chars[c] = c; - } - } -} - -void md_end() {} /* not much to do here. */ - - -#ifdef DEBUG386 - -/* debugging routines for md_assemble */ -static void pi (), pte (), pt (), pe (), ps (); - -static void pi (line, x) - char * line; - i386_insn *x; -{ - register template *p; - int i; - - fprintf (stdout, "%s: template ", line); - pte (&x->tm); - fprintf (stdout, " modrm: mode %x reg %x reg/mem %x", - x->rm.mode, x->rm.reg, x->rm.regmem); - fprintf (stdout, " base %x index %x scale %x\n", - x->bi.base, x->bi.index, x->bi.scale); - for (i = 0; i < x->operands; i++) { - fprintf (stdout, " #%d: ", i+1); - pt (x->types[i]); - fprintf (stdout, "\n"); - if (x->types[i] & Reg) fprintf (stdout, "%s\n", x->regs[i]->reg_name); - if (x->types[i] & Imm) pe (x->imms[i]); - if (x->types[i] & (Disp|Abs)) pe (x->disps[i]); - } -} - -static void pte (t) - template *t; -{ - int i; - fprintf (stdout, " %d operands ", t->operands); - fprintf (stdout, "opcode %x ", - t->base_opcode); - if (t->extension_opcode != None) - fprintf (stdout, "ext %x ", t->extension_opcode); - if (t->opcode_modifier&D) - fprintf (stdout, "D"); - if (t->opcode_modifier&W) - fprintf (stdout, "W"); - fprintf (stdout, "\n"); - for (i = 0; i < t->operands; i++) { - fprintf (stdout, " #%d type ", i+1); - pt (t->operand_types[i]); - fprintf (stdout, "\n"); - } -} - -char *seg_names[] = { -"SEG_ABSOLUTE", "SEG_TEXT", "SEG_DATA", "SEG_BSS", "SEG_UNKNOWN", -"SEG_NONE", "SEG_PASS1", "SEG_GOOF", "SEG_BIG", "SEG_DIFFERENCE" }; - -static void pe (e) - expressionS *e; -{ - fprintf (stdout, " segment %s\n", seg_names[(int) e->X_seg]); - fprintf (stdout, " add_number %d (%x)\n", - e->X_add_number, e->X_add_number); - if (e->X_add_symbol) { - fprintf (stdout, " add_symbol "); - ps (e->X_add_symbol); - fprintf (stdout, "\n"); - } - if (e->X_subtract_symbol) { - fprintf (stdout, " sub_symbol "); - ps (e->X_subtract_symbol); - fprintf (stdout, "\n"); - } -} - -#define SYMBOL_TYPE(t) \ - (((t&N_TYPE) == N_UNDF) ? "UNDEFINED" : \ - (((t&N_TYPE) == N_ABS) ? "ABSOLUTE" : \ - (((t&N_TYPE) == N_TEXT) ? "TEXT" : \ - (((t&N_TYPE) == N_DATA) ? "DATA" : \ - (((t&N_TYPE) == N_BSS) ? "BSS" : "Bad n_type!"))))) - -static void ps (s) - symbolS *s; -{ - fprintf (stdout, "%s type %s%s", - s->sy_nlist.n_un.n_name, - (s->sy_nlist.n_type&N_EXT) ? "EXTERNAL " : "", - SYMBOL_TYPE (s->sy_nlist.n_type)); -} - -struct type_name { - uint mask; - char *tname; -} type_names[] = { - { Reg8, "r8" }, { Reg16, "r16" }, { Reg32, "r32" }, { Imm8, "i8" }, - { Imm8S, "i8s" }, - { Imm16, "i16" }, { Imm32, "i32" }, { Mem8, "Mem8"}, { Mem16, "Mem16"}, - { Mem32, "Mem32"}, { BaseIndex, "BaseIndex" }, - { Abs8, "Abs8" }, { Abs16, "Abs16" }, { Abs32, "Abs32" }, - { Disp8, "d8" }, { Disp16, "d16" }, - { Disp32, "d32" }, { SReg2, "SReg2" }, { SReg3, "SReg3" }, { Acc, "Acc" }, - { InOutPortReg, "InOutPortReg" }, { ShiftCount, "ShiftCount" }, - { Imm1, "i1" }, { Control, "control reg" }, {Test, "test reg"}, - { FloatReg, "FReg"}, {FloatAcc, "FAcc"}, - { JumpAbsolute, "Jump Absolute"}, - { 0, "" } -}; - -static void pt (t) - uint t; -{ - register struct type_name *ty; - - if (t == Unknown) { - fprintf (stdout, "Unknown"); - } else { - for (ty = type_names; ty->mask; ty++) - if (t & ty->mask) fprintf (stdout, "%s, ", ty->tname); - } - fflush (stdout); -} - -#endif /* DEBUG386 */ - -/* - This is the guts of the machine-dependent assembler. LINE points to a - machine dependent instruction. This funciton is supposed to emit - the frags/bytes it assembles to. - */ -void md_assemble (line) - char *line; -{ - /* Holds temlate once we've found it. */ - register template * t; - - /* Possible templates for current insn */ - templates *current_templates = (templates *) 0; - - /* Initialize globals. */ - bzero (&i, sizeof(i)); - bzero (disp_expressions, sizeof(disp_expressions)); - bzero (im_expressions, sizeof(im_expressions)); - save_stack_p = save_stack; /* reset stack pointer */ - - /* Fist parse an opcode & call i386_operand for the operands. - We assume that the scrubber has arranged it so that line[0] is the valid - start of a (possibly prefixed) opcode. */ - { - register char *l = line; /* Fast place to put LINE. */ - - /* TRUE if operand is pending after ','. */ - uint expecting_operand = 0; - /* TRUE if we found a prefix only acceptable with string insns. */ - uint expecting_string_instruction = 0; - /* Non-zero if operand parens not balenced. */ - uint paren_not_balenced; - char * token_start = l; - - while (! is_space_char(*l) && *l != END_OF_INSN) { - if (! is_opcode_char(*l)) { - as_bad ("invalid character %s in opcode", output_invalid(*l)); - return; - } else if (*l != PREFIX_SEPERATOR) { - *l = opcode_chars[(unsigned char) *l]; /* fold case of opcodes */ - l++; - } else { /* this opcode's got a prefix */ - register int q; - register prefix_entry * prefix; - - if (l == token_start) { - as_bad ("expecting prefix; got nothing"); - return; - } - END_STRING_AND_SAVE (l); - prefix = (prefix_entry *) hash_find (prefix_hash, token_start); - if (! prefix) { - as_bad ("no such opcode prefix ('%s')", token_start); - return; - } - RESTORE_END_STRING (l); - /* check for repeated prefix */ - for (q = 0; q < i.prefixes; q++) - if (i.prefix[q] == prefix->prefix_code) { - as_bad ("same prefix used twice; you don't really want this!"); - return; - } - if (i.prefixes == MAX_PREFIXES) { - as_bad ("too many opcode prefixes"); - return; - } - i.prefix[i.prefixes++] = prefix->prefix_code; - if (prefix->prefix_code == REPE || prefix->prefix_code == REPNE) - expecting_string_instruction = TRUE; - /* skip past PREFIX_SEPERATOR and reset token_start */ - token_start = ++l; - } - } - END_STRING_AND_SAVE (l); - if (token_start == l) { - as_bad ("expecting opcode; got nothing"); - return; - } - - /* Lookup insn in hash; try intel & att naming conventions if appropriate; - that is: we only use the opcode suffix 'b' 'w' or 'l' if we need to. */ - current_templates = (templates *) hash_find (op_hash, token_start); - if (! current_templates) { - int last_index = strlen(token_start) - 1; - char last_char = token_start[last_index]; - switch (last_char) { - case DWORD_OPCODE_SUFFIX: - case WORD_OPCODE_SUFFIX: - case BYTE_OPCODE_SUFFIX: - token_start[last_index] = '\0'; - current_templates = (templates *) hash_find (op_hash, token_start); - token_start[last_index] = last_char; - i.suffix = last_char; - } - if (!current_templates) { - as_bad ("no such 386 instruction: `%s'", token_start); return; - } - } - RESTORE_END_STRING (l); - - /* check for rep/repne without a string instruction */ - if (expecting_string_instruction && - ! IS_STRING_INSTRUCTION (current_templates-> - start->base_opcode)) { - as_bad ("expecting string instruction after rep/repne"); - return; - } - - /* There may be operands to parse. */ - if (*l != END_OF_INSN && - /* For string instructions, we ignore any operands if given. This - kludges, for example, 'rep/movsb %ds:(%esi), %es:(%edi)' where - the operands are always going to be the same, and are not really - encoded in machine code. */ - ! IS_STRING_INSTRUCTION (current_templates-> - start->base_opcode)) { - /* parse operands */ - do { - /* skip optional white space before operand */ - while (! is_operand_char(*l) && *l != END_OF_INSN) { - if (! is_space_char(*l)) { - as_bad ("invalid character %s before %s operand", - output_invalid(*l), - ordinal_names[i.operands]); - return; - } - l++; - } - token_start = l; /* after white space */ - paren_not_balenced = 0; - while (paren_not_balenced || *l != ',') { - if (*l == END_OF_INSN) { - if (paren_not_balenced) { - as_bad ("unbalenced parenthesis in %s operand.", - ordinal_names[i.operands]); - return; - } else break; /* we are done */ - } else if (! is_operand_char(*l)) { - as_bad ("invalid character %s in %s operand", - output_invalid(*l), - ordinal_names[i.operands]); - return; - } - if (*l == '(') ++paren_not_balenced; - if (*l == ')') --paren_not_balenced; - l++; - } - if (l != token_start) { /* yes, we've read in another operand */ - uint operand_ok; - this_operand = i.operands++; - if (i.operands > MAX_OPERANDS) { - as_bad ("spurious operands; (%d operands/instruction max)", - MAX_OPERANDS); - return; - } - /* now parse operand adding info to 'i' as we go along */ - END_STRING_AND_SAVE (l); - operand_ok = i386_operand (token_start); - RESTORE_END_STRING (l); /* restore old contents */ - if (!operand_ok) return; - } else { - if (expecting_operand) { - expecting_operand_after_comma: - as_bad ("expecting operand after ','; got nothing"); - return; - } - if (*l == ',') { - as_bad ("expecting operand before ','; got nothing"); - return; - } - } - - /* now *l must be either ',' or END_OF_INSN */ - if (*l == ',') { - if (*++l == END_OF_INSN) { /* just skip it, if it's \n complain */ - goto expecting_operand_after_comma; - } - expecting_operand = TRUE; - } - } while (*l != END_OF_INSN); /* until we get end of insn */ - } - } - - /* Now we've parsed the opcode into a set of templates, and have the - operands at hand. - Next, we find a template that matches the given insn, - making sure the overlap of the given operands types is consistent - with the template operand types. */ - -#define MATCH(overlap,given_type) \ - (overlap && \ - (overlap & (JumpAbsolute|BaseIndex|Mem8)) \ - == (given_type & (JumpAbsolute|BaseIndex|Mem8))) - - /* If m0 and m1 are register matches they must be consistent - with the expected operand types t0 and t1. - That is, if both m0 & m1 are register matches - i.e. ( ((m0 & (Reg)) && (m1 & (Reg)) ) ? - then, either 1. or 2. must be true: - 1. the expected operand type register overlap is null: - (t0 & t1 & Reg) == 0 - AND - the given register overlap is null: - (m0 & m1 & Reg) == 0 - 2. the expected operand type register overlap == the given - operand type overlap: (t0 & t1 & m0 & m1 & Reg). - */ -#define CONSISTENT_REGISTER_MATCH(m0, m1, t0, t1) \ - ( ((m0 & (Reg)) && (m1 & (Reg))) ? \ - ( ((t0 & t1 & (Reg)) == 0 && (m0 & m1 & (Reg)) == 0) || \ - ((t0 & t1) & (m0 & m1) & (Reg)) \ - ) : 1) - { - register uint overlap0, overlap1; - expressionS * exp; - uint overlap2; - uint found_reverse_match; - - overlap0 = overlap1 = overlap2 = found_reverse_match = 0; - for (t = current_templates->start; - t < current_templates->end; - t++) { - - /* must have right number of operands */ - if (i.operands != t->operands) continue; - else if (!t->operands) break; /* 0 operands always matches */ - - overlap0 = i.types[0] & t->operand_types[0]; - switch (t->operands) { - case 1: - if (! MATCH (overlap0,i.types[0])) continue; - break; - case 2: case 3: - overlap1 = i.types[1] & t->operand_types[1]; - if (! MATCH (overlap0,i.types[0]) || - ! MATCH (overlap1,i.types[1]) || - ! CONSISTENT_REGISTER_MATCH(overlap0, overlap1, - t->operand_types[0], - t->operand_types[1])) { - - /* check if other direction is valid ... */ - if (! (t->opcode_modifier & COMES_IN_BOTH_DIRECTIONS)) - continue; - - /* try reversing direction of operands */ - overlap0 = i.types[0] & t->operand_types[1]; - overlap1 = i.types[1] & t->operand_types[0]; - if (! MATCH (overlap0,i.types[0]) || - ! MATCH (overlap1,i.types[1]) || - ! CONSISTENT_REGISTER_MATCH (overlap0, overlap1, - t->operand_types[0], - t->operand_types[1])) { - /* does not match either direction */ - continue; - } - /* found a reverse match here -- slip through */ - /* found_reverse_match holds which of D or FloatD we've found */ - found_reverse_match = t->opcode_modifier & COMES_IN_BOTH_DIRECTIONS; - } /* endif: not forward match */ - /* found either forward/reverse 2 operand match here */ - if (t->operands == 3) { - overlap2 = i.types[2] & t->operand_types[2]; - if (! MATCH (overlap2,i.types[2]) || - ! CONSISTENT_REGISTER_MATCH (overlap0, overlap2, - t->operand_types[0], - t->operand_types[2]) || - ! CONSISTENT_REGISTER_MATCH (overlap1, overlap2, - t->operand_types[1], - t->operand_types[2])) - continue; - } - /* found either forward/reverse 2 or 3 operand match here: - slip through to break */ - } - break; /* we've found a match; break out of loop */ - } /* for (t = ... */ - if (t == current_templates->end) { /* we found no match */ - as_bad ("operands given don't match any known 386 instruction"); - return; - } - - /* Copy the template we found (we may change it!). */ - bcopy (t, &i.tm, sizeof (template)); - t = &i.tm; /* alter new copy of template */ - - /* If there's no opcode suffix we try to invent one based on register - operands. */ - if (! i.suffix && i.reg_operands) { - /* We take i.suffix from the LAST register operand specified. This - assumes that the last register operands is the destination register - operand. */ - int o; - for (o = 0; o < MAX_OPERANDS; o++) - if (i.types[o] & Reg) { - i.suffix = (i.types[o] == Reg8) ? BYTE_OPCODE_SUFFIX : - (i.types[o] == Reg16) ? WORD_OPCODE_SUFFIX : - DWORD_OPCODE_SUFFIX; - } - } - - /* Make still unresolved immediate matches conform to size of immediate - given in i.suffix. Note: overlap2 cannot be an immediate! - We assume this. */ - if ((overlap0 & (Imm8|Imm8S|Imm16|Imm32)) - && overlap0 != Imm8 && overlap0 != Imm8S - && overlap0 != Imm16 && overlap0 != Imm32) { - if (! i.suffix) { - as_bad ("no opcode suffix given; can't determine immediate size"); - return; - } - overlap0 &= (i.suffix == BYTE_OPCODE_SUFFIX ? (Imm8|Imm8S) : - (i.suffix == WORD_OPCODE_SUFFIX ? Imm16 : Imm32)); - } - if ((overlap1 & (Imm8|Imm8S|Imm16|Imm32)) - && overlap1 != Imm8 && overlap1 != Imm8S - && overlap1 != Imm16 && overlap1 != Imm32) { - if (! i.suffix) { - as_bad ("no opcode suffix given; can't determine immediate size"); - return; - } - overlap1 &= (i.suffix == BYTE_OPCODE_SUFFIX ? (Imm8|Imm8S) : - (i.suffix == WORD_OPCODE_SUFFIX ? Imm16 : Imm32)); - } - - i.types[0] = overlap0; - i.types[1] = overlap1; - i.types[2] = overlap2; - - if (overlap0 & ImplicitRegister) i.reg_operands--; - if (overlap1 & ImplicitRegister) i.reg_operands--; - if (overlap2 & ImplicitRegister) i.reg_operands--; - if (overlap0 & Imm1) i.imm_operands = 0; /* kludge for shift insns */ - - if (found_reverse_match) { - uint save; - save = t->operand_types[0]; - t->operand_types[0] = t->operand_types[1]; - t->operand_types[1] = save; - } - - /* Finalize opcode. First, we change the opcode based on the operand - size given by i.suffix: we never have to change things for byte insns, - or when no opcode suffix is need to size the operands. */ - - if (! i.suffix && (t->opcode_modifier & W)) { - as_bad ("no opcode suffix given and no register operands; can't size instruction"); - return; - } - - if (i.suffix && i.suffix != BYTE_OPCODE_SUFFIX) { - /* Select between byte and word/dword operations. */ - if (t->opcode_modifier & W) - t->base_opcode |= W; - /* Now select between word & dword operations via the - operand size prefix. */ - if (i.suffix == WORD_OPCODE_SUFFIX) { - if (i.prefixes == MAX_PREFIXES) { - as_bad ("%d prefixes given and 'w' opcode suffix gives too many prefixes", - MAX_PREFIXES); - return; - } - i.prefix[i.prefixes++] = WORD_PREFIX_OPCODE; - } - } - - /* For insns with operands there are more diddles to do to the opcode. */ - if (i.operands) { - /* If we found a reverse match we must alter the opcode direction bit - found_reverse_match holds bit to set (different for int & - float insns). */ - - if (found_reverse_match) { - t->base_opcode |= found_reverse_match; - } - - /* - The imul $imm, %reg instruction is converted into - imul $imm, %reg, %reg. */ - if (t->opcode_modifier & imulKludge) { - i.regs[2] = i.regs[1]; /* Pretend we saw the 3 operand case. */ - i.reg_operands = 2; - } - - /* Certain instructions expect the destination to be in the i.rm.reg - field. This is by far the exceptional case. For these instructions, - if the source operand is a register, we must reverse the i.rm.reg - and i.rm.regmem fields. We accomplish this by faking that the - two register operands were given in the reverse order. */ - if ((t->opcode_modifier & ReverseRegRegmem) && i.reg_operands == 2) { - uint first_reg_operand = (i.types[0] & Reg) ? 0 : 1; - uint second_reg_operand = first_reg_operand + 1; - reg_entry *tmp = i.regs[first_reg_operand]; - i.regs[first_reg_operand] = i.regs[second_reg_operand]; - i.regs[second_reg_operand] = tmp; - } - - if (t->opcode_modifier & ShortForm) { - /* The register or float register operand is in operand 0 or 1. */ - uint o = (i.types[0] & (Reg|FloatReg)) ? 0 : 1; - /* Register goes in low 3 bits of opcode. */ - t->base_opcode |= i.regs[o]->reg_num; - } else if (t->opcode_modifier & ShortFormW) { - /* Short form with 0x8 width bit. Register is always dest. operand */ - t->base_opcode |= i.regs[1]->reg_num; - if (i.suffix == WORD_OPCODE_SUFFIX || - i.suffix == DWORD_OPCODE_SUFFIX) - t->base_opcode |= 0x8; - } else if (t->opcode_modifier & Seg2ShortForm) { - if (t->base_opcode == POP_SEG_SHORT && i.regs[0]->reg_num == 1) { - as_bad ("you can't 'pop cs' on the 386."); - return; - } - t->base_opcode |= (i.regs[0]->reg_num << 3); - } else if (t->opcode_modifier & Seg3ShortForm) { - /* 'push %fs' is 0x0fa0; 'pop %fs' is 0x0fa1. - 'push %gs' is 0x0fa8; 'pop %fs' is 0x0fa9. - So, only if i.regs[0]->reg_num == 5 (%gs) do we need - to change the opcode. */ - if (i.regs[0]->reg_num == 5) - t->base_opcode |= 0x08; - } else if (t->opcode_modifier & Modrm) { - /* The opcode is completed (modulo t->extension_opcode which must - be put into the modrm byte. - Now, we make the modrm & index base bytes based on all the info - we've collected. */ - - /* i.reg_operands MUST be the number of real register operands; - implicit registers do not count. */ - if (i.reg_operands == 2) { - uint source, dest; - source = (i.types[0] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 0 : 1; - dest = source + 1; - i.rm.mode = 3; - /* We must be careful to make sure that all segment/control/test/ - debug registers go into the i.rm.reg field (despite the whether - they are source or destination operands). */ - if (i.regs[dest]->reg_type & (SReg2|SReg3|Control|Debug|Test)) { - i.rm.reg = i.regs[dest]->reg_num; - i.rm.regmem = i.regs[source]->reg_num; - } else { - i.rm.reg = i.regs[source]->reg_num; - i.rm.regmem = i.regs[dest]->reg_num; - } - } else { /* if it's not 2 reg operands... */ - if (i.mem_operands) { - uint fake_zero_displacement = FALSE; - uint o = (i.types[0] & Mem) ? 0 : ((i.types[1] & Mem) ? 1 : 2); - - /* Encode memory operand into modrm byte and base index byte. */ - - if (i.base_reg == esp && ! i.index_reg) { - /* <disp>(%esp) becomes two byte modrm with no index register. */ - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - i.bi.base = ESP_REG_NUM; - i.bi.index = NO_INDEX_REGISTER; - i.bi.scale = 0; /* Must be zero! */ - } else if (i.base_reg == ebp && !i.index_reg) { - if (! (i.types[o] & Disp)) { - /* Must fake a zero byte displacement. - There is no direct way to code '(%ebp)' directly. */ - fake_zero_displacement = TRUE; - /* fake_zero_displacement code does not set this. */ - i.types[o] |= Disp8; - } - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - i.rm.regmem = EBP_REG_NUM; - } else if (! i.base_reg && (i.types[o] & BaseIndex)) { - /* There are three cases here. - Case 1: '<32bit disp>(,1)' -- indirect absolute. - (Same as cases 2 & 3 with NO index register) - Case 2: <32bit disp> (,<index>) -- no base register with disp - Case 3: (, <index>) --- no base register; - no disp (must add 32bit 0 disp). */ - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.rm.mode = 0; /* 32bit mode */ - i.bi.base = NO_BASE_REGISTER; - i.types[o] &= ~Disp; - i.types[o] |= Disp32; /* Must be 32bit! */ - if (i.index_reg) { /* case 2 or case 3 */ - i.bi.index = i.index_reg->reg_num; - i.bi.scale = i.log2_scale_factor; - if (i.disp_operands == 0) - fake_zero_displacement = TRUE; /* case 3 */ - } else { - i.bi.index = NO_INDEX_REGISTER; - i.bi.scale = 0; - } - } else if (i.disp_operands && !i.base_reg && !i.index_reg) { - /* Operand is just <32bit disp> */ - i.rm.regmem = EBP_REG_NUM; - i.rm.mode = 0; - i.types[o] &= ~Disp; - i.types[o] |= Disp32; - } else { - /* It's not a special case; rev'em up. */ - i.rm.regmem = i.base_reg->reg_num; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - if (i.index_reg) { - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.bi.base = i.base_reg->reg_num; - i.bi.index = i.index_reg->reg_num; - i.bi.scale = i.log2_scale_factor; - if (i.base_reg == ebp && i.disp_operands == 0) { /* pace */ - fake_zero_displacement = TRUE; - i.types[o] |= Disp8; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - } - } - } - if (fake_zero_displacement) { - /* Fakes a zero displacement assuming that i.types[o] holds - the correct displacement size. */ - exp = &disp_expressions[i.disp_operands++]; - i.disps[o] = exp; - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - } - - /* Select the correct segment for the memory operand. */ - if (i.seg) { - uint seg_index; - seg_entry * default_seg; - - if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING) { - seg_index = (i.rm.mode<<3) | i.bi.base; - default_seg = two_byte_segment_defaults [seg_index]; - } else { - seg_index = (i.rm.mode<<3) | i.rm.regmem; - default_seg = one_byte_segment_defaults [seg_index]; - } - /* If the specified segment is not the default, use an - opcode prefix to select it */ - if (i.seg != default_seg) { - if (i.prefixes == MAX_PREFIXES) { - as_bad ("%d prefixes given and %s segment override gives too many prefixes", - MAX_PREFIXES, i.seg->seg_name); - return; - } - i.prefix[i.prefixes++] = i.seg->seg_prefix; - } - } - } - - /* Fill in i.rm.reg or i.rm.regmem field with register operand - (if any) based on t->extension_opcode. Again, we must be careful - to make sure that segment/control/debug/test registers are coded - into the i.rm.reg field. */ - if (i.reg_operands) { - uint o = - (i.types[0] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 0 : - (i.types[1] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 1 : 2; - /* If there is an extension opcode to put here, the register number - must be put into the regmem field. */ - if (t->extension_opcode != None) - i.rm.regmem = i.regs[o]->reg_num; - else i.rm.reg = i.regs[o]->reg_num; - - /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 - we must set it to 3 to indicate this is a register operand - int the regmem field */ - if (! i.mem_operands) i.rm.mode = 3; - } - - /* Fill in i.rm.reg field with extension opcode (if any). */ - if (t->extension_opcode != None) - i.rm.reg = t->extension_opcode; - } - } - } - } - - /* Handle conversion of 'int $3' --> special int3 insn. */ - if (t->base_opcode == INT_OPCODE && i.imms[0]->X_add_number == 3) { - t->base_opcode = INT3_OPCODE; - i.imm_operands = 0; - } - - /* We are ready to output the insn. */ - { - register char * p; - - /* Output jumps. */ - if (t->opcode_modifier & Jump) { - int n = i.disps[0]->X_add_number; - - switch (i.disps[0]->X_seg) { - case SEG_ABSOLUTE: - if (FITS_IN_SIGNED_BYTE (n)) { - p = frag_more (2); - p[0] = t->base_opcode; - p[1] = n; -#if 0 /* leave out 16 bit jumps - pace */ - } else if (FITS_IN_SIGNED_WORD (n)) { - p = frag_more (4); - p[0] = WORD_PREFIX_OPCODE; - p[1] = t->base_opcode; - md_number_to_chars (&p[2], n, 2); -#endif - } else { /* It's an absolute dword displacement. */ - if (t->base_opcode == JUMP_PC_RELATIVE) { /* pace */ - /* unconditional jump */ - p = frag_more (5); - p[0] = 0xe9; - md_number_to_chars (&p[1], n, 4); - } else { - /* conditional jump */ - p = frag_more (6); - p[0] = TWO_BYTE_OPCODE_ESCAPE; - p[1] = t->base_opcode + 0x10; - md_number_to_chars (&p[2], n, 4); - } - } - break; - default: - /* It's a symbol; end frag & setup for relax. - Make sure there are 6 chars left in the current frag; if not - we'll have to start a new one. */ - /* I caught it failing with obstack_room == 6, - so I changed to <= pace */ - if (obstack_room (&frags) <= 6) { - frag_wane(frag_now); - frag_new (0); - } - p = frag_more (1); - p[0] = t->base_opcode; - frag_var (rs_machine_dependent, - 6, /* 2 opcode/prefix + 4 displacement */ - 1, - ((uchar) *p == JUMP_PC_RELATIVE - ? ENCODE_RELAX_STATE (UNCOND_JUMP, BYTE) - : ENCODE_RELAX_STATE (COND_JUMP, BYTE)), - i.disps[0]->X_add_symbol, - n, p); - break; - } - } else if (t->opcode_modifier & (JumpByte|JumpDword)) { - int size = (t->opcode_modifier & JumpByte) ? 1 : 4; - int n = i.disps[0]->X_add_number; - - if (FITS_IN_UNSIGNED_BYTE(t->base_opcode)) { - FRAG_APPEND_1_CHAR (t->base_opcode); - } else { - p = frag_more (2); /* opcode can be at most two bytes */ - /* put out high byte first: can't use md_number_to_chars! */ - *p++ = (t->base_opcode >> 8) & 0xff; - *p = t->base_opcode & 0xff; - } - - p = frag_more (size); - switch (i.disps[0]->X_seg) { - case SEG_ABSOLUTE: - md_number_to_chars (p, n, size); - if (size == 1 && ! FITS_IN_SIGNED_BYTE (n)) { - as_bad ("loop/jecx only takes byte displacement; %d shortened to %d", - n, *p); - } - break; - default: - fix_new (frag_now, p - frag_now->fr_literal, size, - i.disps[0]->X_add_symbol, i.disps[0]->X_subtract_symbol, - i.disps[0]->X_add_number, 1); - break; - } - } else if (t->opcode_modifier & JumpInterSegment) { - p = frag_more (1 + 2 + 4); /* 1 opcode; 2 segment; 4 offset */ - p[0] = t->base_opcode; - if (i.imms[1]->X_seg == SEG_ABSOLUTE) - md_number_to_chars (p + 1, i.imms[1]->X_add_number, 4); - else - fix_new (frag_now, p + 1 - frag_now->fr_literal, 4, - i.imms[1]->X_add_symbol, - i.imms[1]->X_subtract_symbol, - i.imms[1]->X_add_number, 0); - if (i.imms[0]->X_seg != SEG_ABSOLUTE) - as_bad ("can't handle non absolute segment in long call/jmp"); - md_number_to_chars (p + 5, i.imms[0]->X_add_number, 2); - } else { - /* Output normal instructions here. */ - register char *q; - - /* First the prefix bytes. */ - for (q = i.prefix; q < i.prefix + i.prefixes; q++) { - p = frag_more (1); - md_number_to_chars (p, (uint) *q, 1); - } - - /* Now the opcode; be careful about word order here! */ - if (FITS_IN_UNSIGNED_BYTE(t->base_opcode)) { - FRAG_APPEND_1_CHAR (t->base_opcode); - } else if (FITS_IN_UNSIGNED_WORD(t->base_opcode)) { - p = frag_more (2); - /* put out high byte first: can't use md_number_to_chars! */ - *p++ = (t->base_opcode >> 8) & 0xff; - *p = t->base_opcode & 0xff; - } else { /* opcode is either 3 or 4 bytes */ - if (t->base_opcode & 0xff000000) { - p = frag_more (4); - *p++ = (t->base_opcode >> 24) & 0xff; - } else p = frag_more (3); - *p++ = (t->base_opcode >> 16) & 0xff; - *p++ = (t->base_opcode >> 8) & 0xff; - *p = (t->base_opcode ) & 0xff; - } - - /* Now the modrm byte and base index byte (if present). */ - if (t->opcode_modifier & Modrm) { - p = frag_more (1); - /* md_number_to_chars (p, i.rm, 1); */ - md_number_to_chars (p, (i.rm.regmem<<0 | i.rm.reg<<3 | i.rm.mode<<6), 1); - /* If i.rm.regmem == ESP (4) && i.rm.mode != Mode 3 (Register mode) - ==> need second modrm byte. */ - if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING && i.rm.mode != 3) { - p = frag_more (1); - /* md_number_to_chars (p, i.bi, 1); */ - md_number_to_chars (p,(i.bi.base<<0 | i.bi.index<<3 | i.bi.scale<<6), 1); - } - } - - if (i.disp_operands) { - register int n; - - for (n = 0; n < i.operands; n++) { - if (i.disps[n]) { - if (i.disps[n]->X_seg == SEG_ABSOLUTE) { - if (i.types[n] & (Disp8|Abs8)) { - p = frag_more (1); - md_number_to_chars (p, i.disps[n]->X_add_number, 1); - } else if (i.types[n] & (Disp16|Abs16)) { - p = frag_more (2); - md_number_to_chars (p, i.disps[n]->X_add_number, 2); - } else { /* Disp32|Abs32 */ - p = frag_more (4); - md_number_to_chars (p, i.disps[n]->X_add_number, 4); - } - } else { /* not SEG_ABSOLUTE */ - /* need a 32-bit fixup (don't support 8bit non-absolute disps) */ - p = frag_more (4); - fix_new (frag_now, p - frag_now->fr_literal, 4, - i.disps[n]->X_add_symbol, i.disps[n]->X_subtract_symbol, - i.disps[n]->X_add_number, 0); - } - } - } - } /* end displacement output */ - - /* output immediate */ - if (i.imm_operands) { - register int n; - - for (n = 0; n < i.operands; n++) { - if (i.imms[n]) { - if (i.imms[n]->X_seg == SEG_ABSOLUTE) { - if (i.types[n] & (Imm8|Imm8S)) { - p = frag_more (1); - md_number_to_chars (p, i.imms[n]->X_add_number, 1); - } else if (i.types[n] & Imm16) { - p = frag_more (2); - md_number_to_chars (p, i.imms[n]->X_add_number, 2); - } else { - p = frag_more (4); - md_number_to_chars (p, i.imms[n]->X_add_number, 4); - } - } else { /* not SEG_ABSOLUTE */ - /* need a 32-bit fixup (don't support 8bit non-absolute ims) */ - /* try to support other sizes ... */ - int size; - if (i.types[n] & (Imm8|Imm8S)) - size = 1; - else if (i.types[n] & Imm16) - size = 2; - else - size = 4; - p = frag_more (size); - fix_new (frag_now, p - frag_now->fr_literal, size, - i.imms[n]->X_add_symbol, i.imms[n]->X_subtract_symbol, - i.imms[n]->X_add_number, 0); - } - } - } - } /* end immediate output */ - } - -#ifdef DEBUG386 - if (flagseen ['D']) { - pi (line, &i); - } -#endif /* DEBUG386 */ - - } - return; -} - -/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero - on error. */ - -int i386_operand (operand_string) - char *operand_string; -{ - register char *op_string = operand_string; - - /* Address of '\0' at end of operand_string. */ - char * end_of_operand_string = operand_string + strlen(operand_string); - - /* Start and end of displacement string expression (if found). */ - char * displacement_string_start = 0; - char * displacement_string_end; - - /* We check for an absolute prefix (differentiating, - for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */ - if (*op_string == ABSOLUTE_PREFIX) { - op_string++; - i.types[this_operand] |= JumpAbsolute; - } - - /* Check if operand is a register. */ - if (*op_string == REGISTER_PREFIX) { - register reg_entry * r; - if (! (r = parse_register (op_string))) { - as_bad ("bad register name ('%s')", op_string); - return 0; - } - /* Check for segment override, rather than segment register by - searching for ':' after %<x>s where <x> = s, c, d, e, f, g. */ - if ((r->reg_type & (SReg2|SReg3)) && op_string[3] == ':') { - switch (r->reg_num) { - case 0: - i.seg = &es; break; - case 1: - i.seg = &cs; break; - case 2: - i.seg = &ss; break; - case 3: - i.seg = &ds; break; - case 4: - i.seg = &fs; break; - case 5: - i.seg = &gs; break; - } - op_string += 4; /* skip % <x> s : */ - operand_string = op_string; /* Pretend given string starts here. */ - if (!is_digit_char(*op_string) && !is_identifier_char(*op_string) - && *op_string != '(' && *op_string != ABSOLUTE_PREFIX) { - as_bad ("bad memory operand after segment override"); - return 0; - } - /* Handle case of %es:*foo. */ - if (*op_string == ABSOLUTE_PREFIX) { - op_string++; - i.types[this_operand] |= JumpAbsolute; - } - goto do_memory_reference; - } - i.types[this_operand] |= r->reg_type; - i.regs[this_operand] = r; - i.reg_operands++; - } else if (*op_string == IMMEDIATE_PREFIX) { /* ... or an immediate */ - char * save_input_line_pointer; - register expressionS *exp; - segT exp_seg; - if (i.imm_operands == MAX_IMMEDIATE_OPERANDS) { - as_bad ("only 1 or 2 immediate operands are allowed"); - return 0; - } - exp = &im_expressions[i.imm_operands++]; - i.imms [this_operand] = exp; - save_input_line_pointer = input_line_pointer; - input_line_pointer = ++op_string; /* must advance op_string! */ - exp_seg = expression (exp); - input_line_pointer = save_input_line_pointer; - switch (exp_seg) { - case SEG_NONE: /* missing or bad expr becomes absolute 0 */ - as_bad ("missing or invalid immediate expression '%s' taken as 0", - operand_string); - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - i.types[this_operand] |= Imm; - break; - case SEG_ABSOLUTE: - i.types[this_operand] |= SMALLEST_IMM_TYPE (exp->X_add_number); - break; - case SEG_TEXT: case SEG_DATA: case SEG_BSS: case SEG_UNKNOWN: - i.types[this_operand] |= Imm32; /* this is an address ==> 32bit */ - break; - default: -seg_unimplemented: - as_bad ("Unimplemented segment type %d in parse_operand", exp_seg); - return 0; - } - /* shorten this type of this operand if the instruction wants - * fewer bits than are present in the immediate. The bit field - * code can put out 'andb $0xffffff, %al', for example. pace - * also 'movw $foo,(%eax)' - */ - switch (i.suffix) { - case WORD_OPCODE_SUFFIX: - i.types[this_operand] |= Imm16; - break; - case BYTE_OPCODE_SUFFIX: - i.types[this_operand] |= Imm16 | Imm8 | Imm8S; - break; - } - } else if (is_digit_char(*op_string) || is_identifier_char(*op_string) - || *op_string == '(') { - /* This is a memory reference of some sort. */ - register char * base_string; - uint found_base_index_form; - - do_memory_reference: - if (i.mem_operands == MAX_MEMORY_OPERANDS) { - as_bad ("more than 1 memory reference in instruction"); - return 0; - } - i.mem_operands++; - - /* Determine type of memory operand from opcode_suffix; - no opcode suffix implies general memory references. */ - switch (i.suffix) { - case BYTE_OPCODE_SUFFIX: - i.types[this_operand] |= Mem8; - break; - case WORD_OPCODE_SUFFIX: - i.types[this_operand] |= Mem16; - break; - case DWORD_OPCODE_SUFFIX: - default: - i.types[this_operand] |= Mem32; - } - - /* Check for base index form. We detect the base index form by - looking for an ')' at the end of the operand, searching - for the '(' matching it, and finding a REGISTER_PREFIX or ',' - after it. */ - base_string = end_of_operand_string - 1; - found_base_index_form = FALSE; - if (*base_string == ')') { - uint parens_balenced = 1; - /* We've already checked that the number of left & right ()'s are equal, - so this loop will not be infinite. */ - do { - base_string--; - if (*base_string == ')') parens_balenced++; - if (*base_string == '(') parens_balenced--; - } while (parens_balenced); - base_string++; /* Skip past '('. */ - if (*base_string == REGISTER_PREFIX || *base_string == ',') - found_base_index_form = TRUE; - } - - /* If we can't parse a base index register expression, we've found - a pure displacement expression. We set up displacement_string_start - and displacement_string_end for the code below. */ - if (! found_base_index_form) { - displacement_string_start = op_string; - displacement_string_end = end_of_operand_string; - } else { - char *base_reg_name, *index_reg_name, *num_string; - int num; - - i.types[this_operand] |= BaseIndex; - - /* If there is a displacement set-up for it to be parsed later. */ - if (base_string != op_string + 1) { - displacement_string_start = op_string; - displacement_string_end = base_string - 1; - } - - /* Find base register (if any). */ - if (*base_string != ',') { - base_reg_name = base_string++; - /* skip past register name & parse it */ - while (isalpha(*base_string)) base_string++; - if (base_string == base_reg_name+1) { - as_bad ("can't find base register name after '(%c'", - REGISTER_PREFIX); - return 0; - } - END_STRING_AND_SAVE (base_string); - if (! (i.base_reg = parse_register (base_reg_name))) { - as_bad ("bad base register name ('%s')", base_reg_name); - return 0; - } - RESTORE_END_STRING (base_string); - } - - /* Now check seperator; must be ',' ==> index reg - OR num ==> no index reg. just scale factor - OR ')' ==> end. (scale factor = 1) */ - if (*base_string != ',' && *base_string != ')') { - as_bad ("expecting ',' or ')' after base register in `%s'", - operand_string); - return 0; - } - - /* There may index reg here; and there may be a scale factor. */ - if (*base_string == ',' && *(base_string+1) == REGISTER_PREFIX) { - index_reg_name = ++base_string; - while (isalpha(*++base_string)); - END_STRING_AND_SAVE (base_string); - if (! (i.index_reg = parse_register(index_reg_name))) { - as_bad ("bad index register name ('%s')", index_reg_name); - return 0; - } - RESTORE_END_STRING (base_string); - } - - /* Check for scale factor. */ - if (*base_string == ',' && isdigit(*(base_string+1))) { - num_string = ++base_string; - while (is_digit_char(*base_string)) base_string++; - if (base_string == num_string) { - as_bad ("can't find a scale factor after ','"); - return 0; - } - END_STRING_AND_SAVE (base_string); - /* We've got a scale factor. */ - if (! sscanf (num_string, "%d", &num)) { - as_bad ("can't parse scale factor from '%s'", num_string); - return 0; - } - RESTORE_END_STRING (base_string); - switch (num) { /* must be 1 digit scale */ - case 1: i.log2_scale_factor = 0; break; - case 2: i.log2_scale_factor = 1; break; - case 4: i.log2_scale_factor = 2; break; - case 8: i.log2_scale_factor = 3; break; - default: - as_bad ("expecting scale factor of 1, 2, 4, 8; got %d", num); - return 0; - } - } else { - if (! i.index_reg && *base_string == ',') { - as_bad ("expecting index register or scale factor after ','; got '%c'", - *(base_string+1)); - return 0; - } - } - } - - /* If there's an expression begining the operand, parse it, - assuming displacement_string_start and displacement_string_end - are meaningful. */ - if (displacement_string_start) { - register expressionS * exp; - segT exp_seg; - char * save_input_line_pointer; - exp = &disp_expressions[i.disp_operands]; - i.disps [this_operand] = exp; - i.disp_operands++; - save_input_line_pointer = input_line_pointer; - input_line_pointer = displacement_string_start; - END_STRING_AND_SAVE (displacement_string_end); - exp_seg = expression (exp); - if(*input_line_pointer) - as_bad("Ignoring junk '%s' after expression",input_line_pointer); - RESTORE_END_STRING (displacement_string_end); - input_line_pointer = save_input_line_pointer; - switch (exp_seg) { - case SEG_NONE: - /* missing expr becomes absolute 0 */ - as_bad ("missing or invalid displacement '%s' taken as 0", - operand_string); - i.types[this_operand] |= (Disp|Abs); - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - break; - case SEG_ABSOLUTE: - i.types[this_operand] |= SMALLEST_DISP_TYPE (exp->X_add_number); - break; - case SEG_TEXT: case SEG_DATA: case SEG_BSS: - case SEG_UNKNOWN: /* must be 32 bit displacement (i.e. address) */ - i.types[this_operand] |= Disp32; - break; - default: - goto seg_unimplemented; - } - } - - /* Make sure the memory operand we've been dealt is valid. */ - if (i.base_reg && i.index_reg && - ! (i.base_reg->reg_type & i.index_reg->reg_type & Reg)) { - as_bad ("register size mismatch in (base,index,scale) expression"); - return 0; - } - if ((i.base_reg && (i.base_reg->reg_type & Reg32) == 0) || - (i.index_reg && (i.index_reg->reg_type & Reg32) == 0)) { - as_bad ("base/index register must be 32 bit register"); - return 0; - } - if (i.index_reg && i.index_reg == esp) { - as_bad ("%s may not be used as an index register", esp->reg_name); - return 0; - } - } else { /* it's not a memory operand; argh! */ - as_bad ("invalid char %s begining %s operand '%s'", - output_invalid(*op_string), ordinal_names[this_operand], - op_string); - return 0; - } - return 1; /* normal return */ -} - -/* - * md_estimate_size_before_relax() - * - * Called just before relax(). - * Any symbol that is now undefined will not become defined. - * Return the correct fr_subtype in the frag. - * Return the initial "guess for fr_var" to caller. - * The guess for fr_var is ACTUALLY the growth beyond fr_fix. - * Whatever we do to grow fr_fix or fr_var contributes to our returned value. - * Although it may not be explicit in the frag, pretend fr_var starts with a - * 0 value. - */ -int -md_estimate_size_before_relax (fragP, segment_type) - register fragS * fragP; - register int segment_type; /* N_DATA or N_TEXT. */ -{ - register uchar * opcode; - register int old_fr_fix; - - old_fr_fix = fragP -> fr_fix; - opcode = (uchar *) fragP -> fr_opcode; - /* We've already got fragP->fr_subtype right; all we have to do is check - for un-relaxable symbols. */ - if ((fragP -> fr_symbol -> sy_type & N_TYPE) != segment_type) { - /* symbol is undefined in this segment */ - switch (opcode[0]) { - case JUMP_PC_RELATIVE: /* make jmp (0xeb) a dword displacement jump */ - opcode[0] = 0xe9; /* dword disp jmp */ - fragP -> fr_fix += 4; - fix_new (fragP, old_fr_fix, 4, - fragP -> fr_symbol, - (symbolS *) 0, - fragP -> fr_offset, 1); - break; - - default: - /* This changes the byte-displacement jump 0x7N --> - the dword-displacement jump 0x0f8N */ - opcode[1] = opcode[0] + 0x10; - opcode[0] = TWO_BYTE_OPCODE_ESCAPE; /* two-byte escape */ - fragP -> fr_fix += 1 + 4; /* we've added an opcode byte */ - fix_new (fragP, old_fr_fix + 1, 4, - fragP -> fr_symbol, - (symbolS *) 0, - fragP -> fr_offset, 1); - break; - } - frag_wane (fragP); - } - return (fragP -> fr_var + fragP -> fr_fix - old_fr_fix); -} /* md_estimate_size_before_relax() */ - -/* - * md_convert_frag(); - * - * Called after relax() is finished. - * In: Address of frag. - * fr_type == rs_machine_dependent. - * fr_subtype is what the address relaxed to. - * - * Out: Any fixSs and constants are set up. - * Caller will turn frag into a ".space 0". - */ -void -md_convert_frag (fragP) - register fragS * fragP; -{ - register uchar * opcode; - uchar * where_to_put_displacement; - uint target_address, opcode_address; - uint extension; - int displacement_from_opcode_start; - - opcode = (uchar *) fragP -> fr_opcode; - - /* Address we want to reach in file space. */ - target_address = fragP->fr_symbol->sy_value + fragP->fr_offset; - - /* Address opcode resides at in file space. */ - opcode_address = fragP->fr_address + fragP->fr_fix; - - /* Displacement from opcode start to fill into instruction. */ - displacement_from_opcode_start = target_address - opcode_address; - - switch (fragP->fr_subtype) { - case ENCODE_RELAX_STATE (COND_JUMP, BYTE): - case ENCODE_RELAX_STATE (UNCOND_JUMP, BYTE): - /* don't have to change opcode */ - extension = 1; /* 1 opcode + 1 displacement */ - where_to_put_displacement = &opcode[1]; - break; - - case ENCODE_RELAX_STATE (COND_JUMP, WORD): - opcode[1] = TWO_BYTE_OPCODE_ESCAPE; - opcode[2] = opcode[0] + 0x10; - opcode[0] = WORD_PREFIX_OPCODE; - extension = 4; /* 3 opcode + 2 displacement */ - where_to_put_displacement = &opcode[3]; - break; - - case ENCODE_RELAX_STATE (UNCOND_JUMP, WORD): - opcode[1] = 0xe9; - opcode[0] = WORD_PREFIX_OPCODE; - extension = 3; /* 2 opcode + 2 displacement */ - where_to_put_displacement = &opcode[2]; - break; - - case ENCODE_RELAX_STATE (COND_JUMP, DWORD): - opcode[1] = opcode[0] + 0x10; - opcode[0] = TWO_BYTE_OPCODE_ESCAPE; - extension = 5; /* 2 opcode + 4 displacement */ - where_to_put_displacement = &opcode[2]; - break; - - case ENCODE_RELAX_STATE (UNCOND_JUMP, DWORD): - opcode[0] = 0xe9; - extension = 4; /* 1 opcode + 4 displacement */ - where_to_put_displacement = &opcode[1]; - break; - - default: - BAD_CASE(fragP -> fr_subtype); - break; - } - /* now put displacement after opcode */ - md_number_to_chars (where_to_put_displacement, - displacement_from_opcode_start - extension, - SIZE_FROM_RELAX_STATE (fragP->fr_subtype)); - fragP -> fr_fix += extension; -} - - -int md_short_jump_size = 2; /* size of byte displacement jmp */ -int md_long_jump_size = 5; /* size of dword displacement jmp */ - -void md_create_short_jump(ptr, from_addr, to_addr) - char *ptr; - long from_addr, to_addr; -{ - long offset; - - offset = to_addr - (from_addr + 2); - md_number_to_chars (ptr, (long) 0xeb, 1); /* opcode for byte-disp jump */ - md_number_to_chars (ptr + 1, offset, 1); -} - -void md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) - char *ptr; - long from_addr, to_addr; - fragS *frag; - symbolS *to_symbol; -{ - long offset; - - if (flagseen['m']) { - offset = to_addr - to_symbol->sy_value; - md_number_to_chars (ptr, 0xe9, 1); /* opcode for long jmp */ - md_number_to_chars (ptr + 1, offset, 4); - fix_new (frag, (ptr+1) - frag->fr_literal, 4, - to_symbol, (symbolS *) 0, (long int) 0, 0); - } else { - offset = to_addr - (from_addr + 5); - md_number_to_chars(ptr, (long) 0xe9, 1); - md_number_to_chars(ptr + 1, offset, 4); - } -} - -int -md_parse_option(argP,cntP,vecP) -char **argP; -int *cntP; -char ***vecP; -{ - return 1; -} - -void /* Knows about order of bytes in address. */ -md_number_to_chars (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - register char * p = con; - - switch (nbytes) { - case 1: - p[0] = value & 0xff; - break; - case 2: - p[0] = value & 0xff; - p[1] = (value >> 8) & 0xff; - break; - case 4: - p[0] = value & 0xff; - p[1] = (value>>8) & 0xff; - p[2] = (value>>16) & 0xff; - p[3] = (value>>24) & 0xff; - break; - default: - BAD_CASE (nbytes); - } -} - -void /* Knows about order of bytes in address. */ -md_number_to_disp (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -void /* Knows about order of bytes in address. */ -md_number_to_imm (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -void /* Knows about order of bytes in address. */ -md_number_to_field (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -long int /* Knows about the byte order in a word. */ -md_chars_to_number (con, nbytes) -unsigned char con[]; /* Low order byte 1st. */ - int nbytes; /* Number of bytes in the input. */ -{ - long int retval; - for (retval=0, con+=nbytes-1; nbytes--; con--) - { - retval <<= BITS_PER_CHAR; - retval |= *con; - } - return retval; -} - -void md_ri_to_chars(ri_p, ri) - struct relocation_info *ri_p, ri; -{ - unsigned char the_bytes[8]; - - /* this is easy */ - md_number_to_chars(the_bytes, ri.r_address, sizeof(ri.r_address)); - /* now the fun stuff */ - the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff; - the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff; - the_bytes[4] = ri.r_symbolnum & 0x0ff; - the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06) | - ((ri.r_pcrel << 0) & 0x01)) & 0x0F; - /* now put it back where you found it */ - bcopy (the_bytes, (char *)ri_p, sizeof(struct relocation_info)); -} - - -#define MAX_LITTLENUMS 6 - -/* Turn the string pointed to by litP into a floating point constant of type - type, and emit the appropriate bytes. The number of LITTLENUMS emitted - is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof(type,litP,sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - char *atof_ieee(); - - switch(type) { - case 'f': - case 'F': - prec = 2; - break; - - case 'd': - case 'D': - prec = 4; - break; - - case 'x': - case 'X': - prec = 5; - break; - - default: - *sizeP=0; - return "Bad call to md_atof ()"; - } - t = atof_ieee (input_line_pointer,type,words); - if(t) - input_line_pointer=t; - - *sizeP = prec * sizeof(LITTLENUM_TYPE); - /* this loops outputs the LITTLENUMs in REVERSE order; in accord with - the bigendian 386 */ - for(wordP = words + prec - 1;prec--;) { - md_number_to_chars (litP, (long) (*wordP--), sizeof(LITTLENUM_TYPE)); - litP += sizeof(LITTLENUM_TYPE); - } - return ""; /* Someone should teach Dean about null pointers */ -} - -char output_invalid_buf[8]; - -char * output_invalid (c) - char c; -{ - if (isprint(c)) sprintf (output_invalid_buf, "'%c'", c); - else sprintf (output_invalid_buf, "(0x%x)", c); - return output_invalid_buf; -} - -reg_entry *parse_register (reg_string) - char *reg_string; /* reg_string starts *before* REGISTER_PREFIX */ -{ - register char *s = reg_string; - register char *p; - char reg_name_given[MAX_REG_NAME_SIZE]; - - s++; /* skip REGISTER_PREFIX */ - for (p = reg_name_given; is_register_char (*s); p++, s++) { - *p = register_chars [*s]; - if (p >= reg_name_given + MAX_REG_NAME_SIZE) - return (reg_entry *) 0; - } - *p = '\0'; - return (reg_entry *) hash_find (reg_hash, reg_name_given); -} - diff --git a/gnu/usr.bin/as/config/i386.h b/gnu/usr.bin/as/config/i386.h deleted file mode 100644 index c569c1cb8c34b..0000000000000 --- a/gnu/usr.bin/as/config/i386.h +++ /dev/null @@ -1,296 +0,0 @@ -/* i386.h -- Header file for i386.c - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#define MAX_OPERANDS 3 /* max operands per insn */ -#define MAX_PREFIXES 4 /* max prefixes per opcode */ -#define MAX_IMMEDIATE_OPERANDS 2 /* max immediates per insn */ -#define MAX_MEMORY_OPERANDS 2 /* max memory ref per insn - * lcall uses 2 - */ -/* we define the syntax here (modulo base,index,scale syntax) */ -#define REGISTER_PREFIX '%' -#define IMMEDIATE_PREFIX '$' -#define ABSOLUTE_PREFIX '*' -#define PREFIX_SEPERATOR '/' - -#define TWO_BYTE_OPCODE_ESCAPE 0x0f - -/* register numbers */ -#define EBP_REG_NUM 5 -#define ESP_REG_NUM 4 - -/* modrm_byte.regmem for twobyte escape */ -#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM -/* index_base_byte.index for no index register addressing */ -#define NO_INDEX_REGISTER ESP_REG_NUM -/* index_base_byte.base for no base register addressing */ -#define NO_BASE_REGISTER EBP_REG_NUM - -/* these are the att as opcode suffixes, making movl --> mov, for example */ -#define DWORD_OPCODE_SUFFIX 'l' -#define WORD_OPCODE_SUFFIX 'w' -#define BYTE_OPCODE_SUFFIX 'b' - -/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */ -#define REGMEM_FIELD_HAS_REG 0x3 /* always = 0x3 */ -#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG) - -#define END_OF_INSN '\0' - -/* -When an operand is read in it is classified by its type. This type includes -all the possible ways an operand can be used. Thus, '%eax' is both 'register -# 0' and 'The Accumulator'. In our language this is expressed by OR'ing -'Reg32' (any 32 bit register) and 'Acc' (the accumulator). -Operands are classified so that we can match given operand types with -the opcode table in i386-opcode.h. - */ -#define Unknown 0x0 -/* register */ -#define Reg8 0x1 /* 8 bit reg */ -#define Reg16 0x2 /* 16 bit reg */ -#define Reg32 0x4 /* 32 bit reg */ -#define Reg (Reg8|Reg16|Reg32) /* gen'l register */ -#define WordReg (Reg16|Reg32) /* for push/pop operands */ -/* immediate */ -#define Imm8 0x8 /* 8 bit immediate */ -#define Imm8S 0x10 /* 8 bit immediate sign extended */ -#define Imm16 0x20 /* 16 bit immediate */ -#define Imm32 0x40 /* 32 bit immediate */ -#define Imm1 0x80 /* 1 bit immediate */ -#define ImmUnknown Imm32 /* for unknown expressions */ -#define Imm (Imm8|Imm8S|Imm16|Imm32) /* gen'l immediate */ -/* memory */ -#define Disp8 0x200 /* 8 bit displacement (for jumps) */ -#define Disp16 0x400 /* 16 bit displacement */ -#define Disp32 0x800 /* 32 bit displacement */ -#define Disp (Disp8|Disp16|Disp32) /* General displacement */ -#define DispUnknown Disp32 /* for unknown size displacements */ -#define Mem8 0x1000 -#define Mem16 0x2000 -#define Mem32 0x4000 -#define BaseIndex 0x8000 -#define Mem (Disp|Mem8|Mem16|Mem32|BaseIndex) /* General memory */ -#define WordMem (Mem16|Mem32|Disp|BaseIndex) -#define ByteMem (Mem8|Disp|BaseIndex) -/* specials */ -#define InOutPortReg 0x10000 /* register to hold in/out port addr = dx */ -#define ShiftCount 0x20000 /* register to hold shift cound = cl */ -#define Control 0x40000 /* Control register */ -#define Debug 0x80000 /* Debug register */ -#define Test 0x100000 /* Test register */ -#define FloatReg 0x200000 /* Float register */ -#define FloatAcc 0x400000 /* Float stack top %st(0) */ -#define SReg2 0x800000 /* 2 bit segment register */ -#define SReg3 0x1000000 /* 3 bit segment register */ -#define Acc 0x2000000 /* Accumulator %al or %ax or %eax */ -#define ImplicitRegister (InOutPortReg|ShiftCount|Acc|FloatAcc) -#define JumpAbsolute 0x4000000 -#define Abs8 0x08000000 -#define Abs16 0x10000000 -#define Abs32 0x20000000 -#define Abs (Abs8|Abs16|Abs32) - -#define MODE_FROM_DISP_SIZE(t) \ - ((t&(Disp8)) ? 1 : \ - ((t&(Disp32)) ? 2 : 0)) - -#define Byte (Reg8|Imm8|Imm8S) -#define Word (Reg16|Imm16) -#define DWord (Reg32|Imm32) - -/* convert opcode suffix ('b' 'w' 'l' typically) into type specifyer */ -#define OPCODE_SUFFIX_TO_TYPE(s) \ - (s == BYTE_OPCODE_SUFFIX ? Byte : \ - (s == WORD_OPCODE_SUFFIX ? Word : DWord)) - -#define FITS_IN_SIGNED_BYTE(num) ((num) >= -128 && (num) <= 127) -#define FITS_IN_UNSIGNED_BYTE(num) ((num) >= 0 && (num) <= 255) -#define FITS_IN_UNSIGNED_WORD(num) ((num) >= 0 && (num) <= 65535) -#define FITS_IN_SIGNED_WORD(num) ((num) >= -32768 && (num) <= 32767) - -#define SMALLEST_DISP_TYPE(num) \ - FITS_IN_SIGNED_BYTE(num) ? (Disp8|Disp32|Abs8|Abs32) : (Disp32|Abs32) - -#define SMALLEST_IMM_TYPE(num) \ - (num == 1) ? (Imm1|Imm8|Imm8S|Imm16|Imm32): \ - FITS_IN_SIGNED_BYTE(num) ? (Imm8S|Imm8|Imm16|Imm32) : \ - FITS_IN_UNSIGNED_BYTE(num) ? (Imm8|Imm16|Imm32): \ - (FITS_IN_SIGNED_WORD(num)||FITS_IN_UNSIGNED_WORD(num)) ? (Imm16|Imm32) : \ - (Imm32) - -typedef unsigned char uchar; -typedef unsigned int uint; - -typedef struct { - /* instruction name sans width suffix ("mov" for movl insns) */ - char *name; - - /* how many operands */ - uint operands; - - /* base_opcode is the fundamental opcode byte with a optional prefix(es). */ - uint base_opcode; - - /* extension_opcode is the 3 bit extension for group <n> insns. - If this template has no extension opcode (the usual case) use None */ - uchar extension_opcode; -#define None 0xff /* If no extension_opcode is possible. */ - - /* the bits in opcode_modifier are used to generate the final opcode from - the base_opcode. These bits also are used to detect alternate forms of - the same instruction */ - uint opcode_modifier; - -/* opcode_modifier bits: */ -#define W 0x1 /* set if operands are words or dwords */ -#define D 0x2 /* D = 0 if Reg --> Regmem; D = 1 if Regmem --> Reg */ -/* direction flag for floating insns: MUST BE 0x400 */ -#define FloatD 0x400 -/* shorthand */ -#define DW (D|W) -#define ShortForm 0x10 /* register is in low 3 bits of opcode */ -#define ShortFormW 0x20 /* ShortForm and W bit is 0x8 */ -#define Seg2ShortForm 0x40 /* encoding of load segment reg insns */ -#define Seg3ShortForm 0x80 /* fs/gs segment register insns. */ -#define Jump 0x100 /* special case for jump insns. */ -#define JumpInterSegment 0x200 /* special case for intersegment leaps/calls */ -/* 0x400 CANNOT BE USED since it's already used by FloatD above */ -#define DONT_USE 0x400 -#define NoModrm 0x800 -#define Modrm 0x1000 -#define imulKludge 0x2000 -#define JumpByte 0x4000 -#define JumpDword 0x8000 -#define ReverseRegRegmem 0x10000 - - /* (opcode_modifier & COMES_IN_ALL_SIZES) is true if the - instuction comes in byte, word, and dword sizes and is encoded into - machine code in the canonical way. */ -#define COMES_IN_ALL_SIZES (W) - - /* (opcode_modifier & COMES_IN_BOTH_DIRECTIONS) indicates that the - source and destination operands can be reversed by setting either - the D (for integer insns) or the FloatD (for floating insns) bit - in base_opcode. */ -#define COMES_IN_BOTH_DIRECTIONS (D|FloatD) - - /* operand_types[i] describes the type of operand i. This is made - by OR'ing together all of the possible type masks. (e.g. - 'operand_types[i] = Reg|Imm' specifies that operand i can be - either a register or an immediate operand */ - uint operand_types[3]; -} template; - -/* - 'templates' is for grouping together 'template' structures for opcodes - of the same name. This is only used for storing the insns in the grand - ole hash table of insns. - The templates themselves start at START and range up to (but not including) - END. -*/ -typedef struct { - template *start; - template *end; -} templates; - -/* these are for register name --> number & type hash lookup */ -typedef struct { - char * reg_name; - uint reg_type; - uint reg_num; -} reg_entry; - -typedef struct { - char * seg_name; - uint seg_prefix; -} seg_entry; - -/* these are for prefix name --> prefix code hash lookup */ -typedef struct { - char * prefix_name; - uchar prefix_code; -} prefix_entry; - -/* 386 operand encoding bytes: see 386 book for details of this. */ -typedef struct { - unsigned regmem:3; /* codes register or memory operand */ - unsigned reg:3; /* codes register operand (or extended opcode) */ - unsigned mode:2; /* how to interpret regmem & reg */ -} modrm_byte; - -/* 386 opcode byte to code indirect addressing. */ -typedef struct { - unsigned base:3; - unsigned index:3; - unsigned scale:2; -} base_index_byte; - -/* 'md_assemble ()' gathers together information and puts it into a - i386_insn. */ - -typedef struct { - /* TM holds the template for the insn were currently assembling. */ - template tm; - /* SUFFIX holds the opcode suffix (e.g. 'l' for 'movl') if given. */ - char suffix; - /* Operands are coded with OPERANDS, TYPES, DISPS, IMMS, and REGS. */ - - /* OPERANDS gives the number of given operands. */ - uint operands; - - /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number of - given register, displacement, memory operands and immediate operands. */ - uint reg_operands, disp_operands, mem_operands, imm_operands; - - /* TYPES [i] is the type (see above #defines) which tells us how to - search through DISPS [i] & IMMS [i] & REGS [i] for the required - operand. */ - uint types [MAX_OPERANDS]; - - /* Displacements (if given) for each operand. */ - expressionS * disps [MAX_OPERANDS]; - - /* Immediate operands (if given) for each operand. */ - expressionS * imms [MAX_OPERANDS]; - - /* Register operands (if given) for each operand. */ - reg_entry * regs [MAX_OPERANDS]; - - /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode - the base index byte below. */ - reg_entry * base_reg; - reg_entry * index_reg; - uint log2_scale_factor; - - /* SEG gives the seg_entry of this insn. It is equal to zero unless - an explicit segment override is given. */ - seg_entry * seg; /* segment for memory operands (if given) */ - - /* PREFIX holds all the given prefix opcodes (usually null). - PREFIXES is the size of PREFIX. */ - char prefix [MAX_PREFIXES]; - uint prefixes; - - /* RM and IB are the modrm byte and the base index byte where the addressing - modes of this insn are encoded. */ - - modrm_byte rm; - base_index_byte bi; -} i386_insn; diff --git a/gnu/usr.bin/as/doc/Makefile.in b/gnu/usr.bin/as/doc/Makefile.in deleted file mode 100644 index fdae0b28f40d1..0000000000000 --- a/gnu/usr.bin/as/doc/Makefile.in +++ /dev/null @@ -1,172 +0,0 @@ -# Makefile for GNU Assembler documentation -# - see pretex.m4 for discussion of preprocessor definitions -# Copyright (C) 1987-1992 Free Software Foundation, Inc. - -#This file is part of GNU GAS. - -#GNU GAS is free software; you can redistribute it and/or modify -#it under the terms of the GNU General Public License as published by -#the Free Software Foundation; either version 2, or (at your option) -#any later version. - -#GNU GAS is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. - -#You should have received a copy of the GNU General Public License -#along with GNU GAS; see the file COPYING. If not, write to -#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# The targets for external use include: -# all, doc, proto, install, uninstall, includes, TAGS, -# clean, cleanconfig, realclean, stage1, stage2, stage3, stage4. - -# Variables that exist for you to override. -# See below for how to change them for certain systems. - -srcdir = . - -prefix = /usr/local - -bindir = $(prefix)/bin -datadir = $(prefix)/lib -libdir = $(prefix)/lib -mandir = $(datadir)/man -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 -man9dir = $(mandir)/man9 -infodir = $(datadir)/info -includedir = $(prefix)/include -docdir = $(datadir)/doc - -SHELL = /bin/sh - -INSTALL = install -c -INSTALL_PROGRAM = $(INSTALL) -INSTALL_DATA = $(INSTALL) - -AR = ar -AR_FLAGS = qv -BISON = bison -MAKEINFO = makeinfo -RANLIB = ranlib - -# What version of the manual you want (see *.m4); "all" includes everything -CONFIG=all - -# Sun/Berkeley m4 doesn't have all the things we need; use GNU or sV -M4=gm4 -#M4=/usr/5bin/m4 - -# Directory for gas source -srcdir=.. - -# Where to find texinfo.tex to format docn with TeX -TEXIDIR = $(srcdir)/../texinfo/fsf - -#### host, target, and site specific Makefile frags come in here. -## - -all: -clean: -install: - $(INSTALL_DATA) $(srcdir)/as.1 $(man1dir)/as.1 - -info: as.info - -as.info: as-${CONFIG}.texinfo - makeinfo -o as.info as-${CONFIG}.texinfo - -install-info: as.info - [ -d $(infodir) ] || mkdir $(infodir) - for i in as.info* ; do \ - $(INSTALL_DATA) $$i $(infodir)/$$i ; \ - done - -as.dvi: as-${CONFIG}.texinfo - TEXINPUTS=${TEXIDIR}:.:$$TEXINPUTS tex as-${CONFIG}.texinfo - texindex as-${CONFIG}.?? - TEXINPUTS=${TEXIDIR}:.:$$TEXINPUTS tex as-${CONFIG}.texinfo - mv as-${CONFIG}.dvi as.dvi - rm as-${CONFIG}.?? as-${CONFIG}.??? - -# ROFF doc targets as.ms, as.mm, as.me -# (we don't use a variable because we don't trust all makes to handle -# a var in the target name right). -# roff output (-ms) -as.ms: as-${CONFIG}.texinfo - sed -e '/\\input texinfo/d' \ - -e '/@c TEXI2ROFF-KILL/,/@c END TEXI2ROFF-KILL/d' \ - -e 's/{.*,,/{/' \ - as-${CONFIG}.texinfo | \ - texi2roff -ms >as.ms - -# roff output (-mm) -as.mm: as-${CONFIG}.texinfo - sed -e '/\\input texinfo/d' \ - -e '/@c TEXI2ROFF-KILL/,/@c END TEXI2ROFF-KILL/d' \ - -e 's/{.*,,/{/' \ - -e '/@noindent/d' \ - as-${CONFIG}.texinfo | \ - texi2roff -mm | \ - sed -e 's/---/\\(em/g' \ - >as.mm - -# roff output (-me) -as.me: as-${CONFIG}.texinfo - sed -e '/\\input texinfo/d' \ - -e '/@c TEXI2ROFF-KILL/,/@c END TEXI2ROFF-KILL/d' \ - -e 's/{.*,,/{/' \ - as-${CONFIG}.texinfo | \ - texi2roff -me >as.me - - - -as-all.texinfo: as.texinfo pretex.m4 none.m4 all.m4 - ${M4} $(srcdir)/pretex.m4 $(srcdir)/none.m4 $(srcdir)/all.m4 $(srcdir)/as.texinfo >as-all.texinfo - -as-a29k.texinfo: as.texinfo pretex.m4 none.m4 a29k.m4 - ${M4} pretex.m4 none.m4 a29k.m4 as.texinfo >as-a29k.texinfo - -as-a29k-coff.texinfo: as.texinfo pretex.m4 none.m4 a29k-coff.m4 - ${M4} pretex.m4 none.m4 a29k-coff.m4 as.texinfo >as-a29k-coff.texinfo - -as-gen.texinfo: as.texinfo pretex.m4 none.m4 gen.m4 - ${M4} pretex.m4 none.m4 gen.m4 as.texinfo >as-gen.texinfo - -as-h8.texinfo: as.texinfo pretex.m4 none.m4 h8.m4 - ${M4} pretex.m4 none.m4 h8.m4 as.texinfo >as-h8.texinfo - -as-i80386.texinfo: as.texinfo pretex.m4 none.m4 i80386.m4 - ${M4} pretex.m4 none.m4 i80386.m4 as.texinfo >as-i80386.texinfo - -as-i960.texinfo: as.texinfo pretex.m4 none.m4 i960.m4 - ${M4} pretex.m4 none.m4 i960.m4 as.texinfo >as-i960.texinfo - -as-m680x0.texinfo: as.texinfo pretex.m4 none.m4 m680x0.m4 - ${M4} pretex.m4 none.m4 m680x0.m4 as.texinfo >as-m680x0.texinfo - -as-sparc.texinfo: as.texinfo pretex.m4 none.m4 sparc.m4 - ${M4} pretex.m4 none.m4 sparc.m4 as.texinfo >as-sparc.texinfo - -as-vax.texinfo: as.texinfo pretex.m4 none.m4 vax.m4 - ${M4} pretex.m4 none.m4 vax.m4 as.texinfo >as-vax.texinfo - -as-vintage.texinfo: as.texinfo pretex.m4 none.m4 vintage.m4 - ${M4} pretex.m4 none.m4 vintage.m4 as.texinfo >as-vintage.texinfo - -clean-info: - rm -f as-${CONFIG}.* as.dvi as.info* - -force: - -Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag) - $(SHELL) ./config.status - diff --git a/gnu/usr.bin/as/doc/a29k-coff.m4 b/gnu/usr.bin/as/doc/a29k-coff.m4 deleted file mode 100644 index c3b04e1e1346e..0000000000000 --- a/gnu/usr.bin/as/doc/a29k-coff.m4 +++ /dev/null @@ -1,14 +0,0 @@ -_divert__(-1) -_define__(<_A29K__>,<1>) -_define__(<_GENERIC__>,<0>) -_define__(<_HOST__>,<AMD 29K>) -_define__(<_MACH_DEP__>,<AMD29K-Dependent>) -_define__(<_AOUT__>,<0>) -_define__(<_BOUT__>,<0>) -_define__(<_COFF__>,<1>) -_define__(<_ELF__>,<0>) -_define__(<_DIFFTABKLUG__>,0) NO difference-table kluge -_define__(<_IEEEFLOAT__>,1) IEEE floating point -_define__(<_W32__>,1) 32-bit words -_define__(<_W16__>,0) -_divert__<> diff --git a/gnu/usr.bin/as/doc/a29k.m4 b/gnu/usr.bin/as/doc/a29k.m4 deleted file mode 100644 index 95643875774e3..0000000000000 --- a/gnu/usr.bin/as/doc/a29k.m4 +++ /dev/null @@ -1,9 +0,0 @@ -_divert__(-1) -_define__(<_A29K__>,<1>) -_define__(<_HOST__>,<AMD 29K>) -_define__(<_MACH_DEP__>,<AMD29K-Dependent>) -_define__(<_DIFFTABKLUG__>,0) NO difference-table kluge -_define__(<_IEEEFLOAT__>,1) IEEE floating point -_define__(<_W32__>,1) 32-bit words -_define__(<_W16__>,0) -_divert__<> diff --git a/gnu/usr.bin/as/doc/all.m4 b/gnu/usr.bin/as/doc/all.m4 deleted file mode 100644 index 3d4e7fd2f2f63..0000000000000 --- a/gnu/usr.bin/as/doc/all.m4 +++ /dev/null @@ -1,20 +0,0 @@ -_divert__(-1) -<$Id: all.m4,v 1.1 1993/10/02 21:00:13 pk Exp $> -_define__(<_ALL_ARCH__>,<1>) -_define__(<_GENERIC__>,<1>) In case none.m4 changes its mind abt default - -_define__(<_AOUT__>,<1>) -_define__(<_BOUT__>,<1>) -_define__(<_COFF__>,<1>) -_define__(<_ELF__>,<1>) - -_define__(<_A29K__>,<1>) -_define__(<_H8__>,<1>) -_define__(<_I80386__>,<1>) -_define__(<_I960__>,<1>) -_define__(<_M680X0__>,<1>) -_define__(<_SPARC__>,<1>) -_define__(<_VAX__>,<1>) -_define__(<_VXWORKS__>,<1>) - -_divert__<> diff --git a/gnu/usr.bin/as/doc/as.texinfo b/gnu/usr.bin/as/doc/as.texinfo deleted file mode 100644 index c9e0f575fa338..0000000000000 --- a/gnu/usr.bin/as/doc/as.texinfo +++ /dev/null @@ -1,6730 +0,0 @@ -_dnl__ -*-Texinfo-*- -_dnl__ Copyright (c) 1991 1992 Free Software Foundation, Inc. -_dnl__ $Id: as.texinfo,v 1.1 1993/10/02 21:00:15 pk Exp $ -\input texinfo @c -*-Texinfo-*- -@c Copyright (c) 1991 1992 Free Software Foundation, Inc. -@c %**start of header -@setfilename _AS__.info -_if__(_GENERIC__) -@settitle Using _AS__ -_fi__(_GENERIC__) -_if__(!_GENERIC__) -@settitle Using _AS__ (_HOST__) -_fi__(!_GENERIC__) -@setchapternewpage odd -@c @smallbook -@c @cropmarks -@c %**end of header - -@finalout -@syncodeindex ky cp - -_if__(0) - -NOTE: this manual is marked up for preprocessing with a collection -of m4 macros called "pretex.m4". - -THIS IS THE FULL SOURCE. The full source needs to be run through m4 -before either tex- or info- formatting: for example, - m4 pretex.m4 none.m4 m680x0.m4 as.texinfo >as-680x0.texinfo -will produce (assuming your path finds either GNU or SysV m4; Berkeley -won't do) a file, configured for the M680x0 version of GAS, suitable for -formatting. See the text in "pretex.m4" for a fuller explanation (and -the macro definitions). - -_fi__(0) -@c -@ifinfo -This file documents the GNU Assembler "_AS__". - -Copyright (C) 1991 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' may be -included in a translation approved by the Free Software Foundation -instead of in the original English. -@end ifinfo - -@titlepage -@title Using _AS__ -@subtitle The GNU Assembler -_if__(!_GENERIC__) -@subtitle for the _HOST__ family -_fi__(!_GENERIC__) -@sp 1 -@subtitle January 1992 -@sp 1 -@sp 13 -The Free Software Foundation Inc. thanks The Nice Computer -Company of Australia for loaning Dean Elsner to write the -first (Vax) version of @code{as} for Project GNU. -The proprietors, management and staff of TNCCA thank FSF for -distracting the boss while they got some work -done. -@sp 3 -@author Dean Elsner, Jay Fenlason & friends -@c edited by: pesch@cygnus.com -@page -@tex -\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$ -\xdef\manvers{\$Revision: 1.1 $} % For use in headers, footers too -{\parskip=0pt -\hfill \manvers\par -\hfill \TeX{}info \texinfoversion\par -} -%"boxit" macro for figures: -%Modified from Knuth's ``boxit'' macro from TeXbook (answer to exercise 21.3) -\gdef\boxit#1#2{\vbox{\hrule\hbox{\vrule\kern3pt - \vbox{\parindent=0pt\parskip=0pt\hsize=#1\kern3pt\strut\hfil -#2\hfil\strut\kern3pt}\kern3pt\vrule}\hrule}}%box with visible outline -\gdef\ibox#1#2{\hbox to #1{#2\hfil}\kern8pt}% invisible box -@end tex - -Edited by Roland Pesch for Cygnus Support. - -@vskip 0pt plus 1filll -Copyright @copyright{} 1991 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' may be -included in a translation approved by the Free Software Foundation -instead of in the original English. -@end titlepage -@page -@node Top, Overview, (dir), (dir) -@ifinfo -This file is a user guide to the GNU assembler @code{_AS__}. -_if__(!_GENERIC__) -This version of the file describes @code{_AS__} configured to generate -code for _HOST__ architectures. -_fi__(!_GENERIC__) -@end ifinfo -@menu -* Overview:: Overview -* Invoking:: Command-Line Options -* Syntax:: Syntax -* Sections:: Sections and Relocation -* Symbols:: Symbols -* Expressions:: Expressions -* Pseudo Ops:: Assembler Directives -* _MACH_DEP__:: Machine Dependent Features -* Copying:: GNU GENERAL PUBLIC LICENSE -* Index:: Index -@end menu - -@node Overview, Invoking, Top, Top -@chapter Overview -@iftex -This manual is a user guide to the GNU assembler @code{_AS__}. -_if__(!_GENERIC__) -This version of the manual describes @code{_AS__} configured to generate -code for _HOST__ architectures. -_fi__(!_GENERIC__) -@end iftex - -@cindex invocation summary -@cindex option summary -@cindex summary of options -Here is a brief summary of how to invoke @code{_AS__}. For details, -@pxref{Invoking,,Comand-Line Options}. - -@c We don't use deffn and friends for the following because they seem -@c to be limited to one line for the header. -@smallexample - _AS__ [ -a | -al | -as ] [ -D ] [ -f ] - [ -I @var{path} ] [ -k ] [ -L ] - [ -o @var{objfile} ] [ -R ] [ -v ] [ -w ] -_if__(_A29K__) -@c am29k has no machine-dependent assembler options -_fi__(_A29K__) -_if__(_H8__) -@c h8/300 has no machine-dependent assembler options -_fi__(_H8__) -_if__(_I960__) -@c see md_parse_option in i960.c - [ -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC ] - [ -b ] [ -norelax ] -_fi__(_I960__) -_if__(_M680X0__) - [ -l ] [ -mc68000 | -mc68010 | -mc68020 ] -_fi__(_M680X0__) - [ -- | @var{files} @dots{} ] -@end smallexample - -@table @code -@item -a | -al | -as -Turn on assembly listings; @samp{-al}, listing only, @samp{-as}, symbols -only, @samp{-a}, everything. - -@item -D -This option is accepted only for script compatibility with calls to -other assemblers; it has no effect on @code{_AS__}. - -@item -f -``fast''---skip preprocessing (assume source is compiler output) - -@item -I @var{path} -Add @var{path} to the search list for @code{.include} directives - -@item -k -_if__((!_GENERIC__) && !_DIFFTABKLUG__) -This option is accepted but has no effect on the _HOST__ family. -_fi__((!_GENERIC__) && !_DIFFTABKLUG__) -_if__(_GENERIC__ || _DIFFTABKLUG__) -Issue warnings when difference tables altered for long displacements. -_fi__(_GENERIC__ || _DIFFTABKLUG__) - -@item -L -Keep (in symbol table) local symbols, starting with @samp{L} - -@item -o @var{objfile} -Name the object-file output from @code{_AS__} - -@item -R -Fold data section into text section - -@item -v -Announce @code{as} version - -@item -W -Suppress warning messages - -_if__(_I960__) -@item -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC -_if__(_GENERIC__) -(When configured for Intel 960). -_fi__(_GENERIC__) -Specify which variant of the 960 architecture is the target. - -@item -b -_if__(_GENERIC__) -(When configured for Intel 960). -_fi__(_GENERIC__) -Add code to collect statistics about branches taken. - -@item -norelax -_if__(_GENERIC__) -(When configured for Intel 960). -_fi__(_GENERIC__) -Do not alter compare-and-branch instructions for long displacements; -error if necessary. -_fi__(_I960__) - -_if__(_M680X0__) -@item -l -_if__(_GENERIC__) -(When configured for Motorola 68000). -_fi__(_GENERIC__) -Shorten references to undefined symbols, to one word instead of two - -@item -mc68000 | -mc68010 | -mc68020 -_if__(_GENERIC__) -(When configured for Motorola 68000). -_fi__(_GENERIC__) -Specify what processor in the 68000 family is the target (default 68020) -_fi__(_M680X0__) - -@item -- | @var{files} @dots{} -Standard input, or source files to assemble -@end table - -@menu -* Manual:: Structure of this Manual -* GNU Assembler:: _AS__, the GNU Assembler -* Object Formats:: Object File Formats -* Command Line:: Command Line -* Input Files:: Input Files -* Object:: Output (Object) File -* Errors:: Error and Warning Messages -@end menu - -@node Manual, GNU Assembler, Overview, Overview -@section Structure of this Manual - -@cindex manual, structure and purpose -This manual is intended to describe what you need to know to use -@sc{gnu} @code{_AS__}. We cover the syntax expected in source files, including -notation for symbols, constants, and expressions; the directives that -@code{_AS__} understands; and of course how to invoke @code{_AS__}. - -_if__(!_GENERIC__) -We also cover special features in the _HOST__ -configuration of @code{_AS__}, including assembler directives. -_fi__(!_GENERIC__) -_if__(_GENERIC__) -This manual also describes some of the machine-dependent features of -various flavors of the assembler. -_fi__(_GENERIC__) -_if__(_INTERNALS__) -This manual also describes how the assembler works internally, and -provides some information that may be useful to people attempting to -port the assembler to another machine. -_fi__(_INTERNALS__) -@refill - -@cindex machine instructions (not covered) -On the other hand, this manual is @emph{not} intended as an introduction -to programming in assembly language---let alone programming in general! -In a similar vein, we make no attempt to introduce the machine -architecture; we do @emph{not} describe the instruction set, standard -mnemonics, registers or addressing modes that are standard to a -particular architecture. -_if__(_GENERIC__) -You may want to consult the manufacturer's -machine architecture manual for this information. -_fi__(_GENERIC__) -_if__(_H8__&&!_GENERIC__) -For information on the H8/300 machine instruction set, see @cite{H8/300 -Series Programming Manual} (Hitachi ADE--602--025). -_fi__(_H8__&&!_GENERIC__) - - -@c I think this is premature---pesch@cygnus.com, 17jan1991 -@ignore -Throughout this manual, we assume that you are running @dfn{GNU}, -the portable operating system from the @dfn{Free Software -Foundation, Inc.}. This restricts our attention to certain kinds of -computer (in particular, the kinds of computers that GNU can run on); -once this assumption is granted examples and definitions need less -qualification. - -@code{_AS__} is part of a team of programs that turn a high-level -human-readable series of instructions into a low-level -computer-readable series of instructions. Different versions of -@code{_AS__} are used for different kinds of computer. -@end ignore - -@c There used to be a section "Terminology" here, which defined -@c "contents", "byte", "word", and "long". Defining "word" to any -@c particular size is confusing when the .word directive may generate 16 -@c bits on one machine and 32 bits on another; in general, for the user -@c version of this manual, none of these terms seem essential to define. -@c They were used very little even in the former draft of the manual; -@c this draft makes an effort to avoid them (except in names of -@c directives). - -@node GNU Assembler, Object Formats, Manual, Overview -@section _AS__, the GNU Assembler - -GNU @code{as} is really a family of assemblers. -_if__(!_GENERIC__) -This manual describes @code{_AS__}, a member of that family which is -configured for the _HOST__ architectures. -_fi__(!_GENERIC__) -If you use (or have used) the GNU assembler on one architecture, you -should find a fairly similar environment when you use it on another -architecture. Each version has much in common with the others, -including object file formats, most assembler directives (often called -@dfn{pseudo-ops)} and assembler syntax.@refill - -_if__(_GENERIC__||!_H8__) -@cindex purpose of @sc{gnu} @code{_AS__} -@code{_AS__} is primarily intended to assemble the output of the GNU C -compiler @code{_GCC__} for use by the linker @code{_LD__}. Nevertheless, -we've tried to make @code{_AS__} assemble correctly everything that the native -assembler would. -_fi__(_GENERIC__||!_H8__) -_if__(_VAX__) -Any exceptions are documented explicitly (@pxref{_MACH_DEP__}). -_fi__(_VAX__) -_if__(_GENERIC__||_M680X0__) -This doesn't mean @code{_AS__} always uses the same syntax as another -assembler for the same architecture; for example, we know of several -incompatible versions of 680x0 assembly language syntax. -_fi__(_GENERIC__||_M680X0__) - -Unlike older assemblers, @code{_AS__} is designed to assemble a source -program in one pass of the source file. This has a subtle impact on the -@kbd{.org} directive (@pxref{Org,,@code{.org}}). - -@node Object Formats, Command Line, GNU Assembler, Overview -@section Object File Formats - -@cindex object file format -The GNU assembler can be configured to produce several alternative -object file formats. For the most part, this does not affect how you -write assembly language programs; but directives for debugging symbols -are typically different in different file formats. @xref{Symbol -Attributes,,Symbol Attributes}. -_if__(!_GENERIC__) -_if__(!(_I960__||_A29K__)) -_if__(_AOUT__ && (!_COFF__) && (!_ELF__)) -On the _HOST__, @code{_AS__} is configured to produce @code{a.out} format object -files.@refill -_fi__(_AOUT__ && (!_COFF__) && (!_ELF__)) -_if__((!_AOUT__) && _COFF__ && (!_ELF__)) -On the _HOST__, @code{_AS__} is configured to produce COFF format object -files.@refill -_fi__((!_AOUT__) && _COFF__ && (!_ELF__)) -_fi__(!(_I960__||_A29K__)) -_if__(_A29K__) -On the _HOST__, @code{_AS__} can be configured to produce either -@code{a.out} or COFF format object files. -_fi__(_A29K__) -_if__(_I960__) -On the _HOST__, @code{_AS__} can be configured to produce either @code{b.out} or COFF -format object files. -_fi__(_I960__) -_fi__(!_GENERIC__) - -@node Command Line, Input Files, Object Formats, Overview -@section Command Line - -@cindex command line conventions -After the program name @code{_AS__}, the command line may contain -options and file names. Options may appear in any order, and may be -before, after, or between file names. The order of file names is -significant. - -@cindex standard input, as input file -@kindex -- -@file{--} (two hyphens) by itself names the standard input file -explicitly, as one of the files for @code{_AS__} to assemble. - -@cindex options, command line -Except for @samp{--} any command line argument that begins with a -hyphen (@samp{-}) is an option. Each option changes the behavior of -@code{_AS__}. No option changes the way another option works. An -option is a @samp{-} followed by one or more letters; the case of -the letter is important. All options are optional. - -Some options expect exactly one file name to follow them. The file -name may either immediately follow the option's letter (compatible -with older assemblers) or it may be the next command argument (GNU -standard). These two command lines are equivalent: - -@smallexample -_AS__ -o my-object-file.o mumble.s -_AS__ -omy-object-file.o mumble.s -@end smallexample - -@node Input Files, Object, Command Line, Overview -@section Input Files - -@cindex input -@cindex source program -@cindex files, input -We use the phrase @dfn{source program}, abbreviated @dfn{source}, to -describe the program input to one run of @code{_AS__}. The program may -be in one or more files; how the source is partitioned into files -doesn't change the meaning of the source. - -@c I added "con" prefix to "catenation" just to prove I can overcome my -@c APL training... pesch@cygnus.com -The source program is a concatenation of the text in all the files, in the -order specified. - -Each time you run @code{_AS__} it assembles exactly one source -program. The source program is made up of one or more files. -(The standard input is also a file.) - -You give @code{_AS__} a command line that has zero or more input file -names. The input files are read (from left file name to right). A -command line argument (in any position) that has no special meaning -is taken to be an input file name. - -If you give @code{_AS__} no file names it attempts to read one input file -from the @code{_AS__} standard input, which is normally your terminal. You -may have to type @key{ctl-D} to tell @code{_AS__} there is no more program -to assemble. - -Use @samp{--} if you need to explicitly name the standard input file -in your command line. - -If the source is empty, @code{_AS__} will produce a small, empty object -file. - -@subheading Filenames and Line-numbers - -@cindex input file linenumbers -@cindex line numbers, in input files -There are two ways of locating a line in the input file (or files) and -either may be used in reporting error messages. One way refers to a line -number in a physical file; the other refers to a line number in a -``logical'' file. @xref{Errors, ,Error and Warning Messages}. - -@dfn{Physical files} are those files named in the command line given -to @code{_AS__}. - -@dfn{Logical files} are simply names declared explicitly by assembler -directives; they bear no relation to physical files. Logical file names -help error messages reflect the original source file, when @code{_AS__} -source is itself synthesized from other files. -@xref{App-File,,@code{.app-file}}. - -@node Object, Errors, Input Files, Overview -@section Output (Object) File - -@cindex object file -@cindex output file -@kindex a.out -@kindex .o -Every time you run @code{_AS__} it produces an output file, which is -your assembly language program translated into numbers. This file -is the object file, named @code{a.out} unless you tell @code{_AS__} to -give it another name by using the @code{-o} option. Conventionally, -object file names end with @file{.o}. The default name of -@file{a.out} is used for historical reasons: older assemblers were -capable of assembling self-contained programs directly into a -runnable program. -@c This may still work, but hasn't been tested. - -@cindex linker -@kindex ld -The object file is meant for input to the linker @code{_LD__}. It contains -assembled program code, information to help @code{_LD__} integrate -the assembled program into a runnable file, and (optionally) symbolic -information for the debugger. - -@c link above to some info file(s) like the description of a.out. -@c don't forget to describe GNU info as well as Unix lossage. - -@node Errors, , Object, Overview -@section Error and Warning Messages - -@cindex error messsages -@cindex warning messages -@cindex messages from @code{_AS__} -@code{_AS__} may write warnings and error messages to the standard error -file (usually your terminal). This should not happen when a compiler -runs @code{_AS__} automatically. Warnings report an assumption made so -that @code{_AS__} could keep assembling a flawed program; errors report a -grave problem that stops the assembly. - -@cindex format of warning messages -Warning messages have the format - -@smallexample -file_name:@b{NNN}:Warning Message Text -@end smallexample - -@noindent -@cindex line numbers, in warnings/errors -(where @b{NNN} is a line number). If a logical file name has -been given (@pxref{App-File,,@code{.app-file}}) it is used for the filename, otherwise the -name of the current input file is used. If a logical line number was -given -_if__(!_A29K__) -(@pxref{Line,,@code{.line}}) -_fi__(!_A29K__) -_if__(_A29K__) -(@pxref{Ln,,@code{.ln}}) -_fi__(_A29K__) -then it is used to calculate the number printed, -otherwise the actual line in the current source file is printed. The -message text is intended to be self explanatory (in the grand Unix -tradition). @refill - -@cindex format of error messages -Error messages have the format -@smallexample -file_name:@b{NNN}:FATAL:Error Message Text -@end smallexample -The file name and line number are derived as for warning -messages. The actual message text may be rather less explanatory -because many of them aren't supposed to happen. - -@node Invoking, Syntax, Overview, Top -@chapter Command-Line Options - -@cindex options, all versions of @code{_AS__} -This chapter describes command-line options available in @emph{all} -versions of the GNU assembler; @pxref{_MACH_DEP__}, for options specific -_if__(!_GENERIC__) -to the _HOST__. -_fi__(!_GENERIC__) -_if__(_GENERIC__) -to particular machine architectures. -_fi__(_GENERIC__) - -@section Enable Listings: @code{-a}, @code{-al}, @code{-as} - -@kindex -a -@kindex -al -@kindex -as -@cindex listings, enabling -@cindex assembly listings, enabling -These options enable listing output from the assembler. @samp{-a} by -itself requests all listing output; @samp{-al} requests only the -output-program listing, and @samp{-as} requests only a symbol table -listing. - -Once you have specified one of these options, you can further control -listing output and its appearance using the directives @code{.list}, -@code{.nolist}, @code{.psize}, @code{.eject}, @code{.title}, and -@code{.sbttl}. - -If you do not request listing output with one of the @samp{-a} options, the -listing-control directives have no effect. - -@section @code{-D} - -@kindex -D -This option has no effect whatsoever, but it is accepted to make it more -likely that scripts written for other assemblers will also work with -@code{_AS__}. - -@section Work Faster: @code{-f} - -@kindex -f -@cindex trusted compiler -@cindex faster processing (@code{-f}) -@samp{-f} should only be used when assembling programs written by a -(trusted) compiler. @samp{-f} stops the assembler from pre-processing -the input file(s) before assembling them. @xref{Pre-processing, -,Pre-processing}. - -@quotation -@emph{Warning:} if the files actually need to be pre-processed (if they -contain comments, for example), @code{_AS__} will not work correctly if -@samp{-f} is used. -@end quotation - -@section @code{.include} search path: @code{-I} @var{path} - -@kindex -I @var{path} -@cindex paths for @code{.include} -@cindex search path for @code{.include} -@cindex @code{include} directive search path -Use this option to add a @var{path} to the list of directories -@code{_AS__} will search for files specified in @code{.include} -directives (@pxref{Include,,@code{.include}}). You may use @code{-I} as -many times as necessary to include a variety of paths. The current -working directory is always searched first; after that, @code{_AS__} -searches any @samp{-I} directories in the same order as they were -specified (left to right) on the command line. - -@section Difference Tables: @code{-k} - -@kindex -k -_if__((!_GENERIC__) && (!_DIFFTABKLUG__)) -On the _HOST__ family, this option is allowed, but has no effect. It is -permitted for compatibility with the GNU assembler on other platforms, -where it can be used to warn when the assembler alters the machine code -generated for @samp{.word} directives in difference tables. The _HOST__ -family does not have the addressing limitations that sometimes lead to this -alteration on other platforms. -_fi__((!_GENERIC__) && (!_DIFFTABKLUG__)) - -_if__(_GENERIC__ || _DIFFTABKLUG__ ) -@cindex difference tables, warning -@cindex warning for altered difference tables -@code{_AS__} sometimes alters the code emitted for directives of the form -@samp{.word @var{sym1}-@var{sym2}}; @pxref{Word,,@code{.word}}. -You can use the @samp{-k} option if you want a warning issued when this -is done. -_fi__(_GENERIC__ || _DIFFTABKLUG__ ) - -@section Include Local Labels: @code{-L} - -@kindex -L -@cindex local labels, retaining in output -Labels beginning with @samp{L} (upper case only) are called @dfn{local -labels}. @xref{Symbol Names}. Normally you don't see such labels when -debugging, because they are intended for the use of programs (like -compilers) that compose assembler programs, not for your notice. -Normally both @code{_AS__} and @code{_LD__} discard such labels, so you don't -normally debug with them. - -This option tells @code{_AS__} to retain those @samp{L@dots{}} symbols -in the object file. Usually if you do this you also tell the linker -@code{_LD__} to preserve symbols whose names begin with @samp{L}. - -@section Name the Object File: @code{-o} - -@kindex -o -@cindex naming object file -@cindex object file name -There is always one object file output when you run @code{_AS__}. By -default it has the name @file{a.out}. You use this option (which -takes exactly one filename) to give the object file a different name. - -Whatever the object file is called, @code{_AS__} will overwrite any -existing file of the same name. - -@section Join Data and Text Sections: @code{-R} - -@kindex -R -@cindex data and text sections, joining -@cindex text and data sections, joining -@cindex joining text and data sections -@cindex merging text and data sections -@code{-R} tells @code{_AS__} to write the object file as if all -data-section data lives in the text section. This is only done at -the very last moment: your binary data are the same, but data -section parts are relocated differently. The data section part of -your object file is zero bytes long because all it bytes are -appended to the text section. (@xref{Sections,,Sections and Relocation}.) - -When you specify @code{-R} it would be possible to generate shorter -address displacements (because we don't have to cross between text and -data section). We refrain from doing this simply for compatibility with -older versions of @code{_AS__}. In future, @code{-R} may work this way. - -_if__(_COFF__) -When @code{_AS__} is configured for COFF output, -this option is only useful if you use sections named @samp{.text} and -@samp{.data}. -_fi__(_COFF__) - -@section Announce Version: @code{-v} - -@kindex -v -@kindex -version -@cindex @code{_AS__} version -@cindex version of @code{_AS__} -You can find out what version of as is running by including the -option @samp{-v} (which you can also spell as @samp{-version}) on the -command line. - -@section Suppress Warnings: @code{-W} - -@kindex -W -@cindex suppressing warnings -@cindex warnings, suppressing -@code{_AS__} should never give a warning or error message when -assembling compiler output. But programs written by people often -cause @code{_AS__} to give a warning that a particular assumption was -made. All such warnings are directed to the standard error file. -If you use this option, no warnings are issued. This option only -affects the warning messages: it does not change any particular of how -@code{_AS__} assembles your file. Errors, which stop the assembly, are -still reported. - -@node Syntax, Sections, Invoking, Top -@chapter Syntax - -@cindex machine-independent syntax -@cindex syntax, machine-independent -This chapter describes the machine-independent syntax allowed in a -source file. @code{_AS__} syntax is similar to what many other assemblers -use; it is inspired in BSD 4.2 -_if__(!_VAX__) -assembler. @refill -_fi__(!_VAX__) -_if__(_VAX__) -assembler, except that @code{_AS__} does not assemble Vax bit-fields. -_fi__(_VAX__) - -@menu -* Pre-processing:: Pre-processing -* Whitespace:: Whitespace -* Comments:: Comments -* Symbol Intro:: Symbols -* Statements:: Statements -* Constants:: Constants -@end menu - -@node Pre-processing, Whitespace, Syntax, Syntax -@section Pre-Processing - -@cindex preprocessing -The pre-processor: -@itemize @bullet -@cindex whitespace, removed by preprocessor -@item -adjusts and removes extra whitespace. It leaves one space or tab before -the keywords on a line, and turns any other whitespace on the line into -a single space. - -@cindex comments, removed by preprocessor -@item -removes all comments, replacing them with a single space, or an -appropriate number of newlines. - -@cindex constants, converted by preprocessor -@item -converts character constants into the appropriate numeric values. -@end itemize - -Excess whitespace, comments, and character constants -cannot be used in the portions of the input text that are not -pre-processed. - -@cindex turning preprocessing on and off -@cindex preprocessing, turning on and off -@kindex #NO_APP -@kindex #APP -If the first line of an input file is @code{#NO_APP} or the @samp{-f} -option is given, the input file will not be pre-processed. Within such -an input file, parts of the file can be pre-processed by putting a line -that says @code{#APP} before the text that should be pre-processed, and -putting a line that says @code{#NO_APP} after them. This feature is -mainly intend to support @code{asm} statements in compilers whose output -normally does not need to be pre-processed. - -@node Whitespace, Comments, Pre-processing, Syntax -@section Whitespace - -@cindex whitespace -@dfn{Whitespace} is one or more blanks or tabs, in any order. -Whitespace is used to separate symbols, and to make programs neater for -people to read. Unless within character constants -(@pxref{Characters,,Character Constants}), any whitespace means the same -as exactly one space. - -@node Comments, Symbol Intro, Whitespace, Syntax -@section Comments - -@cindex comments -There are two ways of rendering comments to @code{_AS__}. In both -cases the comment is equivalent to one space. - -Anything from @samp{/*} through the next @samp{*/} is a comment. -This means you may not nest these comments. - -@smallexample -/* - The only way to include a newline ('\n') in a comment - is to use this sort of comment. -*/ - -/* This sort of comment does not nest. */ -@end smallexample - -@cindex line comment character -Anything from the @dfn{line comment} character to the next newline -is considered a comment and is ignored. The line comment character is -_if__(_VAX__) -@samp{#} on the Vax; -_fi__(_VAX__) -_if__(_I960__) -@samp{#} on the i960; -_fi__(_I960__) -_if__(_M680X0__) -@samp{|} on the 680x0; -_fi__(_M680X0__) -_if__(_A29K__) -@samp{;} for the AMD 29K family; -_fi__(_A29K__) -_if__(_H8__) -@samp{;} for the _HOST__ family; -_fi__(_H8__) -@pxref{_MACH_DEP__}. @refill -@c FIXME: fill in SPARC line comment char - -_if__(_GENERIC__) -On some machines there are two different line comment characters. One -will only begin a comment if it is the first non-whitespace character on -a line, while the other will always begin a comment. -_fi__(_GENERIC__) - -@kindex # -@cindex lines starting with @code{#} -@cindex logical line numbers -To be compatible with past assemblers, a special interpretation is -given to lines that begin with @samp{#}. Following the @samp{#} an -absolute expression (@pxref{Expressions}) is expected: this will be -the logical line number of the @b{next} line. Then a string -(@xref{Strings}.) is allowed: if present it is a new logical file -name. The rest of the line, if any, should be whitespace. - -If the first non-whitespace characters on the line are not numeric, -the line is ignored. (Just like a comment.) -@smallexample - # This is an ordinary comment. -# 42-6 "new_file_name" # New logical file name - # This is logical line # 36. -@end smallexample -This feature is deprecated, and may disappear from future versions -of @code{_AS__}. - -@node Symbol Intro, Statements, Comments, Syntax -@section Symbols - -@cindex symbols -@cindex characters used in symbols -A @dfn{symbol} is one or more characters chosen from the set of all -letters (both upper and lower case), digits and -_if__(!_H8__) -the three characters @samp{_.$} -_fi__(!_H8__) -_if__(_H8__) -the two characters @samp{_.} -_if__(_GENERIC__) -On most machines, you can also use @code{$} in symbol names; exceptions -are noted in @ref{_MACH_DEP__}. -_fi__(_GENERIC__) -_fi__(_H8__) -No symbol may begin with a digit. Case is significant. -There is no length limit: all characters are significant. Symbols are -delimited by characters not in that set, or by the beginning of a file -(since the source program must end with a newline, the end of a file is -not a possible symbol delimiter). @xref{Symbols}. -@cindex length of symbols - -@node Statements, Constants, Symbol Intro, Syntax -@section Statements - -@cindex statements, structure of -@cindex line separator character -@cindex statement separator character -_if__(!_GENERIC__) -_if__(!(_A29K__||_H8__)) -A @dfn{statement} ends at a newline character (@samp{\n}) or at a -semicolon (@samp{;}). The newline or semicolon is considered part of -the preceding statement. Newlines and semicolons within character -constants are an exception: they don't end statements. -_fi__(!(_A29K__||_H8__)) -_if__(_A29K__) -A @dfn{statement} ends at a newline character (@samp{\n}) or an ``at'' -sign (@samp{@@}). The newline or at sign is considered part of the -preceding statement. Newlines and at signs within character constants -are an exception: they don't end statements. -_fi__(_A29K__) -_if__(_H8__) -A @dfn{statement} ends at a newline character (@samp{\n}) or a dollar -sign (@samp{$}). The newline or dollar sign is considered part of the -preceding statement. Newlines and dollar signs within character constants -are an exception: they don't end statements. -_fi__(_H8__) -_fi__(!_GENERIC__) -_if__(_GENERIC__) -A @dfn{statement} ends at a newline character (@samp{\n}) or line -separator character. (The line separator is usually @samp{;}, unless -this conflicts with the comment character; @pxref{_MACH_DEP__}.) The -newline or separator character is considered part of the preceding -statement. Newlines and separators within character constants are an -exception: they don't end statements. -_fi__(_GENERIC__) - -@cindex newline, required at file end -@cindex EOF, newline must precede -It is an error to end any statement with end-of-file: the last -character of any input file should be a newline.@refill - -@cindex continuing statements -@cindex multi-line statements -@cindex statement on multiple lines -You may write a statement on more than one line if you put a -backslash (@kbd{\}) immediately in front of any newlines within the -statement. When @code{_AS__} reads a backslashed newline both -characters are ignored. You can even put backslashed newlines in -the middle of symbol names without changing the meaning of your -source program. - -An empty statement is allowed, and may include whitespace. It is ignored. - -@cindex instructions and directives -@cindex directives and instructions -@c "key symbol" is not used elsewhere in the document; seems pedantic to -@c @defn{} it in that case, as was done previously... pesch@cygnus.com, -@c 13feb91. -A statement begins with zero or more labels, optionally followed by a -key symbol which determines what kind of statement it is. The key -symbol determines the syntax of the rest of the statement. If the -symbol begins with a dot @samp{.} then the statement is an assembler -directive: typically valid for any computer. If the symbol begins with -a letter the statement is an assembly language @dfn{instruction}: it -will assemble into a machine language instruction. -_if__(_GENERIC__) -Different versions of @code{_AS__} for different computers will -recognize different instructions. In fact, the same symbol may -represent a different instruction in a different computer's assembly -language.@refill -_fi__(_GENERIC__) - -@cindex @code{:} (label) -@cindex label (@code{:}) -A label is a symbol immediately followed by a colon (@code{:}). -Whitespace before a label or after a colon is permitted, but you may not -have whitespace between a label's symbol and its colon. @xref{Labels}. - -@smallexample -label: .directive followed by something -another_label: # This is an empty statement. - instruction operand_1, operand_2, @dots{} -@end smallexample - -@node Constants, , Statements, Syntax -@section Constants - -@cindex constants -A constant is a number, written so that its value is known by -inspection, without knowing any context. Like this: -@smallexample -.byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value. -.ascii "Ring the bell\7" # A string constant. -.octa 0x123456789abcdef0123456789ABCDEF0 # A bignum. -.float 0f-314159265358979323846264338327\ -95028841971.693993751E-40 # - pi, a flonum. -@end smallexample - -@menu -* Characters:: Character Constants -* Numbers:: Number Constants -@end menu - -@node Characters, Numbers, Constants, Constants -@subsection Character Constants - -@cindex character constants -@cindex constants, character -There are two kinds of character constants. A @dfn{character} stands -for one character in one byte and its value may be used in -numeric expressions. String constants (properly called string -@emph{literals}) are potentially many bytes and their values may not be -used in arithmetic expressions. - -@menu -* Strings:: Strings -* Chars:: Characters -@end menu - -@node Strings, Chars, Characters, Characters -@subsubsection Strings - -@cindex string constants -@cindex constants, string -A @dfn{string} is written between double-quotes. It may contain -double-quotes or null characters. The way to get special characters -into a string is to @dfn{escape} these characters: precede them with -a backslash @samp{\} character. For example @samp{\\} represents -one backslash: the first @code{\} is an escape which tells -@code{_AS__} to interpret the second character literally as a backslash -(which prevents @code{_AS__} from recognizing the second @code{\} as an -escape character). The complete list of escapes follows. - -@cindex escape codes, character -@cindex character escape codes -@table @kbd -@c @item \a -@c Mnemonic for ACKnowledge; for ASCII this is octal code 007. -@c -@item \b -@cindex @code{\b} (backspace character) -@cindex backspace (@code{\b}) -Mnemonic for backspace; for ASCII this is octal code 010. - -@c @item \e -@c Mnemonic for EOText; for ASCII this is octal code 004. -@c -@item \f -@cindex @code{\f} (formfeed character) -@cindex formfeed (@code{\f}) -Mnemonic for FormFeed; for ASCII this is octal code 014. - -@item \n -@cindex @code{\n} (newline character) -@cindex newline (@code{\n}) -Mnemonic for newline; for ASCII this is octal code 012. - -@c @item \p -@c Mnemonic for prefix; for ASCII this is octal code 033, usually known as @code{escape}. -@c -@item \r -@cindex @code{\r} (carriage return character) -@cindex carriage return (@code{\r}) -Mnemonic for carriage-Return; for ASCII this is octal code 015. - -@c @item \s -@c Mnemonic for space; for ASCII this is octal code 040. Included for compliance with -@c other assemblers. -@c -@item \t -@cindex @code{\t} (tab) -@cindex tab (@code{\t}) -Mnemonic for horizontal Tab; for ASCII this is octal code 011. - -@c @item \v -@c Mnemonic for Vertical tab; for ASCII this is octal code 013. -@c @item \x @var{digit} @var{digit} @var{digit} -@c A hexadecimal character code. The numeric code is 3 hexadecimal digits. -@c -@item \ @var{digit} @var{digit} @var{digit} -@cindex @code{\@var{ddd}} (octal character code) -@cindex octal character code (@code{\@var{ddd}}) -An octal character code. The numeric code is 3 octal digits. -For compatibility with other Unix systems, 8 and 9 are accepted as digits: -for example, @code{\008} has the value 010, and @code{\009} the value 011. - -@item \\ -@cindex @code{\\} (@samp{\} character) -@cindex backslash (@code{\\}) -Represents one @samp{\} character. - -@c @item \' -@c Represents one @samp{'} (accent acute) character. -@c This is needed in single character literals -@c (@xref{Characters,,Character Constants}.) to represent -@c a @samp{'}. -@c -@item \" -@cindex @code{\"} (doublequote character) -@cindex doublequote (@code{\"}) -Represents one @samp{"} character. Needed in strings to represent -this character, because an unescaped @samp{"} would end the string. - -@item \ @var{anything-else} -Any other character when escaped by @kbd{\} will give a warning, but -assemble as if the @samp{\} was not present. The idea is that if -you used an escape sequence you clearly didn't want the literal -interpretation of the following character. However @code{_AS__} has no -other interpretation, so @code{_AS__} knows it is giving you the wrong -code and warns you of the fact. -@end table - -Which characters are escapable, and what those escapes represent, -varies widely among assemblers. The current set is what we think -the BSD 4.2 assembler recognizes, and is a subset of what most C -compilers recognize. If you are in doubt, don't use an escape -sequence. - -@node Chars, , Strings, Characters -@subsubsection Characters - -@cindex single character constant -@cindex character, single -@cindex constant, single character -A single character may be written as a single quote immediately -followed by that character. The same escapes apply to characters as -to strings. So if you want to write the character backslash, you -must write @kbd{'\\} where the first @code{\} escapes the second -@code{\}. As you can see, the quote is an acute accent, not a -grave accent. A newline -_if__(!_GENERIC__) -_if__(!(_A29K__||_H8__)) -(or semicolon @samp{;}) -_fi__(!(_A29K__||_H8__)) -_if__(_A29K__) -(or at sign @samp{@@}) -_fi__(_A29K__) -_if__(_H8__) -(or dollar sign @samp{$}) -_fi__(_H8__) -_fi__(!_GENERIC__) -immediately following an acute accent is taken as a literal character -and does not count as the end of a statement. The value of a character -constant in a numeric expression is the machine's byte-wide code for -that character. @code{_AS__} assumes your character code is ASCII: -@kbd{'A} means 65, @kbd{'B} means 66, and so on. @refill - -@node Numbers, , Characters, Constants -@subsection Number Constants - -@cindex constants, number -@cindex number constants -@code{_AS__} distinguishes three kinds of numbers according to how they -are stored in the target machine. @emph{Integers} are numbers that -would fit into an @code{int} in the C language. @emph{Bignums} are -integers, but they are stored in more than 32 bits. @emph{Flonums} -are floating point numbers, described below. - -@menu -* Integers:: Integers -* Bignums:: Bignums -* Flonums:: Flonums -_if__(_I960__&&!_GENERIC__) -* Bit Fields:: Bit Fields -_fi__(_I960__&&!_GENERIC__) -@end menu - -@node Integers, Bignums, Numbers, Numbers -@subsubsection Integers -@cindex integers -@cindex constants, integer - -@cindex binary integers -@cindex integers, binary -A binary integer is @samp{0b} or @samp{0B} followed by zero or more of -the binary digits @samp{01}. - -@cindex octal integers -@cindex integers, octal -An octal integer is @samp{0} followed by zero or more of the octal -digits (@samp{01234567}). - -@cindex decimal integers -@cindex integers, decimal -A decimal integer starts with a non-zero digit followed by zero or -more digits (@samp{0123456789}). - -@cindex hexadecimal integers -@cindex integers, hexadecimal -A hexadecimal integer is @samp{0x} or @samp{0X} followed by one or -more hexadecimal digits chosen from @samp{0123456789abcdefABCDEF}. - -Integers have the usual values. To denote a negative integer, use -the prefix operator @samp{-} discussed under expressions -(@pxref{Prefix Ops,,Prefix Operators}). - -@node Bignums, Flonums, Integers, Numbers -@subsubsection Bignums - -@cindex bignums -@cindex constants, bignum -A @dfn{bignum} has the same syntax and semantics as an integer -except that the number (or its negative) takes more than 32 bits to -represent in binary. The distinction is made because in some places -integers are permitted while bignums are not. - -_if__(_I960__&&!_GENERIC__) -@node Flonums, Bit Fields, Bignums, Numbers -_fi__(_I960__&&!_GENERIC__) -_if__(_GENERIC__||!_I960__) -@node Flonums, , Bignums, Numbers -_fi__(_GENERIC__||!_I960__) -@subsubsection Flonums -@cindex flonums -@cindex floating point numbers -@cindex constants, floating point - -@cindex precision, floating point -A @dfn{flonum} represents a floating point number. The translation is -indirect: a decimal floating point number from the text is converted by -@code{_AS__} to a generic binary floating point number of more than -sufficient precision. This generic floating point number is converted -to a particular computer's floating point format (or formats) by a -portion of @code{_AS__} specialized to that computer. - -A flonum is written by writing (in order) -@itemize @bullet -@item -The digit @samp{0}. -@item -A letter, to tell @code{_AS__} the rest of the number is a flonum. -_if__(_GENERIC__) -@kbd{e} is recommended. Case is not important. -@ignore -@c FIXME: verify if flonum syntax really this vague for most cases - (Any otherwise illegal letter -will work here, but that might be changed. Vax BSD 4.2 assembler seems -to allow any of @samp{defghDEFGH}.) -@end ignore -_fi__(_GENERIC__) -_if__(_A29K__||_H8__) -_if__(_GENERIC__) -On the AMD 29K and H8/300 architectures, the letter must be: -_fi__(_GENERIC__) -One of the letters @samp{DFPRSX} (in upper or lower case). -_fi__(_A29K__||_H8__) -_if__(_I960__) -_if__(_GENERIC__) -On the Intel 960 architecture, the letter must be: -_fi__(_GENERIC__) -One of the letters @samp{DFT} (in upper or lower case). -_fi__(_I960__) -@item -An optional sign: either @samp{+} or @samp{-}. -@item -An optional @dfn{integer part}: zero or more decimal digits. -@item -An optional @dfn{fractional part}: @samp{.} followed by zero -or more decimal digits. -@item -An optional exponent, consisting of: -@itemize @bullet -@item -An @samp{E} or @samp{e}. -@c I can't find a config where "EXP_CHARS" is other than 'eE', but in -@c principle this can perfectly well be different on different targets. -@item -Optional sign: either @samp{+} or @samp{-}. -@item -One or more decimal digits. -@end itemize -@end itemize - -At least one of the integer part or the fractional part must be -present. The floating point number has the usual base-10 value. - -@code{_AS__} does all processing using integers. Flonums are computed -independently of any floating point hardware in the computer running -@code{_AS__}. - -_if__(_I960__&&!_GENERIC__) -@c Bit fields are written as a general facility but are also controlled -@c by a conditional-compilation flag---which is as of now (21mar91) -@c turned on only by the i960 config of GAS. -@node Bit Fields, , Flonums, Numbers -@subsubsection Bit Fields - -@cindex bit fields -@cindex constants, bit field -You can also define numeric constants as @dfn{bit fields}. -specify two numbers separated by a colon--- -@example -@var{mask}:@var{value} -@end example -@noindent -the first will act as a mask; @code{_AS__} will bitwise-and it with the -second value. - -The resulting number is then packed -_if__(_GENERIC__) -@c this conditional paren in case bit fields turned on elsewhere than 960 -(in host-dependent byte order) -_fi__(_GENERIC__) -into a field whose width depends on which assembler directive has the -bit-field as its argument. Overflow (a result from the bitwise and -requiring more binary digits to represent) is not an error; instead, -more constants are generated, of the specified width, beginning with the -least significant digits.@refill - -The directives @code{.byte}, @code{.hword}, @code{.int}, @code{.long}, -@code{.short}, and @code{.word} accept bit-field arguments. -_fi__(_I960__&&!_GENERIC__) - -@node Sections, Symbols, Syntax, Top -@chapter Sections and Relocation -@cindex sections -@cindex relocation - -@menu -* Secs Background:: Background -* _LD__ Sections:: _LD__ Sections -* _AS__ Sections:: _AS__ Internal Sections -* Sub-Sections:: Sub-Sections -* bss:: bss Section -@end menu - -@node Secs Background, _LD__ Sections, Sections, Sections -@section Background - -Roughly, a section is a range of addresses, with no gaps; all data -``in'' those addresses is treated the same for some particular purpose. -For example there may be a ``read only'' section. - -@cindex linker, and assembler -@cindex assembler, and linker -The linker @code{_LD__} reads many object files (partial programs) and -combines their contents to form a runnable program. When @code{_AS__} -emits an object file, the partial program is assumed to start at address -0. @code{_LD__} will assign the final addresses the partial program -occupies, so that different partial programs don't overlap. This is -actually an over-simplification, but it will suffice to explain how -@code{_AS__} uses sections. - -@code{_LD__} moves blocks of bytes of your program to their run-time -addresses. These blocks slide to their run-time addresses as rigid -units; their length does not change and neither does the order of bytes -within them. Such a rigid unit is called a @emph{section}. Assigning -run-time addresses to sections is called @dfn{relocation}. It includes -the task of adjusting mentions of object-file addresses so they refer to -the proper run-time addresses. -_if__(_H8__) -For the H8/300, @code{_AS__} pads sections if needed to ensure they end -on a word (sixteen bit) boundary. -_fi__(_H8__) - -@cindex standard @code{_AS__} sections -An object file written by @code{_AS__} has at least three sections, any -of which may be empty. These are named @dfn{text}, @dfn{data} and -@dfn{bss} sections. - -_if__(_COFF__) -_if__(_GENERIC__) -When it generates COFF output, -_fi__(_GENERIC__) -@code{_AS__} can also generate whatever other named sections you specify -using the @samp{.section} directive (@pxref{Section,,@code{.section}}). -If you don't use any directives that place output in the @samp{.text} -or @samp{.data} sections, these sections will still exist, but will be empty. -_fi__(_COFF__) - -Within the object file, the text section starts at address @code{0}, the -data section follows, and the bss section follows the data section. - -To let @code{_LD__} know which data will change when the sections are -relocated, and how to change that data, @code{_AS__} also writes to the -object file details of the relocation needed. To perform relocation -@code{_LD__} must know, each time an address in the object -file is mentioned: -@itemize @bullet -@item -Where in the object file is the beginning of this reference to -an address? -@item -How long (in bytes) is this reference? -@item -Which section does the address refer to? What is the numeric value of -@display -(@var{address}) @minus{} (@var{start-address of section})? -@end display -@item -Is the reference to an address ``Program-Counter relative''? -@end itemize - -@cindex addresses, format of -@cindex section-relative addressing -In fact, every address @code{_AS__} ever uses is expressed as -@display -(@var{section}) + (@var{offset into section}) -@end display -@noindent -Further, every expression @code{_AS__} computes is of this section-relative -nature. @dfn{Absolute expression} means an expression with section -``absolute'' (@pxref{_LD__ Sections}). A @dfn{pass1 expression} means -an expression with section ``pass1'' (@pxref{_AS__ Sections,,_AS__ -Internal Sections}). In this manual we use the notation @{@var{secname} -@var{N}@} to mean ``offset @var{N} into section @var{secname}''. - -Apart from text, data and bss sections you need to know about the -@dfn{absolute} section. When @code{_LD__} mixes partial programs, -addresses in the absolute section remain unchanged. For example, address -@code{@{absolute 0@}} is ``relocated'' to run-time address 0 by @code{_LD__}. -Although two partial programs' data sections will not overlap addresses -after linking, @emph{by definition} their absolute sections will overlap. -Address @code{@{absolute@ 239@}} in one partial program will always be the same -address when the program is running as address @code{@{absolute@ 239@}} in any -other partial program. - -The idea of sections is extended to the @dfn{undefined} section. Any -address whose section is unknown at assembly time is by definition -rendered @{undefined @var{U}@}---where @var{U} will be filled in later. -Since numbers are always defined, the only way to generate an undefined -address is to mention an undefined symbol. A reference to a named -common block would be such a symbol: its value is unknown at assembly -time so it has section @emph{undefined}. - -By analogy the word @emph{section} is used to describe groups of sections in -the linked program. @code{_LD__} puts all partial programs' text -sections in contiguous addresses in the linked program. It is -customary to refer to the @emph{text section} of a program, meaning all -the addresses of all partial program's text sections. Likewise for -data and bss sections. - -Some sections are manipulated by @code{_LD__}; others are invented for -use of @code{_AS__} and have no meaning except during assembly. - -@node _LD__ Sections, _AS__ Sections, Secs Background, Sections -@section _LD__ Sections -@code{_LD__} deals with just four kinds of sections, summarized below. - -@table @strong - -_if__(_GENERIC__||_COFF__) -@cindex named sections -@cindex sections, named -@item named sections -_fi__(_GENERIC__||_COFF__) -_if__(_AOUT__||_BOUT__) -@cindex text section -@cindex data section -@item text section -@itemx data section -_fi__(_AOUT__||_BOUT__) -These sections hold your program. @code{_AS__} and @code{_LD__} treat them as -separate but equal sections. Anything you can say of one section is -true another. -_if__(_AOUT__||_BOUT__) -When the program is running, however, it is -customary for the text section to be unalterable. The -text section is often shared among processes: it will contain -instructions, constants and the like. The data section of a running -program is usually alterable: for example, C variables would be stored -in the data section. -_fi__(_AOUT__||_BOUT__) - -@cindex bss section -@item bss section -This section contains zeroed bytes when your program begins running. It -is used to hold unitialized variables or common storage. The length of -each partial program's bss section is important, but because it starts -out containing zeroed bytes there is no need to store explicit zero -bytes in the object file. The bss section was invented to eliminate -those explicit zeros from object files. - -@cindex absolute section -@item absolute section -Address 0 of this section is always ``relocated'' to runtime address 0. -This is useful if you want to refer to an address that @code{_LD__} must -not change when relocating. In this sense we speak of absolute -addresses being ``unrelocatable'': they don't change during relocation. - -@cindex undefined section -@item undefined section -This ``section'' is a catch-all for address references to objects not in -the preceding sections. -@c FIXME: ref to some other doc on obj-file formats could go here. -@end table - -@cindex relocation example -An idealized example of three relocatable sections follows. -_if__(_COFF__) -The example uses the traditional section names @samp{.text} and @samp{.data}. -_fi__(_COFF__) -Memory addresses are on the horizontal axis. - -@c TEXI2ROFF-KILL -@ifinfo -@c END TEXI2ROFF-KILL -@smallexample - +-----+----+--+ -partial program # 1: |ttttt|dddd|00| - +-----+----+--+ - - text data bss - seg. seg. seg. - - +---+---+---+ -partial program # 2: |TTT|DDD|000| - +---+---+---+ - - +--+---+-----+--+----+---+-----+~~ -linked program: | |TTT|ttttt| |dddd|DDD|00000| - +--+---+-----+--+----+---+-----+~~ - - addresses: 0 @dots{} -@end smallexample -@c TEXI2ROFF-KILL -@end ifinfo -@c FIXME make sure no page breaks inside figure!! -@tex - -\line{\it Partial program \#1: \hfil} -\line{\ibox{2.5cm}{\tt text}\ibox{2cm}{\tt data}\ibox{1cm}{\tt bss}\hfil} -\line{\boxit{2.5cm}{\tt ttttt}\boxit{2cm}{\tt dddd}\boxit{1cm}{\tt 00}\hfil} - -\line{\it Partial program \#2: \hfil} -\line{\ibox{1cm}{\tt text}\ibox{1.5cm}{\tt data}\ibox{1cm}{\tt bss}\hfil} -\line{\boxit{1cm}{\tt TTT}\boxit{1.5cm}{\tt DDDD}\boxit{1cm}{\tt 000}\hfil} - -\line{\it linked program: \hfil} -\line{\ibox{.5cm}{}\ibox{1cm}{\tt text}\ibox{2.5cm}{}\ibox{.75cm}{}\ibox{2cm}{\tt data}\ibox{1.5cm}{}\ibox{2cm}{\tt bss}\hfil} -\line{\boxit{.5cm}{}\boxit{1cm}{\tt TTT}\boxit{2.5cm}{\tt -ttttt}\boxit{.75cm}{}\boxit{2cm}{\tt dddd}\boxit{1.5cm}{\tt -DDDD}\boxit{2cm}{\tt 00000}\ \dots\hfil} - -\line{\it addresses: \hfil} -\line{0\dots\hfil} - -@end tex -@c END TEXI2ROFF-KILL - -@node _AS__ Sections, Sub-Sections, _LD__ Sections, Sections -@section _AS__ Internal Sections - -@cindex internal @code{_AS__} sections -@cindex sections in messages, internal -These sections are meant only for the internal use of @code{_AS__}. They -have no meaning at run-time. You don't really need to know about these -sections for most purposes; but they can be mentioned in @code{_AS__} -warning messages, so it might be helpful to have an idea of their -meanings to @code{_AS__}. These sections are used to permit the -value of every expression in your assembly language program to be a -section-relative address. - -@table @b -@item absent -@cindex absent (internal section) -An expression was expected and none was found. - -@item ASSEMBLER-INTERNAL-LOGIC-ERROR! -@cindex assembler internal logic error -An internal assembler logic error has been found. This means there is a -bug in the assembler. - -@item bignum/flonum -@cindex bignum/flonum (internal section) -If a number can't be written as a C @code{int} constant (a bignum or a -flonum, but not an integer), it is recorded as belonging to this -``section''. @code{_AS__} has to remember that a flonum or a bignum -does not fit into 32 bits, and cannot be an argument (@pxref{Arguments}) -in an expression: this is done by making a flonum or bignum be in a -separate internal section. This is purely for internal @code{_AS__} -convenience; bignum/flonum section behaves similarly to absolute -section. - -@item pass1 section -@cindex pass1 (internal section) -The expression was impossible to evaluate in the first pass. The -assembler will attempt a second pass (second reading of the source) to -evaluate the expression. Your expression mentioned an undefined symbol -in a way that defies the one-pass (section + offset in section) assembly -process. No compiler need emit such an expression. - -@quotation -@emph{Warning:} the second pass is currently not implemented. @code{_AS__} -will abort with an error message if one is required. -@end quotation - -@item difference section -@cindex difference (internal section) -As an assist to the C compiler, expressions of the forms -@display - (@var{undefined symbol}) @minus{} (@var{expression}) - @var{something} @minus{} (@var{undefined symbol}) - (@var{undefined symbol}) @minus{} (@var{undefined symbol}) -@end display - -are permitted, and belong to the difference section. @code{_AS__} -re-evaluates such expressions after the source file has been read and -the symbol table built. If by that time there are no undefined symbols -in the expression then the expression assumes a new section. The -intention is to permit statements like -@samp{.word label - base_of_table} -to be assembled in one pass where both @code{label} and -@code{base_of_table} are undefined. This is useful for compiling C and -Algol switch statements, Pascal case statements, FORTRAN computed goto -statements and the like. -@c FIXME item debug -@c FIXME item transfer[t] vector preload -@c FIXME item transfer[t] vector postload -@c FIXME item register -@end table - -@node Sub-Sections, bss, _AS__ Sections, Sections -@section Sub-Sections - -@cindex numbered subsections -@cindex grouping data -_if__(_AOUT__||_BOUT__) -Assembled bytes -_if__(_COFF__) -conventionally -_fi__(_COFF__) -fall into two sections: text and data. -_fi__(_AOUT__||_BOUT__) -You may have separate groups of -_if__(_COFF__||_GENERIC__) -data in named sections -_fi__(_COFF__||_GENERIC__) -_if__((_AOUT__||_BOUT__)&&!_GENERIC__) -text or data -_fi__((_AOUT__||_BOUT__)&&!_GENERIC__) -that you want to end up near to each other in the object -file, even though they are not contiguous in the assembler source. -@code{_AS__} allows you to use @dfn{subsections} for this purpose. -Within each section, there can be numbered subsections with -values from 0 to 8192. Objects assembled into the same subsection will -be grouped with other objects in the same subsection when they are all -put into the object file. For example, a compiler might want to store -constants in the text section, but might not want to have them -interspersed with the program being assembled. In this case, the -compiler could issue a @samp{.text 0} before each section of code being -output, and a @samp{.text 1} before each group of constants being output. - -Subsections are optional. If you don't use subsections, everything -will be stored in subsection number zero. - -_if__(_GENERIC__) -Each subsection is zero-padded up to a multiple of four bytes. -(Subsections may be padded a different amount on different flavors -of @code{_AS__}.) -_fi__(_GENERIC__) -_if__(!_GENERIC__) -_if__(_H8__) -On the H8/300 platform, each subsection is zero-padded to a word -boundary (two bytes). -_fi__(_H8__) -_if__(_I960__) -@c FIXME section padding (alignment)? -@c Rich Pixley says padding here depends on target obj code format; that -@c doesn't seem particularly useful to say without further elaboration, -@c so for now I say nothing about it. If this is a generic BFD issue, -@c these paragraphs might need to vanish from this manual, and be -@c discussed in BFD chapter of binutils (or some such). -_fi__(_I960__) -_if__(_A29K__) -On the AMD 29K family, no particular padding is added to section or -subsection sizes; _AS__ forces no alignment on this platform. -_fi__(_A29K__) -_fi__(!_GENERIC__) - -Subsections appear in your object file in numeric order, lowest numbered -to highest. (All this to be compatible with other people's assemblers.) -The object file contains no representation of subsections; @code{_LD__} and -other programs that manipulate object files will see no trace of them. -They just see all your text subsections as a text section, and all your -data subsections as a data section. - -To specify which subsection you want subsequent statements assembled -into, use a numeric argument to specify it, in a @samp{.text -@var{expression}} or a @samp{.data @var{expression}} statement. -_if__(_COFF__) -_if__(_GENERIC__) -When generating COFF output, you -_fi__(_GENERIC__) -_if__(!_GENERIC__) -You -_fi__(!_GENERIC__) -can also use an extra subsection -argument with arbitrary named sections: @samp{.section @var{name}, -@var{expression}}. -_fi__(_COFF__) -@var{Expression} should be an absolute expression. -(@xref{Expressions}.) If you just say @samp{.text} then @samp{.text 0} -is assumed. Likewise @samp{.data} means @samp{.data 0}. Assembly -begins in @code{text 0}. For instance: -@smallexample -.text 0 # The default subsection is text 0 anyway. -.ascii "This lives in the first text subsection. *" -.text 1 -.ascii "But this lives in the second text subsection." -.data 0 -.ascii "This lives in the data section," -.ascii "in the first data subsection." -.text 0 -.ascii "This lives in the first text section," -.ascii "immediately following the asterisk (*)." -@end smallexample - -Each section has a @dfn{location counter} incremented by one for every -byte assembled into that section. Because subsections are merely a -convenience restricted to @code{_AS__} there is no concept of a subsection -location counter. There is no way to directly manipulate a location -counter---but the @code{.align} directive will change it, and any label -definition will capture its current value. The location counter of the -section that statements are being assembled into is said to be the -@dfn{active} location counter. - -@node bss, , Sub-Sections, Sections -@section bss Section - -@cindex bss section -@cindex common variable storage -The bss section is used for local common variable storage. -You may allocate address space in the bss section, but you may -not dictate data to load into it before your program executes. When -your program starts running, all the contents of the bss -section are zeroed bytes. - -Addresses in the bss section are allocated with special directives; you -may not assemble anything directly into the bss section. Hence there -are no bss subsections. @xref{Comm,,@code{.comm}}, -@pxref{Lcomm,,@code{.lcomm}}. - -@node Symbols, Expressions, Sections, Top -@chapter Symbols - -@cindex symbols -Symbols are a central concept: the programmer uses symbols to name -things, the linker uses symbols to link, and the debugger uses symbols -to debug. - -@quotation -@cindex debuggers, and symbol order -@emph{Warning:} @code{_AS__} does not place symbols in the object file in -the same order they were declared. This may break some debuggers. -@end quotation - -@menu -* Labels:: Labels -* Setting Symbols:: Giving Symbols Other Values -* Symbol Names:: Symbol Names -* Dot:: The Special Dot Symbol -* Symbol Attributes:: Symbol Attributes -@end menu - -@node Labels, Setting Symbols, Symbols, Symbols -@section Labels - -@cindex labels -A @dfn{label} is written as a symbol immediately followed by a colon -@samp{:}. The symbol then represents the current value of the -active location counter, and is, for example, a suitable instruction -operand. You are warned if you use the same symbol to represent two -different locations: the first definition overrides any other -definitions. - -@node Setting Symbols, Symbol Names, Labels, Symbols -@section Giving Symbols Other Values - -@cindex assigning values to symbols -@cindex symbol values, assigning -A symbol can be given an arbitrary value by writing a symbol, followed -by an equals sign @samp{=}, followed by an expression -(@pxref{Expressions}). This is equivalent to using the @code{.set} -directive. @xref{Set,,@code{.set}}. - -@node Symbol Names, Dot, Setting Symbols, Symbols -@section Symbol Names - -@cindex symbol names -@cindex names, symbol -Symbol names begin with a letter or with one of -_if__(!_H8__) -@samp{_.$} -_fi__(!_H8__) -_if__(_H8__) -@samp{_.} -_if__(_GENERIC__) -(On most machines, you can also use @code{$} in symbol names; exceptions -are noted in @ref{_MACH_DEP__}.) -_fi__(_GENERIC__) -_fi__(_H8__) -That character may be followed by any string of digits, letters, -_if__(!_H8__) -underscores and dollar signs. -_fi__(!_H8__) -_if__(_H8__) -_if__(_GENERIC__) -dollar signs (unless otherwise noted in @ref{_MACH_DEP__}), -_fi__(_GENERIC__) -and underscores. -_fi__(_H8__) -Case of letters is significant: -@code{foo} is a different symbol name than @code{Foo}. - -_if__(_A29K__) -For the AMD 29K family, @samp{?} is also allowed in the -body of a symbol name, though not at its beginning. -_fi__(_A29K__) - -Each symbol has exactly one name. Each name in an assembly language -program refers to exactly one symbol. You may use that symbol name any -number of times in a program. - -@subheading Local Symbol Names - -@cindex local symbol names -@cindex symbol names, local -@cindex temporary symbol names -@cindex symbol names, temporary -Local symbols help compilers and programmers use names temporarily. -There are ten local symbol names, which are re-used throughout the -program. You may refer to them using the names @samp{0} @samp{1} -@dots{} @samp{9}. To define a local symbol, write a label of the form -@samp{@b{N}:} (where @b{N} represents any digit). To refer to the most -recent previous definition of that symbol write @samp{@b{N}b}, using the -same digit as when you defined the label. To refer to the next -definition of a local label, write @samp{@b{N}f}---where @b{N} gives you -a choice of 10 forward references. The @samp{b} stands for -``backwards'' and the @samp{f} stands for ``forwards''. - -Local symbols are not emitted by the current GNU C compiler. - -There is no restriction on how you can use these labels, but -remember that at any point in the assembly you can refer to at most -10 prior local labels and to at most 10 forward local labels. - -Local symbol names are only a notation device. They are immediately -transformed into more conventional symbol names before the assembler -uses them. The symbol names stored in the symbol table, appearing in -error messages and optionally emitted to the object file have these -parts: - -@table @code -@item L -All local labels begin with @samp{L}. Normally both @code{_AS__} and -@code{_LD__} forget symbols that start with @samp{L}. These labels are -used for symbols you are never intended to see. If you give the -@samp{-L} option then @code{_AS__} will retain these symbols in the -object file. If you also instruct @code{_LD__} to retain these symbols, -you may use them in debugging. - -@item @var{digit} -If the label is written @samp{0:} then the digit is @samp{0}. -If the label is written @samp{1:} then the digit is @samp{1}. -And so on up through @samp{9:}. - -@item @ctrl{A} -This unusual character is included so you don't accidentally invent -a symbol of the same name. The character has ASCII value -@samp{\001}. - -@item @emph{ordinal number} -This is a serial number to keep the labels distinct. The first -@samp{0:} gets the number @samp{1}; The 15th @samp{0:} gets the -number @samp{15}; @emph{etc.}. Likewise for the other labels @samp{1:} -through @samp{9:}. -@end table - -For instance, the first @code{1:} is named @code{L1@ctrl{A}1}, the 44th -@code{3:} is named @code{L3@ctrl{A}44}. - -@node Dot, Symbol Attributes, Symbol Names, Symbols -@section The Special Dot Symbol - -@cindex dot (symbol) -@cindex @code{.} (symbol) -@cindex current address -@cindex location counter -The special symbol @samp{.} refers to the current address that -@code{_AS__} is assembling into. Thus, the expression @samp{melvin: -.long .} will cause @code{melvin} to contain its own address. -Assigning a value to @code{.} is treated the same as a @code{.org} -directive. Thus, the expression @samp{.=.+4} is the same as saying -_if__(!_A29K__) -@samp{.space 4}. -_fi__(!_A29K__) -_if__(_A29K__) -@samp{.block 4}. -_fi__(_A29K__) - -@node Symbol Attributes, , Dot, Symbols -@section Symbol Attributes - -@cindex symbol attributes -@cindex attributes, symbol -Every symbol has, as well as its name, the attributes ``Value'' and -``Type''. Depending on output format, symbols can also have auxiliary -attributes. -_if__(_INTERNALS__) -The detailed definitions are in _0__<a.out.h>_1__. -_fi__(_INTERNALS__) - -If you use a symbol without defining it, @code{_AS__} assumes zero for -all these attributes, and probably won't warn you. This makes the -symbol an externally defined symbol, which is generally what you -would want. - -@menu -* Symbol Value:: Value -* Symbol Type:: Type -_if__(_AOUT__||_BOUT__) -_if__(_GENERIC__||!_BOUT__) -* a.out Symbols:: Symbol Attributes: @code{a.out} -_fi__(_GENERIC__||!_BOUT__) -_if__(_BOUT__&&!_GENERIC__) -* a.out Symbols:: Symbol Attributes: @code{a.out}, @code{b.out} -_fi__(_BOUT__&&!_GENERIC__) -_fi__(_AOUT__||_BOUT__) -_if__(_COFF__) -* COFF Symbols:: Symbol Attributes for COFF -_fi__(_COFF__) -@end menu - -@node Symbol Value, Symbol Type, Symbol Attributes, Symbol Attributes -@subsection Value - -@cindex value of a symbol -@cindex symbol value -The value of a symbol is (usually) 32 bits. For a symbol which labels a -location in the text, data, bss or absolute sections the value is the -number of addresses from the start of that section to the label. -Naturally for text, data and bss sections the value of a symbol changes -as @code{_LD__} changes section base addresses during linking. Absolute -symbols' values do not change during linking: that is why they are -called absolute. - -The value of an undefined symbol is treated in a special way. If it is -0 then the symbol is not defined in this assembler source program, and -@code{_LD__} will try to determine its value from other programs it is -linked with. You make this kind of symbol simply by mentioning a symbol -name without defining it. A non-zero value represents a @code{.comm} -common declaration. The value is how much common storage to reserve, in -bytes (addresses). The symbol refers to the first address of the -allocated storage. - -_if__(!(_AOUT__||_BOUT__)) -@node Symbol Type, COFF Symbols, Symbol Value, Symbol Attributes -_fi__(!(_AOUT__||_BOUT__)) -_if__((_AOUT__||_BOUT__)) -@node Symbol Type, a.out Symbols, Symbol Value, Symbol Attributes -_fi__((_AOUT__||_BOUT__)) -@subsection Type - -@cindex type of a symbol -@cindex symbol type -The type attribute of a symbol contains relocation (section) -information, any flag settings indicating that a symbol is external, and -(optionally), other information for linkers and debuggers. The exact -format depends on the object-code output format in use. - -_if__(_AOUT__||_BOUT__) -_if__(_COFF__) -@node a.out Symbols, COFF Symbols, Symbol Type, Symbol Attributes -_fi__(_COFF__) -_if__(!_COFF__) -@node a.out Symbols, , Symbol Type, Symbol Attributes -_fi__(!_COFF__) -_if__(_BOUT__&&!_GENERIC__) -@subsection Symbol Attributes: @code{a.out}, @code{b.out} - -@cindex @code{b.out} symbol attributes -@cindex symbol attributes, @code{b.out} -These symbol attributes appear only when @code{_AS__} is configured for -one of the Berkeley-descended object output formats. -_fi__(_BOUT__&&!_GENERIC__) -_if__(_GENERIC__||!_BOUT__) -@subsection Symbol Attributes: @code{a.out} -_fi__(_GENERIC__||!_BOUT__) - -@cindex @code{a.out} symbol attributes -@cindex symbol attributes, @code{a.out} - -@menu -* Symbol Desc:: Descriptor -* Symbol Other:: Other -@end menu - -@node Symbol Desc, Symbol Other, a.out Symbols, a.out Symbols -@subsubsection Descriptor - -@cindex descriptor, of @code{a.out} symbol -This is an arbitrary 16-bit value. You may establish a symbol's -descriptor value by using a @code{.desc} statement -(@pxref{Desc,,@code{.desc}}). A descriptor value means nothing to -@code{_AS__}. - -@node Symbol Other, , Symbol Desc, a.out Symbols -@subsubsection Other - -@cindex other attribute, of @code{a.out} symbol -This is an arbitrary 8-bit value. It means nothing to @code{_AS__}. -_fi__(_AOUT__||_BOUT__) - -_if__(_COFF__) -_if__(!(_AOUT__||_BOUT__)) -@node COFF Symbols, , Symbol Type, Symbol Attributes -_fi__(!(_AOUT__||_BOUT__)) -_if__(_AOUT__||_BOUT__) -@node COFF Symbols, , a.out Symbols, Symbol Attributes -_fi__(_AOUT__||_BOUT__) -@subsection Symbol Attributes for COFF - -@cindex COFF symbol attributes -@cindex symbol attributes, COFF - -The COFF format supports a multitude of auxiliary symbol attributes; -like the primary symbol attributes, they are set between @code{.def} and -@code{.endef} directives. - -@subsubsection Primary Attributes - -@cindex primary attributes, COFF symbols -The symbol name is set with @code{.def}; the value and type, -respectively, with @code{.val} and @code{.type}. - -@subsubsection Auxiliary Attributes - -@cindex auxiliary attributes, COFF symbols -The @code{_AS__} directives @code{.dim}, @code{.line}, @code{.scl}, -@code{.size}, and @code{.tag} can generate auxiliary symbol table -information for COFF. -_fi__(_COFF__) - -@node Expressions, Pseudo Ops, Symbols, Top -@chapter Expressions - -@cindex expressions -@cindex addresses -@cindex numeric values -An @dfn{expression} specifies an address or numeric value. -Whitespace may precede and/or follow an expression. - -@menu -* Empty Exprs:: Empty Expressions -* Integer Exprs:: Integer Expressions -@end menu - -@node Empty Exprs, Integer Exprs, Expressions, Expressions -@section Empty Expressions - -@cindex empty expressions -@cindex expressions, empty -An empty expression has no value: it is just whitespace or null. -Wherever an absolute expression is required, you may omit the -expression and @code{_AS__} will assume a value of (absolute) 0. This -is compatible with other assemblers. - -@node Integer Exprs, , Empty Exprs, Expressions -@section Integer Expressions - -@cindex integer expressions -@cindex expressions, integer -An @dfn{integer expression} is one or more @emph{arguments} delimited -by @emph{operators}. - -@menu -* Arguments:: Arguments -* Operators:: Operators -* Prefix Ops:: Prefix Operators -* Infix Ops:: Infix Operators -@end menu - -@node Arguments, Operators, Integer Exprs, Integer Exprs -@subsection Arguments - -@cindex expression arguments -@cindex arguments in expressions -@cindex operands in expressions -@cindex arithmetic operands -@dfn{Arguments} are symbols, numbers or subexpressions. In other -contexts arguments are sometimes called ``arithmetic operands''. In -this manual, to avoid confusing them with the ``instruction operands'' of -the machine language, we use the term ``argument'' to refer to parts of -expressions only, reserving the word ``operand'' to refer only to machine -instruction operands. - -Symbols are evaluated to yield @{@var{section} @var{NNN}@} where -@var{section} is one of text, data, bss, absolute, -or undefined. @var{NNN} is a signed, 2's complement 32 bit -integer. - -Numbers are usually integers. - -A number can be a flonum or bignum. In this case, you are warned -that only the low order 32 bits are used, and @code{_AS__} pretends -these 32 bits are an integer. You may write integer-manipulating -instructions that act on exotic constants, compatible with other -assemblers. - -@cindex subexpressions -Subexpressions are a left parenthesis @samp{(} followed by an integer -expression, followed by a right parenthesis @samp{)}; or a prefix -operator followed by an argument. - -@node Operators, Prefix Ops, Arguments, Integer Exprs -@subsection Operators - -@cindex operators, in expressions -@cindex arithmetic functions -@cindex functions, in expressions -@dfn{Operators} are arithmetic functions, like @code{+} or @code{%}. Prefix -operators are followed by an argument. Infix operators appear -between their arguments. Operators may be preceded and/or followed by -whitespace. - -@node Prefix Ops, Infix Ops, Operators, Integer Exprs -@subsection Prefix Operator - -@cindex prefix operators -@code{_AS__} has the following @dfn{prefix operators}. They each take -one argument, which must be absolute. - -@c the tex/end tex stuff surrounding this small table is meant to make -@c it align, on the printed page, with the similar table in the next -@c section (which is inside an enumerate). -@tex -\global\advance\leftskip by \itemindent -@end tex - -@table @code -@item - -@dfn{Negation}. Two's complement negation. -@item ~ -@dfn{Complementation}. Bitwise not. -@end table - -@tex -\global\advance\leftskip by -\itemindent -@end tex - -@node Infix Ops, , Prefix Ops, Integer Exprs -@subsection Infix Operators - -@cindex infix operators -@cindex operators, permitted arguments -@dfn{Infix operators} take two arguments, one on either side. Operators -have precedence, but operations with equal precedence are performed left -to right. Apart from @code{+} or @code{-}, both arguments must be -absolute, and the result is absolute. - -@enumerate -@cindex operator precedence -@cindex precedence of operators - -@item -Highest Precedence - -@table @code -@item * -@dfn{Multiplication}. - -@item / -@dfn{Division}. Truncation is the same as the C operator @samp{/} - -@item % -@dfn{Remainder}. - -@item _0__<_1__ -@itemx _0__<<_1__ -@dfn{Shift Left}. Same as the C operator @samp{_0__<<_1__} - -@item _0__>_1__ -@itemx _0__>>_1__ -@dfn{Shift Right}. Same as the C operator @samp{_0__>>_1__} -@end table - -@item -Intermediate precedence - -@table @code -@item | - -@dfn{Bitwise Inclusive Or}. - -@item & -@dfn{Bitwise And}. - -@item ^ -@dfn{Bitwise Exclusive Or}. - -@item ! -@dfn{Bitwise Or Not}. -@end table - -@item -Lowest Precedence - -@table @code -@item + -@cindex addition, permitted arguments -@cindex plus, permitted arguments -@cindex arguments for addition -@dfn{Addition}. If either argument is absolute, the result -has the section of the other argument. -If either argument is pass1 or undefined, the result is pass1. -Otherwise @code{+} is illegal. - -@item - -@cindex subtraction, permitted arguments -@cindex minus, permitted arguments -@cindex arguments for subtraction -@dfn{Subtraction}. If the right argument is absolute, the -result has the section of the left argument. -If either argument is pass1 the result is pass1. -If either argument is undefined the result is difference section. -If both arguments are in the same section, the result is absolute---provided -that section is one of text, data or bss. -Otherwise subtraction is illegal. -@end table -@end enumerate - -The sense of the rule for addition is that it's only meaningful to add -the @emph{offsets} in an address; you can only have a defined section in -one of the two arguments. - -Similarly, you can't subtract quantities from two different sections. - -@node Pseudo Ops, _MACH_DEP__, Expressions, Top -@chapter Assembler Directives - -@cindex directives, machine independent -@cindex pseudo-ops, machine independent -@cindex machine independent directives -All assembler directives have names that begin with a period (@samp{.}). -The rest of the name is letters, usually in lower case. - -This chapter discusses directives present regardless of the target -machine configuration for the GNU assembler. -_if__(!_H8__) -@xref{_MACH_DEP__} for additional directives. -_fi__(!_H8__) - -@menu -* Abort:: @code{.abort} -_if__(_COFF__) -* coff-ABORT:: @code{.ABORT} -_fi__(_COFF__) -_if__(_BOUT__&&!_COFF__) -* bout-ABORT:: @code{.ABORT} -_fi__(_BOUT__&&!_COFF__) -* Align:: @code{.align @var{abs-expr} , @var{abs-expr}} -* App-File:: @code{.app-file @var{string}} -* Ascii:: @code{.ascii "@var{string}"}@dots{} -* Asciz:: @code{.asciz "@var{string}"}@dots{} -* Byte:: @code{.byte @var{expressions}} -* Comm:: @code{.comm @var{symbol} , @var{length} } -* Data:: @code{.data @var{subsection}} -_if__(_COFF__||_BOUT__) -* Def:: @code{.def @var{name}} -_fi__(_COFF__||_BOUT__) -_if__(_AOUT__||_BOUT__) -* Desc:: @code{.desc @var{symbol}, @var{abs-expression}} -_fi__(_AOUT__||_BOUT__) -_if__(_COFF__||_BOUT__) -* Dim:: @code{.dim} -_fi__(_COFF__||_BOUT__) -* Double:: @code{.double @var{flonums}} -* Eject:: @code{.eject} -* Else:: @code{.else} -_if__(_COFF__||_BOUT__) -* Endef:: @code{.endef} -_fi__(_COFF__||_BOUT__) -* Endif:: @code{.endif} -* Equ:: @code{.equ @var{symbol}, @var{expression}} -* Extern:: @code{.extern} -_if__(_GENERIC__||!_A29K__) -* File:: @code{.file @var{string}} -_fi__(_GENERIC__||!_A29K__) -* Fill:: @code{.fill @var{repeat} , @var{size} , @var{value}} -* Float:: @code{.float @var{flonums}} -* Global:: @code{.global @var{symbol}}, @code{.globl @var{symbol}} -* hword:: @code{.hword @var{expressions}} -* Ident:: @code{.ident} -* If:: @code{.if @var{absolute expression}} -* Include:: @code{.include "@var{file}"} -* Int:: @code{.int @var{expressions}} -* Lcomm:: @code{.lcomm @var{symbol} , @var{length}} -* Lflags:: @code{.lflags} -_if__(_GENERIC__||!_A29K__) -* Line:: @code{.line @var{line-number}} -_fi__(_GENERIC__||!_A29K__) -* Ln:: @code{.ln @var{line-number}} -* List:: @code{.list} -* Long:: @code{.long @var{expressions}} -* Lsym:: @code{.lsym @var{symbol}, @var{expression}} -* Nolist:: @code{.nolist} -* Octa:: @code{.octa @var{bignums}} -* Org:: @code{.org @var{new-lc} , @var{fill}} -* Psize:: @code{.psize @var{lines}, @var{columns}} -* Quad:: @code{.quad @var{bignums}} -* Sbttl:: @code{.sbttl "@var{subheading}"} -_if__(_COFF__||_BOUT__) -* Scl:: @code{.scl @var{class}} -_fi__(_COFF__||_BOUT__) -_if__(_COFF__) -* Section:: @code{.section @var{name}, @var{subsection}} -_fi__(_COFF__) -* Set:: @code{.set @var{symbol}, @var{expression}} -* Short:: @code{.short @var{expressions}} -* Single:: @code{.single @var{flonums}} -_if__(_COFF__||_BOUT__) -* Size:: @code{.size} -_fi__(_COFF__||_BOUT__) -* Space:: @code{.space @var{size} , @var{fill}} -_if__(_GENERIC__||!_H8__) -* Stab:: @code{.stabd, .stabn, .stabs} -_fi__(_GENERIC__||!_H8__) -_if__(_COFF__||_BOUT__) -* Tag:: @code{.tag @var{structname}} -_fi__(_COFF__||_BOUT__) -* Text:: @code{.text @var{subsection}} -* Title:: @code{.title "@var{heading}"} -_if__(_COFF__||_BOUT__) -* Type:: @code{.type @var{int}} -* Val:: @code{.val @var{addr}} -_fi__(_COFF__||_BOUT__) -* Word:: @code{.word @var{expressions}} -* Deprecated:: Deprecated Directives -@end menu - -_if__(_COFF__) -@node Abort, coff-ABORT, Pseudo Ops, Pseudo Ops -_fi__(_COFF__) -_if__((!_COFF__) && _BOUT__) -@node Abort, bout-ABORT, Pseudo Ops, Pseudo Ops -_fi__((!_COFF__) && _BOUT__) -_if__(! (_BOUT__ || _COFF__) ) -@node Abort, Align, Pseudo Ops, Pseudo Ops -_fi__(! (_BOUT__ || _COFF__) ) -@section @code{.abort} - -@cindex @code{abort} directive -@cindex stopping the assembly -This directive stops the assembly immediately. It is for -compatibility with other assemblers. The original idea was that the -assembly language source would be piped into the assembler. If the sender -of the source quit, it could use this directive tells @code{_AS__} to -quit also. One day @code{.abort} will not be supported. - -_if__(_COFF__) -@node coff-ABORT, Align, Abort, Pseudo Ops -@section @code{.ABORT} - -@cindex @code{ABORT} directive -When producing COFF output, @code{_AS__} accepts this directive as a -synonym for @samp{.abort}. -_fi__(_COFF__) - -_if__(_BOUT__) -_if__(!_COFF__) -@node bout-ABORT, Align, Abort, Pseudo Ops -@section @code{.ABORT} - -@cindex @code{ABORT} directive -_fi__(!_COFF__) - -When producing @code{b.out} output, @code{_AS__} accepts this directive, -but ignores it. -_fi__(_BOUT__) - -_if__( ! (_COFF__ || _BOUT__) ) -@node Align, App-File, Abort, Pseudo Ops -_fi__( ! (_COFF__ || _BOUT__) ) -_if__( _COFF__) -@node Align, App-File, coff-ABORT, Pseudo Ops -_fi__( _COFF__) -_if__( _BOUT__ && (! _COFF__)) -@node Align, App-File, bout-ABORT, Pseudo Ops -_fi__( _BOUT__ && (! _COFF__)) -@section @code{.align @var{abs-expr} , @var{abs-expr}} - -@cindex padding the location counter -@cindex advancing location counter -@cindex location counter, advancing -@cindex @code{align} directive -Pad the location counter (in the current subsection) to a particular -storage boundary. The first expression (which must be absolute) is the -number of low-order zero bits the location counter will have after -advancement. For example @samp{.align 3} will advance the location -counter until it a multiple of 8. If the location counter is already a -multiple of 8, no change is needed. - -The second expression (also absolute) gives the value to be stored in -the padding bytes. It (and the comma) may be omitted. If it is -omitted, the padding bytes are zero. - -@node App-File, Ascii, Align, Pseudo Ops -@section @code{.app-file @var{string}} - -@cindex logical file name -@cindex file name, logical -@cindex @code{app-file} directive -@code{.app-file} -_if__(!_A29K__) -(which may also be spelled @samp{.file}) -_fi__(!_A29K__) -tells @code{_AS__} that we are about to start a new -logical file. @var{string} is the new file name. In general, the -filename is recognized whether or not it is surrounded by quotes @samp{"}; -but if you wish to specify an empty file name is permitted, -you must give the quotes--@code{""}. This statement may go away in -future: it is only recognized to be compatible with old @code{_AS__} -programs.@refill - -@node Ascii, Asciz, App-File, Pseudo Ops -@section @code{.ascii "@var{string}"}@dots{} - -@cindex @code{ascii} directive -@cindex string literals -@code{.ascii} expects zero or more string literals (@pxref{Strings}) -separated by commas. It assembles each string (with no automatic -trailing zero byte) into consecutive addresses. - -@node Asciz, Byte, Ascii, Pseudo Ops -@section @code{.asciz "@var{string}"}@dots{} - -@cindex @code{asciz} directive -@cindex zero-terminated strings -@cindex null-terminated strings -@code{.asciz} is just like @code{.ascii}, but each string is followed by -a zero byte. The ``z'' in @samp{.asciz} stands for ``zero''. - -@node Byte, Comm, Asciz, Pseudo Ops -@section @code{.byte @var{expressions}} - -@cindex @code{byte} directive -@cindex integers, one byte -@code{.byte} expects zero or more expressions, separated by commas. -Each expression is assembled into the next byte. - -@node Comm, Data, Byte, Pseudo Ops -@section @code{.comm @var{symbol} , @var{length} } - -@cindex @code{comm} directive -@cindex symbol, common -@code{.comm} declares a named common area in the bss section. Normally -@code{_LD__} reserves memory addresses for it during linking, so no partial -program defines the location of the symbol. Use @code{.comm} to tell -@code{_LD__} that it must be at least @var{length} bytes long. @code{_LD__} -will allocate space for each @code{.comm} symbol that is at least as -long as the longest @code{.comm} request in any of the partial programs -linked. @var{length} is an absolute expression. - -_if__(_COFF__ || _BOUT__) -@node Data, Def, Comm, Pseudo Ops -_fi__(_COFF__ || _BOUT__) -_if__(!(_COFF__ || _BOUT__) && _AOUT__) -@node Data, Desc, Comm, Pseudo Ops -_fi__(!(_COFF__ || _BOUT__) && _AOUT__) -_if__(! (_COFF__ || _BOUT__ || _AOUT__) ) -@c Well, this *might* happen... -@node Data, Double, Comm, Pseudo Ops -_fi__(! (_COFF__ || _BOUT__ || _AOUT__) ) -@section @code{.data @var{subsection}} - -@cindex @code{data} directive -@code{.data} tells @code{_AS__} to assemble the following statements onto the -end of the data subsection numbered @var{subsection} (which is an -absolute expression). If @var{subsection} is omitted, it defaults -to zero. - -_if__(_COFF__ || _BOUT__) -_if__(_AOUT__ || _BOUT__) -@node Def, Desc, Data, Pseudo Ops -_fi__(_AOUT__ || _BOUT__) -_if__(!(_AOUT__ || _BOUT__)) -@node Def, Dim, Data, Pseudo Ops -_fi__(!(_AOUT__ || _BOUT__)) -@section @code{.def @var{name}} - -@cindex @code{def} directive -@cindex COFF symbols, debugging -@cindex debugging COFF symbols -Begin defining debugging information for a symbol @var{name}; the -definition extends until the @code{.endef} directive is encountered. -_if__(_BOUT__) - -This directive is only observed when @code{_AS__} is configured for COFF -format output; when producing @code{b.out}, @samp{.def} is recognized, -but ignored. -_fi__(_BOUT__) -_fi__(_COFF__ || _BOUT__) - -_if__(_AOUT__||_BOUT__) -_if__(_COFF__||_BOUT__) -@node Desc, Dim, Def, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Desc, Double, Data, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.desc @var{symbol}, @var{abs-expression}} - -@cindex @code{desc} directive -@cindex COFF symbol descriptor -@cindex symbol descriptor, COFF -This directive sets the descriptor of the symbol (@pxref{Symbol Attributes}) -to the low 16 bits of an absolute expression. - -_if__(_COFF__) -The @samp{.desc} directive is not available when @code{_AS__} is -configured for COFF output; it is only for @code{a.out} or @code{b.out} -object format. For the sake of compatibility, @code{_AS__} will accept -it, but produce no output, when configured for COFF. -_fi__(_COFF__) -_fi__(_AOUT__||_BOUT__) - -_if__(_COFF__ || _BOUT__) -_if__(_AOUT__ || _BOUT__) -@node Dim, Double, Desc, Pseudo Ops -_fi__(_AOUT__ || _BOUT__) -_if__(!(_AOUT__ || _BOUT__)) -@node Dim, Double, Def, Pseudo Ops -_fi__(!(_AOUT__ || _BOUT__)) -@section @code{.dim} - -@cindex @code{dim} directive -@cindex COFF auxiliary symbol information -@cindex auxiliary symbol information, COFF -This directive is generated by compilers to include auxiliary debugging -information in the symbol table. It is only permitted inside -@code{.def}/@code{.endef} pairs. -_if__(_BOUT__) - -@samp{.dim} is only meaningful when generating COFF format output; when -@code{_AS__} is generating @code{b.out}, it accepts this directive but -ignores it. -_fi__(_BOUT__) -_fi__(_COFF__ || _BOUT__) - -_if__(_COFF__||_BOUT__) -@node Double, Eject, Dim, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Double, Eject, Desc, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.double @var{flonums}} - -@cindex @code{double} directive -@cindex floating point numbers (double) -@code{.double} expects zero or more flonums, separated by commas. It -assembles floating point numbers. -_if__(_GENERIC__) -The exact kind of floating point numbers emitted depends on how -@code{_AS__} is configured. @xref{_MACH_DEP__}. -_fi__(_GENERIC__) -_if__((!_GENERIC__) && _IEEEFLOAT__) -On the _HOST__ family @samp{.double} emits 64-bit floating-point numbers -in @sc{ieee} format. -_fi__((!_GENERIC__) && _IEEEFLOAT__) - -@node Eject, Else, Double, Pseudo Ops -@section @code{.eject} - -@cindex @code{eject} directive -@cindex new page, in listings -@cindex page, in listings -@cindex listing control: new page -Force a page break at this point, when generating assembly listings. - -_if__(_COFF__||_BOUT__) -@node Else, Endef, Eject, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Else, Endif, Eject, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.else} - -@cindex @code{else} directive -@code{.else} is part of the @code{_AS__} support for conditional -assembly; @pxref{If,,@code{.if}}. It marks the beginning of a section -of code to be assembled if the condition for the preceding @code{.if} -was false. - -_if__(0) -@node End, Endef, Else, Pseudo Ops -@section @code{.end} - -@cindex @code{end} directive -This doesn't do anything---but isn't an s_ignore, so I suspect it's -meant to do something eventually (which is why it isn't documented here -as "for compatibility with blah"). -_fi__(0) - -_if__(_COFF__||_BOUT__) -@node Endef, Endif, Else, Pseudo Ops -@section @code{.endef} - -@cindex @code{endef} directive -This directive flags the end of a symbol definition begun with -@code{.def}. -_if__(_BOUT__) - -@samp{.endef} is only meaningful when generating COFF format output; if -@code{_AS__} is configured to generate @code{b.out}, it accepts this -directive but ignores it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_COFF__||_BOUT__) -@node Endif, Equ, Endef, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Endif, Equ, Else, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.endif} - -@cindex @code{endif} directive -@code{.endif} is part of the @code{_AS__} support for conditional assembly; -it marks the end of a block of code that is only assembled -conditionally. @xref{If,,@code{.if}}. - -@node Equ, Extern, Endif, Pseudo Ops -@section @code{.equ @var{symbol}, @var{expression}} - -@cindex @code{equ} directive -@cindex assigning values to symbols -@cindex symbols, assigning values to -This directive sets the value of @var{symbol} to @var{expression}. -It is synonymous with @samp{.set}; @pxref{Set,,@code{.set}}. - -_if__(_GENERIC__||!_A29K__) -@node Extern, File, Equ, Pseudo Ops -_fi__(_GENERIC__||!_A29K__) -_if__(_A29K__&&!_GENERIC__) -@node Extern, Fill, Equ, Pseudo Ops -_fi__(_A29K__&&!_GENERIC__) -@section @code{.extern} - -@cindex @code{extern} directive -@code{.extern} is accepted in the source program---for compatibility -with other assemblers---but it is ignored. @code{_AS__} treats -all undefined symbols as external. - -_if__(_GENERIC__||!_A29K__) -@node File, Fill, Extern, Pseudo Ops -@section @code{.file @var{string}} - -@cindex @code{file} directive -@cindex logical file name -@cindex file name, logical -@code{.file} (which may also be spelled @samp{.app-file}) tells -@code{_AS__} that we are about to start a new logical file. -@var{string} is the new file name. In general, the filename is -recognized whether or not it is surrounded by quotes @samp{"}; but if -you wish to specify an empty file name, you must give the -quotes--@code{""}. This statement may go away in future: it is only -recognized to be compatible with old @code{_AS__} programs. -_if__(_A29K__) -In some configurations of @code{_AS__}, @code{.file} has already been -removed to avoid conflicts with other assemblers. @xref{_MACH_DEP__}. -_fi__(_A29K__) -_fi__(_GENERIC__||!_A29K__) - -_if__(_GENERIC__||!_A29K__) -@node Fill, Float, File, Pseudo Ops -_fi__(_GENERIC__||!_A29K__) -_if__(_A29K__&&!_GENERIC__) -@node Fill, Float, Extern, Pseudo Ops -_fi__(_A29K__&&!_GENERIC__) -@section @code{.fill @var{repeat} , @var{size} , @var{value}} - -@cindex @code{fill} directive -@cindex writing patterns in memory -@cindex patterns, writing in memory -@var{result}, @var{size} and @var{value} are absolute expressions. -This emits @var{repeat} copies of @var{size} bytes. @var{Repeat} -may be zero or more. @var{Size} may be zero or more, but if it is -more than 8, then it is deemed to have the value 8, compatible with -other people's assemblers. The contents of each @var{repeat} bytes -is taken from an 8-byte number. The highest order 4 bytes are -zero. The lowest order 4 bytes are @var{value} rendered in the -byte-order of an integer on the computer @code{_AS__} is assembling for. -Each @var{size} bytes in a repetition is taken from the lowest order -@var{size} bytes of this number. Again, this bizarre behavior is -compatible with other people's assemblers. - -@var{size} and @var{value} are optional. -If the second comma and @var{value} are absent, @var{value} is -assumed zero. If the first comma and following tokens are absent, -@var{size} is assumed to be 1. - -@node Float, Global, Fill, Pseudo Ops -@section @code{.float @var{flonums}} - -@cindex floating point numbers (single) -@cindex @code{float} directive -This directive assembles zero or more flonums, separated by commas. It -has the same effect as @code{.single}. -_if__(_GENERIC__) -The exact kind of floating point numbers emitted depends on how -@code{_AS__} is configured. -@xref{_MACH_DEP__}. -_fi__(_GENERIC__) -_if__((!_GENERIC__) && _IEEEFLOAT__) -On the _HOST__ family, @code{.float} emits 32-bit floating point numbers -in @sc{ieee} format. -_fi__((!_GENERIC__) && _IEEEFLOAT__) - -@node Global, hword, Float, Pseudo Ops -@section @code{.global @var{symbol}}, @code{.globl @var{symbol}} - -@cindex @code{global} directive -@cindex symbol, making visible to linker -@code{.global} makes the symbol visible to @code{_LD__}. If you define -@var{symbol} in your partial program, its value is made available to -other partial programs that are linked with it. Otherwise, -@var{symbol} will take its attributes from a symbol of the same name -from another partial program it is linked with. - -Both spellings (@samp{.globl} and @samp{.global}) are accepted, for -compatibility with other assemblers. - -_if__(_AOUT__||_BOUT__||_COFF__) -@node hword, Ident, Global, Pseudo Ops -_fi__(_AOUT__||_BOUT__||_COFF__) -_if__(!(_AOUT__||_BOUT__||_COFF__)) -@node hword, If, Global, Pseudo Ops -_fi__(!(_AOUT__||_BOUT__||_COFF__)) -@section @code{.hword @var{expressions}} - -@cindex @code{hword} directive -@cindex integers, 16-bit -@cindex numbers, 16-bit -@cindex sixteen bit integers -This expects zero or more @var{expressions}, and emits -a 16 bit number for each. - -_if__(_GENERIC__) -This directive is a synonym for @samp{.short}; depending on the target -architecture, it may also be a synonym for @samp{.word}. -_fi__(_GENERIC__) -_if__( _W32__ && !_GENERIC__ ) -This directive is a synonym for @samp{.short}. -_fi__( _W32__ && !_GENERIC__ ) -_if__(_W16__ && !_GENERIC__ ) -This directive is a synonym for both @samp{.short} and @samp{.word}. -_fi__(_W16__ && !_GENERIC__ ) - -_if__(_AOUT__||_BOUT__||_COFF__) -@node Ident, If, hword, Pseudo Ops -@section @code{.ident} - -@cindex @code{ident} directive -This directive is used by some assemblers to place tags in object files. -@code{_AS__} simply accepts the directive for source-file -compatibility with such assemblers, but does not actually emit anything -for it. -_fi__(_AOUT__||_BOUT__||_COFF__) - -_if__(_AOUT__||_BOUT__||_COFF__) -@node If, Include, Ident, Pseudo Ops -_fi__(_AOUT__||_BOUT__||_COFF__) -_if__(!(_AOUT__||_BOUT__||_COFF__)) -@node If, Include, hword, Pseudo Ops -_fi__(!(_AOUT__||_BOUT__||_COFF__)) -@section @code{.if @var{absolute expression}} - -@cindex conditional assembly -@cindex @code{if} directive -@code{.if} marks the beginning of a section of code which is only -considered part of the source program being assembled if the argument -(which must be an @var{absolute expression}) is non-zero. The end of -the conditional section of code must be marked by @code{.endif} -(@pxref{Endif,,@code{.endif}}); optionally, you may include code for the -alternative condition, flagged by @code{.else} (@pxref{Else,,@code{.else}}. - -The following variants of @code{.if} are also supported: -@table @code -@item .ifdef @var{symbol} -@cindex @code{ifdef} directive -Assembles the following section of code if the specified @var{symbol} -has been defined. - -_if__(0) -@item .ifeqs -@cindex @code{ifeqs} directive -Not yet implemented. -_fi__(0) - -@item .ifndef @var{symbol} -@itemx ifnotdef @var{symbol} -@cindex @code{ifndef} directive -@cindex @code{ifnotdef} directive -Assembles the following section of code if the specified @var{symbol} -has not been defined. Both spelling variants are equivalent. - -_if__(0) -@item ifnes -Not yet implemented. -_fi__(0) -@end table - -@node Include, Int, If, Pseudo Ops -@section @code{.include "@var{file}"} - -@cindex @code{include} directive -@cindex supporting files, including -@cindex files, including -This directive provides a way to include supporting files at specified -points in your source program. The code from @var{file} is assembled as -if it followed the point of the @code{.include}; when the end of the -included file is reached, assembly of the original file continues. You -can control the search paths used with the @samp{-I} command-line option -(@pxref{Invoking,,Command-Line Options}). Quotation marks are required -around @var{file}. - -@node Int, Lcomm, Include, Pseudo Ops -@section @code{.int @var{expressions}} - -@cindex @code{int} directive -_if__(_GENERIC__||!_H8__) -@cindex integers, 32-bit -_fi__(_GENERIC__||!_H8__) -Expect zero or more @var{expressions}, of any section, separated by -commas. For each expression, emit a -_if__(_GENERIC__||!_H8__) -32-bit -_fi__(_GENERIC__||!_H8__) -_if__(_H8__&&!_GENERIC__) -16-bit -_fi__(_H8__&&!_GENERIC__) -number that will, at run -time, be the value of that expression. The byte order of the -expression depends on what kind of computer will run the program. - -@node Lcomm, Lflags, Int, Pseudo Ops -@section @code{.lcomm @var{symbol} , @var{length}} - -@cindex @code{lcomm} directive -@cindex local common symbols -@cindex symbols, local common -Reserve @var{length} (an absolute expression) bytes for a local common -denoted by @var{symbol}. The section and value of @var{symbol} are -those of the new local common. The addresses are allocated in the bss -section, so at run-time the bytes will start off zeroed. @var{Symbol} -is not declared global (@pxref{Global,,@code{.global}}), so is normally -not visible to @code{_LD__}. - -_if__(_GENERIC__||(!_A29K__)) -@node Lflags, Line, Lcomm, Pseudo Ops -_fi__(_GENERIC__||(!_A29K__)) -_if__((!_GENERIC__)&& _A29K__) -@node Lflags, Ln, Lcomm, Pseudo Ops -_fi__((!_GENERIC__)&& _A29K__) -@section @code{.lflags} - -@cindex @code{lflags} directive (ignored) -@code{_AS__} accepts this directive, for compatibility with other -assemblers, but ignores it. - -_if__(_GENERIC__ || !_A29K__) -@node Line, Ln, Lflags, Pseudo Ops -@section @code{.line @var{line-number}} - -@cindex @code{line} directive -_fi__(_GENERIC__ || (!_A29K__)) -_if__(_A29K__ && (!_GENERIC__)) -@node Ln, List, Lflags, Pseudo Ops -@section @code{.ln @var{line-number}} - -@cindex @code{ln} directive -_fi__(_A29K__ && (!_GENERIC__)) -@cindex logical line number -_if__(_AOUT__||_BOUT__) -Tell @code{_AS__} to change the logical line number. @var{line-number} must be -an absolute expression. The next line will have that logical line -number. So any other statements on the current line (after a statement -separator -_if__(_GENERIC__) -character) -_fi__(_GENERIC__) -_if__(!_GENERIC__) -_if__(! (_A29K__||_H8__) ) -character @code{;}) -_fi__(! (_A29K__||_H8__) ) -_if__(_A29K__) -character @samp{@@}) -_fi__(_A29K__) -_if__(_H8__) -character @samp{$}) -_fi__(_H8__) -_fi__(!_GENERIC__) -will be reported as on logical line number -@var{line-number} @minus{} 1. -One day this directive will be unsupported: it is used only -for compatibility with existing assembler programs. @refill - -_if__(_GENERIC__ && _A29K__) -@emph{Warning:} In the AMD29K configuration of _AS__, this command is -only available with the name @code{.ln}, rather than as either -@code{.line} or @code{.ln}. -_fi__(_GENERIC__ && _A29K__) -_fi__(_AOUT__||_BOUT__) -_if__(_COFF__) - -Even though this is a directive associated with the @code{a.out} or -@code{b.out} object-code formats, @code{_AS__} will still recognize it -when producing COFF output, and will treat @samp{.line} as though it -were the COFF @samp{.ln} @emph{if} it is found outside a -@code{.def}/@code{.endef} pair. - -Inside a @code{.def}, @samp{.line} is, instead, one of the directives -used by compilers to generate auxiliary symbol information for -debugging. -_fi__(_COFF__) - -_if__(_AOUT__&&(_GENERIC__||!_A29K__)) -@node Ln, List, Line, Pseudo Ops -@section @code{.ln @var{line-number}} - -@cindex @code{ln} directive -@samp{.ln} is a synonym for @samp{.line}. -_fi__(_AOUT__&&(_GENERIC__||!_A29K__)) -_if__(_COFF__&&!_AOUT__) -@node Ln, List, Line, Pseudo Ops -@section @code{.ln @var{line-number}} - -@cindex @code{ln} directive -Tell @code{_AS__} to change the logical line number. @var{line-number} -must be an absolute expression. The next line will have that logical -line number, so any other statements on the current line (after a -statement separator character @code{;}) will be reported as on logical -line number @var{line-number} @minus{} 1. -_if__(_BOUT__) - -This directive is accepted, but ignored, when @code{_AS__} is configured for -@code{b.out}; its effect is only associated with COFF output format. -_fi__(_BOUT__) -_fi__(_COFF__&&!_AOUT__) - -@node List, Long, Ln, Pseudo Ops -@section @code{.list} - -@cindex @code{list} directive -@cindex listing control, turning on -Control (in conjunction with the @code{.nolist} directive) whether or -not assembly listings are generated. These two directives maintain an -internal counter (which is zero initially). @code{.list} increments the -counter, and @code{.nolist} decrements it. Assembly listings are -generated whenever the counter is greater than zero. - -By default, listings are disabled. When you enable them (with the -@samp{-a} command line option; @pxref{Invoking,,Command-Line Options}), -the initial value of the listing counter is one. - -@node Long, Lsym, List, Pseudo Ops -@section @code{.long @var{expressions}} - -@cindex @code{long} directive -@code{.long} is the same as @samp{.int}, @pxref{Int,,@code{.int}}. - -@node Lsym, Nolist, Long, Pseudo Ops -@section @code{.lsym @var{symbol}, @var{expression}} - -@cindex @code{lsym} directive -@cindex symbol, not referenced in assembly -@code{.lsym} creates a new symbol named @var{symbol}, but does not put it in -the hash table, ensuring it cannot be referenced by name during the -rest of the assembly. This sets the attributes of the symbol to be -the same as the expression value: -@smallexample -@var{other} = @var{descriptor} = 0 -@var{type} = @r{(section of @var{expression})} -@var{value} = @var{expression} -@end smallexample -@noindent -The new symbol is not flagged as external. - -@node Nolist, Octa, Lsym, Pseudo Ops -@section @code{.nolist} - -@cindex @code{nolist} directive -@cindex listing control, turning off -Control (in conjunction with the @code{.list} directive) whether or -not assembly listings are generated. These two directives maintain an -internal counter (which is zero initially). @code{.list} increments the -counter, and @code{.nolist} decrements it. Assembly listings are -generated whenever the counter is greater than zero. - -@node Octa, Org, Nolist, Pseudo Ops -@section @code{.octa @var{bignums}} - -@c FIXME: double size emitted for "octa" on i960, others? Or warn? -@cindex @code{octa} directive -@cindex integer, 16-byte -@cindex sixteen byte integer -This directive expects zero or more bignums, separated by commas. For each -bignum, it emits a 16-byte integer. - -The term ``octa'' comes from contexts in which a ``word'' is two bytes; -hence @emph{octa}-word for 16 bytes. - -@node Org, Psize, Octa, Pseudo Ops -@section @code{.org @var{new-lc} , @var{fill}} - -@cindex @code{org} directive -@cindex location counter, advancing -@cindex advancing location counter -@cindex current address, advancing -@code{.org} will advance the location counter of the current section to -@var{new-lc}. @var{new-lc} is either an absolute expression or an -expression with the same section as the current subsection. That is, -you can't use @code{.org} to cross sections: if @var{new-lc} has the -wrong section, the @code{.org} directive is ignored. To be compatible -with former assemblers, if the section of @var{new-lc} is absolute, -@code{_AS__} will issue a warning, then pretend the section of @var{new-lc} -is the same as the current subsection. - -@code{.org} may only increase the location counter, or leave it -unchanged; you cannot use @code{.org} to move the location counter -backwards. - -@c double negative used below "not undefined" because this is a specific -@c reference to "undefined" (as SEG_UNKNOWN is called in this manual) -@c section. pesch@cygnus.com 18feb91 -Because @code{_AS__} tries to assemble programs in one pass @var{new-lc} -may not be undefined. If you really detest this restriction we eagerly await -a chance to share your improved assembler. - -Beware that the origin is relative to the start of the section, not -to the start of the subsection. This is compatible with other -people's assemblers. - -When the location counter (of the current subsection) is advanced, the -intervening bytes are filled with @var{fill} which should be an -absolute expression. If the comma and @var{fill} are omitted, -@var{fill} defaults to zero. - -@node Psize, Quad, Org, Pseudo Ops -@section @code{.psize @var{lines} , @var{columns}} - -@cindex @code{psize} directive -@cindex listing control: paper size -@cindex paper size, for listings -Use this directive to declare the number of lines---and, optionally, the -number of columns---to use for each page, when generating listings. - -If you don't use @code{.psize}, listings will use a default line-count -of 60. You may omit the comma and @var{columns} specification; the -default width is 200 columns. - -@code{_AS__} will generate formfeeds whenever the specified number of -lines is exceeded (or whenever you explicitly request one, using -@code{.eject}). - -If you specify @var{lines} as @code{0}, no formfeeds are generated save -those explicitly specified with @code{.eject}. - -@node Quad, Sbttl, Psize, Pseudo Ops -@section @code{.quad @var{bignums}} - -@cindex @code{quad} directive -@code{.quad} expects zero or more bignums, separated by commas. For -each bignum, it emits -_if__(_GENERIC__||(!_I960__)) -an 8-byte integer. If the bignum won't fit in 8 -bytes, it prints a warning message; and just takes the lowest order 8 -bytes of the bignum.@refill -@cindex eight-byte integer -@cindex integer, 8-byte - -The term ``quad'' comes from contexts in which a ``word'' is two bytes; -hence @emph{quad}-word for 8 bytes. -_fi__(_GENERIC__||(!_I960__)) -_if__(_I960__&&(!_GENERIC__)) -a 16-byte integer. If the bignum won't fit in 16 bytes, it prints a -warning message; and just takes the lowest order 16 bytes of the -bignum.@refill -@cindex sixteen-byte integer -@cindex integer, 16-byte -_fi__(_I960__&&(!_GENERIC__)) - -_if__(_COFF__||_BOUT__) -@node Sbttl, Scl, Quad, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Sbttl, Set, Quad, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.sbttl "@var{subheading}"} - -@cindex @code{sbttl} directive -@cindex subtitles for listings -@cindex listing control: subtitle -Use @var{subheading} as the title (third line, immediately after the -title line) when generating assembly listings. - -This directive affects subsequent pages, as well as the current page if -it appears within ten lines of the top of a page. - -_if__(_COFF__||_BOUT__) -_if__(!_COFF__) -@node Scl, Set, Sbttl, Pseudo Ops -_fi__(!_COFF__) -_if__(_COFF__) -@node Scl, Section, Sbttl, Pseudo Ops -_fi__(_COFF__) -@section @code{.scl @var{class}} - -@cindex @code{scl} directive -@cindex symbol storage class (COFF) -@cindex COFF symbol storage class -Set the storage-class value for a symbol. This directive may only be -used inside a @code{.def}/@code{.endef} pair. Storage class may flag -whether a symbol is static or external, or it may record further -symbolic debugging information. -_if__(_BOUT__) - -The @samp{.scl} directive is primarily associated with COFF output; when -configured to generate @code{b.out} output format, @code{_AS__} will -accept this directive but ignore it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_COFF__) -@node Section, Set, Scl, Pseudo Ops -@section @code{.section @var{name}, @var{subsection}} - -@cindex @code{section} directive -@cindex named section (COFF) -@cindex COFF named section -Assemble the following code into end of subsection numbered -@var{subsection} in the COFF named section @var{name}. If you omit -@var{subsection}, @code{_AS__} uses subsection number zero. -@samp{.section .text} is equivalent to the @code{.text} directive; -@samp{.section .data} is equivalent to the @code{.data} directive. - -@node Set, Short, Section, Pseudo Ops -_fi__(_COFF__) -_if__(_BOUT__&&!_COFF__) -@node Set, Short, Scl, Pseudo Ops -_fi__(_BOUT__&&!_COFF__) -_if__(!(_COFF__||_BOUT__)) -@node Set, Short, Quad, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.set @var{symbol}, @var{expression}} - -@cindex @code{set} directive -@cindex symbol value, setting -This directive sets the value of @var{symbol} to @var{expression}. This -will change @var{symbol}'s value and type to conform to -@var{expression}. If @var{symbol} was flagged as external, it remains -flagged. (@xref{Symbol Attributes}.) - -You may @code{.set} a symbol many times in the same assembly. -If the expression's section is unknowable during pass 1, a second -pass over the source program will be forced. The second pass is -currently not implemented. @code{_AS__} will abort with an error -message if one is required. - -If you @code{.set} a global symbol, the value stored in the object -file is the last value stored into it. - -@node Short, Single, Set, Pseudo Ops -@section @code{.short @var{expressions}} - -@cindex @code{short} directive -_if__(_GENERIC__ || _W16__) -@code{.short} is the same as @samp{.word}. @xref{Word,,@code{.word}}. -_if__(_W32__) -In some configurations, however, @code{.short} and @code{.word} generate -numbers of different lengths; @pxref{_MACH_DEP__}. -_fi__(_W32__) -_fi__(_GENERIC__|| _W16__) -_if__((!_GENERIC__) && _W32__) -This expects zero or more @var{expressions}, and emits -a 16 bit number for each. -_fi__((!_GENERIC__) && _W32__) -_if__(_COFF__||_BOUT__) -@node Single, Size, Short, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Single, Space, Short, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.single @var{flonums}} - -@cindex @code{single} directive -@cindex floating point numbers (single) -This directive assembles zero or more flonums, separated by commas. It -has the same effect as @code{.float}. -_if__(_GENERIC__) -The exact kind of floating point numbers emitted depends on how -@code{_AS__} is configured. @xref{_MACH_DEP__}. -_fi__(_GENERIC__) -_if__((!_GENERIC__) && _IEEEFLOAT__) -On the _HOST__ family, @code{.single} emits 32-bit floating point -numbers in @sc{ieee} format. -_fi__((!_GENERIC__) && _IEEEFLOAT__) - -_if__(_COFF__||_BOUT__) -@node Size, Space, Single, Pseudo Ops -@section @code{.size} - -@cindex @code{size} directive -This directive is generated by compilers to include auxiliary debugging -information in the symbol table. It is only permitted inside -@code{.def}/@code{.endef} pairs. -_if__(_BOUT__) - -@samp{.size} is only meaningful when generating COFF format output; when -@code{_AS__} is generating @code{b.out}, it accepts this directive but -ignores it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_H8__&&!_GENERIC__) -@node Space, Tag, Size, Pseudo Ops -_fi__(_H8__&&!_GENERIC__) -_if__(_GENERIC__||!_H8__) -_if__(_COFF__||_BOUT__) -@node Space, Stab, Size, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Space, Stab, Single, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -_fi__(_GENERIC__||!_H8__) -_if__(_GENERIC__ || !_A29K__) -@section @code{.space @var{size} , @var{fill}} - -@cindex @code{space} directive -@cindex filling memory -This directive emits @var{size} bytes, each of value @var{fill}. Both -@var{size} and @var{fill} are absolute expressions. If the comma -and @var{fill} are omitted, @var{fill} is assumed to be zero. -_fi__(_GENERIC__ || !_A29K__) - -_if__(_A29K__) -@section @code{.space} - -@cindex @code{space} directive -On the AMD 29K, this directive is ignored; it is accepted for -compatibility with other AMD 29K assemblers. - -@quotation -@emph{Warning:} In other versions of the GNU assembler, the directive -@code{.space} has the effect of @code{.block} @xref{_MACH_DEP__}. -@end quotation -_fi__(_A29K__) - -_if__(_GENERIC__||!_H8__) -_if__(_AOUT__||_BOUT__||_COFF__) -_if__(_COFF__||_BOUT__) -@node Stab, Tag, Space, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Stab, Text, Space, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.stabd, .stabn, .stabs} - -@cindex symbolic debuggers, information for -@cindex @code{stab@var{x}} directives -There are three directives that begin @samp{.stab}. -All emit symbols (@pxref{Symbols}), for use by symbolic debuggers. -The symbols are not entered in the @code{_AS__} hash table: they -cannot be referenced elsewhere in the source file. -Up to five fields are required: -@table @var -@item string -This is the symbol's name. It may contain any character except @samp{\000}, -so is more general than ordinary symbol names. Some debuggers used to -code arbitrarily complex structures into symbol names using this field. -@item type -An absolute expression. The symbol's type is set to the low 8 -bits of this expression. -Any bit pattern is permitted, but @code{_LD__} and debuggers will choke on -silly bit patterns. -@item other -An absolute expression. -The symbol's ``other'' attribute is set to the low 8 bits of this expression. -@item desc -An absolute expression. -The symbol's descriptor is set to the low 16 bits of this expression. -@item value -An absolute expression which becomes the symbol's value. -@end table - -If a warning is detected while reading a @code{.stabd}, @code{.stabn}, -or @code{.stabs} statement, the symbol has probably already been created -and you will get a half-formed symbol in your object file. This is -compatible with earlier assemblers! - -@table @code -@cindex @code{stabd} directive -@item .stabd @var{type} , @var{other} , @var{desc} - -The ``name'' of the symbol generated is not even an empty string. -It is a null pointer, for compatibility. Older assemblers used a -null pointer so they didn't waste space in object files with empty -strings. - -The symbol's value is set to the location counter, -relocatably. When your program is linked, the value of this symbol -will be where the location counter was when the @code{.stabd} was -assembled. - -@item .stabn @var{type} , @var{other} , @var{desc} , @var{value} -@cindex @code{stabn} directive -The name of the symbol is set to the empty string @code{""}. - -@item .stabs @var{string} , @var{type} , @var{other} , @var{desc} , @var{value} -@cindex @code{stabs} directive -All five fields are specified. -@end table -_fi__(_AOUT__||_BOUT__||_COFF__) -_fi__(_GENERIC__||!_H8__) - -_if__(_COFF__||_BOUT__) -_if__(_GENERIC__||!_H8__) -@node Tag, Text, Stab, Pseudo Ops -_fi__(_GENERIC__||!_H8__) -_if__(_H8__&&!_GENERIC__) -@node Tag, Text, Space, Pseudo Ops -_fi__(_H8__&&!_GENERIC__) -@section @code{.tag @var{structname}} - -@cindex COFF structure debugging -@cindex structure debugging, COFF -@cindex @code{tag} directive -This directive is generated by compilers to include auxiliary debugging -information in the symbol table. It is only permitted inside -@code{.def}/@code{.endef} pairs. Tags are used to link structure -definitions in the symbol table with instances of those structures. -_if__(_BOUT__) - -@samp{.tag} is only used when generating COFF format output; when -@code{_AS__} is generating @code{b.out}, it accepts this directive but -ignores it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_COFF__||_BOUT__) -@node Text, Title, Tag, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Text, Title, Stab, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.text @var{subsection}} - -@cindex @code{text} directive -Tells @code{_AS__} to assemble the following statements onto the end of -the text subsection numbered @var{subsection}, which is an absolute -expression. If @var{subsection} is omitted, subsection number zero -is used. - -_if__(_COFF__||_BOUT__) -@node Title, Type, Text, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Title, Word, Text, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.title "@var{heading}"} - -@cindex @code{title} directive -@cindex listing control: title line -Use @var{heading} as the title (second line, immediately after the -source file name and pagenumber) when generating assembly listings. - -This directive affects subsequent pages, as well as the current page if -it appears within ten lines of the top of a page. - -_if__(_COFF__||_BOUT__) -@node Type, Val, Title, Pseudo Ops -@section @code{.type @var{int}} - -@cindex COFF symbol type -@cindex symbol type, COFF -@cindex @code{type} directive -This directive, permitted only within @code{.def}/@code{.endef} pairs, -records the integer @var{int} as the type attribute of a symbol table entry. -_if__(_BOUT__) - -@samp{.type} is associated only with COFF format output; when -@code{_AS__} is configured for @code{b.out} output, it accepts this -directive but ignores it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_COFF__||_BOUT__) -@node Val, Word, Type, Pseudo Ops -@section @code{.val @var{addr}} - -@cindex @code{val} directive -@cindex COFF value attribute -@cindex value attribute, COFF -This directive, permitted only within @code{.def}/@code{.endef} pairs, -records the address @var{addr} as the value attribute of a symbol table -entry. -_if__(_BOUT__) - -@samp{.val} is used only for COFF output; when @code{_AS__} is -configured for @code{b.out}, it accepts this directive but ignores it. -_fi__(_BOUT__) -_fi__(_COFF__||_BOUT__) - -_if__(_COFF__||_BOUT__) -@node Word, Deprecated, Val, Pseudo Ops -_fi__(_COFF__||_BOUT__) -_if__(!(_COFF__||_BOUT__)) -@node Word, Deprecated, Text, Pseudo Ops -_fi__(!(_COFF__||_BOUT__)) -@section @code{.word @var{expressions}} - -@cindex @code{word} directive -This directive expects zero or more @var{expressions}, of any section, -separated by commas. -_if__((!_GENERIC__) && _W32__) -For each expression, @code{_AS__} emits a 32-bit number. -_fi__((!_GENERIC__) && _W32__) -_if__((!_GENERIC__) && _W16__) -For each expression, @code{_AS__} emits a 16-bit number. -_fi__((!_GENERIC__) && _W16__) - -_if__(_GENERIC__) -The size of the number emitted, and its byte order, -depends on what kind of computer will run the program. -_fi__(_GENERIC__) - -@c on amd29k, i960, sparc the "special treatment to support compilers" doesn't -@c happen---32-bit addressability, period; no long/short jumps. -_if__(_GENERIC__ || _DIFFTABKLUG__) -@cindex difference tables altered -@cindex altered difference tables -@quotation -@emph{Warning: Special Treatment to support Compilers} -@end quotation - -_if__(_GENERIC__) -Machines with a 32-bit address space, but that do less than 32-bit -addressing, require the following special treatment. If the machine of -interest to you does 32-bit addressing (or doesn't require it; -@pxref{_MACH_DEP__}), you can ignore this issue. - -_fi__(_GENERIC__) -In order to assemble compiler output into something that will work, -@code{_AS__} will occasionlly do strange things to @samp{.word} directives. -Directives of the form @samp{.word sym1-sym2} are often emitted by -compilers as part of jump tables. Therefore, when @code{_AS__} assembles a -directive of the form @samp{.word sym1-sym2}, and the difference between -@code{sym1} and @code{sym2} does not fit in 16 bits, @code{_AS__} will -create a @dfn{secondary jump table}, immediately before the next label. -This secondary jump table will be preceded by a short-jump to the -first byte after the secondary table. This short-jump prevents the flow -of control from accidentally falling into the new table. Inside the -table will be a long-jump to @code{sym2}. The original @samp{.word} -will contain @code{sym1} minus the address of the long-jump to -@code{sym2}. - -If there were several occurrences of @samp{.word sym1-sym2} before the -secondary jump table, all of them will be adjusted. If there was a -@samp{.word sym3-sym4}, that also did not fit in sixteen bits, a -long-jump to @code{sym4} will be included in the secondary jump table, -and the @code{.word} directives will be adjusted to contain @code{sym3} -minus the address of the long-jump to @code{sym4}; and so on, for as many -entries in the original jump table as necessary. - -_if__(_INTERNALS__) -@emph{This feature may be disabled by compiling @code{_AS__} with the -@samp{-DWORKING_DOT_WORD} option.} This feature is likely to confuse -assembly language programmers. -_fi__(_INTERNALS__) -_fi__(_GENERIC__ || _DIFFTABKLUG__) - -@node Deprecated, , Word, Pseudo Ops -@section Deprecated Directives - -@cindex deprecated directives -@cindex obsolescent directives -One day these directives won't work. -They are included for compatibility with older assemblers. -@table @t -@item .abort -@item .app-file -@item .line -@end table - -@node _MACH_DEP__, Copying, Pseudo Ops, Top -_if__(_GENERIC__) -@chapter Machine Dependent Features - -@cindex machine dependencies -The machine instruction sets are (almost by definition) different on -each machine where @code{_AS__} runs. Floating point representations -vary as well, and @code{_AS__} often supports a few additional -directives or command-line options for compatibility with other -assemblers on a particular platform. Finally, some versions of -@code{_AS__} support special pseudo-instructions for branch -optimization. - -This chapter discusses most of these differences, though it does not -include details on any machine's instruction set. For details on that -subject, see the hardware manufacturer's manual. - -@menu -_if__(_VAX__) -* Vax-Dependent:: VAX Dependent Features -_fi__(_VAX__) -_if__(_A29K__) -* AMD29K-Dependent:: AMD 29K Dependent Features -_fi__(_A29K__) -_if__(_H8__) -* H8/300-Dependent:: AMD 29K Dependent Features -_fi__(_H8__) -_if__(_I960__) -* i960-Dependent:: Intel 80960 Dependent Features -_fi__(_I960__) -_if__(_M680X0__) -* M68K-Dependent:: M680x0 Dependent Features -_fi__(_M680X0__) -_if__(_SPARC__) -* Sparc-Dependent:: SPARC Dependent Features -_fi__(_SPARC__) -_if__(_I80386__) -* i386-Dependent:: 80386 Dependent Features -_fi__(_I80386__) -@end menu - -_fi__(_GENERIC__) -_if__(_VAX__) -_if__(_GENERIC__) -@node Vax-Dependent, AMD29K-Dependent, Machine Dependent, Machine Dependent -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) VAX Dependent Features - -@cindex VAX support -@menu -* Vax-Opts:: VAX Command-Line Options -* VAX-float:: VAX Floating Point -* VAX-directives:: Vax Machine Directives -* VAX-opcodes:: VAX Opcodes -* VAX-branch:: VAX Branch Improvement -* VAX-operands:: VAX Operands -* VAX-no:: Not Supported on VAX -@end menu - -@node Vax-Opts, VAX-float, Vax-Dependent, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) VAX Command-Line Options - -@cindex command-line options ignored, VAX -@cindex VAX command-line options ignored -The Vax version of @code{_AS__} accepts any of the following options, -gives a warning message that the option was ignored and proceeds. -These options are for compatibility with scripts designed for other -people's assemblers. - -@table @asis -@item @kbd{-D} (Debug) -@itemx @kbd{-S} (Symbol Table) -@itemx @kbd{-T} (Token Trace) -@cindex @code{-D}, ignored on VAX -@cindex @code{-S}, ignored on VAX -@cindex @code{-T}, ignored on VAX -These are obsolete options used to debug old assemblers. - -@item @kbd{-d} (Displacement size for JUMPs) -@cindex @code{-d}, VAX option -This option expects a number following the @kbd{-d}. Like options -that expect filenames, the number may immediately follow the -@kbd{-d} (old standard) or constitute the whole of the command line -argument that follows @kbd{-d} (GNU standard). - -@item @kbd{-V} (Virtualize Interpass Temporary File) -@cindex @code{-V}, redundant on VAX -Some other assemblers use a temporary file. This option -commanded them to keep the information in active memory rather -than in a disk file. @code{_AS__} always does this, so this -option is redundant. - -@item @kbd{-J} (JUMPify Longer Branches) -@cindex @code{-J}, ignored on VAX -Many 32-bit computers permit a variety of branch instructions -to do the same job. Some of these instructions are short (and -fast) but have a limited range; others are long (and slow) but -can branch anywhere in virtual memory. Often there are 3 -flavors of branch: short, medium and long. Some other -assemblers would emit short and medium branches, unless told by -this option to emit short and long branches. - -@item @kbd{-t} (Temporary File Directory) -@cindex @code{-t}, ignored on VAX -Some other assemblers may use a temporary file, and this option -takes a filename being the directory to site the temporary -file. @code{_AS__} does not use a temporary disk file, so this -option makes no difference. @kbd{-t} needs exactly one -filename. -@end table - -@cindex VMS (VAX) options -@cindex options for VAX/VMS -@cindex VAX/VMS options -@cindex @code{-h} option, VAX/VMS -@cindex @code{-+} option, VAX/VMS -@cindex Vax-11 C compatibility -@cindex symbols with lowercase, VAX/VMS -@c FIXME! look into "I think" below, correct if needed, delete. -The Vax version of the assembler accepts two options when -compiled for VMS. They are @kbd{-h}, and @kbd{-+}. The -@kbd{-h} option prevents @code{_AS__} from modifying the -symbol-table entries for symbols that contain lowercase -characters (I think). The @kbd{-+} option causes @code{_AS__} to -print warning messages if the FILENAME part of the object file, -or any symbol name is larger than 31 characters. The @kbd{-+} -option also insertes some code following the @samp{_main} -symbol so that the object file will be compatible with Vax-11 -"C". - -@node VAX-float, VAX-directives, Vax-Opts, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) VAX Floating Point - -@cindex VAX floating point -@cindex floating point, VAX -Conversion of flonums to floating point is correct, and -compatible with previous assemblers. Rounding is -towards zero if the remainder is exactly half the least significant bit. - -@code{D}, @code{F}, @code{G} and @code{H} floating point formats -are understood. - -Immediate floating literals (@emph{e.g.} @samp{S`$6.9}) -are rendered correctly. Again, rounding is towards zero in the -boundary case. - -@cindex @code{float} directive, VAX -@cindex @code{double} directive, VAX -The @code{.float} directive produces @code{f} format numbers. -The @code{.double} directive produces @code{d} format numbers. - -@node VAX-directives, VAX-opcodes, VAX-float, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) Vax Machine Directives - -@cindex machine directives, VAX -@cindex VAX machine directives -The Vax version of the assembler supports four directives for -generating Vax floating point constants. They are described in the -table below. - -@cindex wide floating point directives, VAX -@table @code -@item .dfloat -@cindex @code{dfloat} directive, VAX -This expects zero or more flonums, separated by commas, and -assembles Vax @code{d} format 64-bit floating point constants. - -@item .ffloat -@cindex @code{ffloat} directive, VAX -This expects zero or more flonums, separated by commas, and -assembles Vax @code{f} format 32-bit floating point constants. - -@item .gfloat -@cindex @code{gfloat} directive, VAX -This expects zero or more flonums, separated by commas, and -assembles Vax @code{g} format 64-bit floating point constants. - -@item .hfloat -@cindex @code{hfloat} directive, VAX -This expects zero or more flonums, separated by commas, and -assembles Vax @code{h} format 128-bit floating point constants. - -@end table - -@node VAX-opcodes, VAX-branch, VAX-directives, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) VAX Opcodes - -@cindex VAX opcode mnemonics -@cindex opcode mnemonics, VAX -@cindex mnemonics for opcodes, VAX -All DEC mnemonics are supported. Beware that @code{case@dots{}} -instructions have exactly 3 operands. The dispatch table that -follows the @code{case@dots{}} instruction should be made with -@code{.word} statements. This is compatible with all unix -assemblers we know of. - -@node VAX-branch, VAX-operands, VAX-opcodes, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) VAX Branch Improvement - -@cindex VAX branch improvement -@cindex branch improvement, VAX -@cindex pseudo-ops for branch, VAX -Certain pseudo opcodes are permitted. They are for branch -instructions. They expand to the shortest branch instruction that -will reach the target. Generally these mnemonics are made by -substituting @samp{j} for @samp{b} at the start of a DEC mnemonic. -This feature is included both for compatibility and to help -compilers. If you don't need this feature, don't use these -opcodes. Here are the mnemonics, and the code they can expand into. - -@table @code -@item jbsb -@samp{Jsb} is already an instruction mnemonic, so we chose @samp{jbsb}. -@table @asis -@item (byte displacement) -@kbd{bsbb @dots{}} -@item (word displacement) -@kbd{bsbw @dots{}} -@item (long displacement) -@kbd{jsb @dots{}} -@end table -@item jbr -@itemx jr -Unconditional branch. -@table @asis -@item (byte displacement) -@kbd{brb @dots{}} -@item (word displacement) -@kbd{brw @dots{}} -@item (long displacement) -@kbd{jmp @dots{}} -@end table -@item j@var{COND} -@var{COND} may be any one of the conditional branches -@code{neq nequ eql eqlu gtr geq lss gtru lequ vc vs gequ cc lssu cs}. -@var{COND} may also be one of the bit tests -@code{bs bc bss bcs bsc bcc bssi bcci lbs lbc}. -@var{NOTCOND} is the opposite condition to @var{COND}. -@table @asis -@item (byte displacement) -@kbd{b@var{COND} @dots{}} -@item (word displacement) -@kbd{b@var{NOTCOND} foo ; brw @dots{} ; foo:} -@item (long displacement) -@kbd{b@var{NOTCOND} foo ; jmp @dots{} ; foo:} -@end table -@item jacb@var{X} -@var{X} may be one of @code{b d f g h l w}. -@table @asis -@item (word displacement) -@kbd{@var{OPCODE} @dots{}} -@item (long displacement) -@example -@var{OPCODE} @dots{}, foo ; -brb bar ; -foo: jmp @dots{} ; -bar: -@end example -@end table -@item jaob@var{YYY} -@var{YYY} may be one of @code{lss leq}. -@item jsob@var{ZZZ} -@var{ZZZ} may be one of @code{geq gtr}. -@table @asis -@item (byte displacement) -@kbd{@var{OPCODE} @dots{}} -@item (word displacement) -@example -@var{OPCODE} @dots{}, foo ; -brb bar ; -foo: brw @var{destination} ; -bar: -@end example -@item (long displacement) -@example -@var{OPCODE} @dots{}, foo ; -brb bar ; -foo: jmp @var{destination} ; -bar: -@end example -@end table -@item aobleq -@itemx aoblss -@itemx sobgeq -@itemx sobgtr -@table @asis -@item (byte displacement) -@kbd{@var{OPCODE} @dots{}} -@item (word displacement) -@example -@var{OPCODE} @dots{}, foo ; -brb bar ; -foo: brw @var{destination} ; -bar: -@end example -@item (long displacement) -@example -@var{OPCODE} @dots{}, foo ; -brb bar ; -foo: jmp @var{destination} ; -bar: -@end example -@end table -@end table - -@node VAX-operands, VAX-no, VAX-branch, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) VAX Operands - -@cindex VAX operand notation -@cindex operand notation, VAX -@cindex immediate character, VAX -@cindex VAX immediate character -The immediate character is @samp{$} for Unix compatibility, not -@samp{#} as DEC writes it. - -@cindex indirect character, VAX -@cindex VAX indirect character -The indirect character is @samp{*} for Unix compatibility, not -@samp{@@} as DEC writes it. - -@cindex displacement sizing character, VAX -@cindex VAX displacement sizing character -The displacement sizing character is @samp{`} (an accent grave) for -Unix compatibility, not @samp{^} as DEC writes it. The letter -preceding @samp{`} may have either case. @samp{G} is not -understood, but all other letters (@code{b i l s w}) are understood. - -@cindex register names, VAX -@cindex VAX register names -Register names understood are @code{r0 r1 r2 @dots{} r15 ap fp sp -pc}. Any case of letters will do. - -For instance -@smallexample -tstb *w`$4(r5) -@end smallexample - -Any expression is permitted in an operand. Operands are comma -separated. - -@c There is some bug to do with recognizing expressions -@c in operands, but I forget what it is. It is -@c a syntax clash because () is used as an address mode -@c and to encapsulate sub-expressions. - -@node VAX-no, , VAX-operands, Vax-Dependent -_CHAPSEC__(1+_GENERIC__) Not Supported on VAX - -@cindex VAX bitfields not supported -@cindex bitfields, not supported on VAX -Vax bit fields can not be assembled with @code{_AS__}. Someone -can add the required code if they really need it. - -_fi__(_VAX__) -_if__(_A29K__) -_if__(_GENERIC__) -@node AMD29K-Dependent, H8/300-Dependent, Vax-Dependent, Machine Dependent -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) AMD 29K Dependent Features - -@cindex AMD 29K support -@cindex 29K support -@menu -* AMD29K Options:: Options -* AMD29K Syntax:: Syntax -* AMD29K Floating Point:: Floating Point -* AMD29K Directives:: AMD 29K Machine Directives -* AMD29K Opcodes:: Opcodes -@end menu - -@node AMD29K Options, AMD29K Syntax, AMD29K-Dependent, AMD29K-Dependent -_CHAPSEC__(1+_GENERIC__) Options -@cindex AMD 29K options (none) -@cindex options for AMD29K (none) -@code{_AS__} has no additional command-line options for the AMD -29K family. - -@node AMD29K Syntax, AMD29K Floating Point, AMD29K Options, AMD29K-Dependent -_CHAPSEC__(1+_GENERIC__) Syntax -@menu -* AMD29K-Chars:: Special Characters -* AMD29K-Regs:: Register Names -@end menu - -@node AMD29K-Chars, AMD29K-Regs, AMD29K Syntax, AMD29K Syntax -_CHAPSEC__(2+_GENERIC__) Special Characters - -@cindex line comment character, AMD 29K -@cindex AMD 29K line comment character -@samp{;} is the line comment character. - -@cindex line separator, AMD 29K -@cindex AMD 29K line separator -@cindex statement separator, AMD 29K -@cindex AMD 29K statement separator -@samp{@@} can be used instead of a newline to separate statements. - -@cindex identifiers, AMD 29K -@cindex AMD 29K identifiers -The character @samp{?} is permitted in identifiers (but may not begin -an identifier). - -@node AMD29K-Regs, , AMD29K-Chars, AMD29K Syntax -_CHAPSEC__(2+_GENERIC__) Register Names - -@cindex AMD 29K register names -@cindex register names, AMD 29K -General-purpose registers are represented by predefined symbols of the -form @samp{GR@var{nnn}} (for global registers) or @samp{LR@var{nnn}} -(for local registers), where @var{nnn} represents a number between -@code{0} and @code{127}, written with no leading zeros. The leading -letters may be in either upper or lower case; for example, @samp{gr13} -and @samp{LR7} are both valid register names. - -You may also refer to general-purpose registers by specifying the -register number as the result of an expression (prefixed with @samp{%%} -to flag the expression as a register number): -@smallexample -%%@var{expression} -@end smallexample -@noindent ----where @var{expression} must be an absolute expression evaluating to a -number between @code{0} and @code{255}. The range [0, 127] refers to -global registers, and the range [128, 255] to local registers. - -@cindex special purpose registers, AMD 29K -@cindex AMD 29K special purpose registers -@cindex protected registers, AMD 29K -@cindex AMD 29K protected registers -In addition, @code{_AS__} understands the following protected -special-purpose register names for the AMD 29K family: - -@smallexample - vab chd pc0 - ops chc pc1 - cps rbp pc2 - cfg tmc mmu - cha tmr lru -@end smallexample - -These unprotected special-purpose register names are also recognized: -@smallexample - ipc alu fpe - ipa bp inte - ipb fc fps - q cr exop -@end smallexample - -@node AMD29K Floating Point, AMD29K Directives, AMD29K Syntax, AMD29K-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex floating point, AMD 29K (@sc{ieee}) -@cindex AMD 29K floating point (@sc{ieee}) -The AMD 29K family uses @sc{ieee} floating-point numbers. - -@node AMD29K Directives, AMD29K Opcodes, AMD29K Floating Point, AMD29K-Dependent -_CHAPSEC__(1+_GENERIC__) AMD 29K Machine Directives - -@cindex machine directives, AMD 29K -@cindex AMD 29K machine directives -@table @code -@item .block @var{size} , @var{fill} -@cindex @code{block} directive, AMD 29K -This directive emits @var{size} bytes, each of value @var{fill}. Both -@var{size} and @var{fill} are absolute expressions. If the comma -and @var{fill} are omitted, @var{fill} is assumed to be zero. - -In other versions of the GNU assembler, this directive is called -@samp{.space}. -@end table - -@table @code -@item .cputype -@cindex @code{cputype} directive, AMD 29K -This directive is ignored; it is accepted for compatibility with other -AMD 29K assemblers. - -@item .file -@cindex @code{file} directive, AMD 29K -This directive is ignored; it is accepted for compatibility with other -AMD 29K assemblers. - -@quotation -@emph{Warning:} in other versions of the GNU assembler, @code{.file} is -used for the directive called @code{.app-file} in the AMD 29K support. -@end quotation - -@item .line -@cindex @code{line} directive, AMD 29K -This directive is ignored; it is accepted for compatibility with other -AMD 29K assemblers. - -@item .reg @var{symbol}, @var{expression} -@cindex @code{reg} directive, AMD 29K -@code{.reg} has the same effect as @code{.lsym}; @pxref{Lsym,,@code{.lsym}}. - -@item .sect -@cindex @code{sect} directive, AMD 29K -This directive is ignored; it is accepted for compatibility with other -AMD 29K assemblers. - -@item .use @var{section name} -@cindex @code{use} directive, AMD 29K -Establishes the section and subsection for the following code; -@var{section name} may be one of @code{.text}, @code{.data}, -@code{.data1}, or @code{.lit}. With one of the first three @var{section -name} options, @samp{.use} is equivalent to the machine directive -@var{section name}; the remaining case, @samp{.use .lit}, is the same as -@samp{.data 200}. -@end table - -@node AMD29K Opcodes, , AMD29K Directives, AMD29K-Dependent -_CHAPSEC__(1+_GENERIC__) Opcodes - -@cindex AMD 29K opcodes -@cindex opcodes for AMD 29K -@code{_AS__} implements all the standard AMD 29K opcodes. No -additional pseudo-instructions are needed on this family. - -For information on the 29K machine instruction set, see @cite{Am29000 -User's Manual}, Advanced Micro Devices, Inc. - -_fi__(_A29K__) -_if__(_H8__) -_if__(_GENERIC__) -@node H8/300-Dependent, i960-Dependent, AMD29K-Dependent, Machine Dependent -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) H8/300 Dependent Features - -@cindex H8/300 support -@menu -* 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 -@end menu - -@node H8/300 Options, H8/300 Syntax, H8/300-Dependent, H8/300-Dependent -_CHAPSEC__(1+_GENERIC__) Options - -@cindex H8/300 options (none) -@cindex options, H8/300 (none) -@code{_AS__} has no additional command-line options for the Hitachi -H8/300 family. - -@node H8/300 Syntax, H8/300 Floating Point, H8/300 Options, H8/300-Dependent -_CHAPSEC__(1+_GENERIC__) Syntax -@menu -* H8/300-Chars:: Special Characters -* H8/300-Regs:: Register Names -* H8/300-Addressing:: Addressing Modes -@end menu - -@node H8/300-Chars, H8/300-Regs, H8/300 Syntax, H8/300 Syntax -_CHAPSEC__(2+_GENERIC__) Special Characters - -@cindex line comment character, H8/300 -@cindex H8/300 line comment character -@samp{;} is the line comment character. - -@cindex line separator, H8/300 -@cindex statement separator, H8/300 -@cindex H8/300 line separator -@samp{$} can be used instead of a newline to separate statements. -Therefore @emph{you may not use @samp{$} in symbol names} on the H8/300. - -@node H8/300-Regs, H8/300-Addressing, H8/300-Chars, H8/300 Syntax -_CHAPSEC__(2+_GENERIC__) Register Names - -@cindex H8/300 registers -@cindex registers, H8/300 -You can use predefined symbols of the form @samp{r@var{n}h} and -@samp{r@var{n}l} to refer to the H8/300 registers as sixteen 8-bit -general-purpose registers. @var{n} is a digit from @samp{0} to -@samp{7}); for instance, both @samp{r0h} and @samp{r7l} are valid -register names. - -You can also use the eight predefined symbols @samp{r@var{n}} to refer -to the H8/300 registers as 16-bit registers (you must use this form for -addressing). - -The two control registers are called @code{pc} (program counter; a -16-bit register) and @code{ccr} (condition code register; an 8-bit -register). @code{r7} is used as the stack pointer, and can also be -called @code{sp}. - -@node H8/300-Addressing, , H8/300-Regs, H8/300 Syntax -_CHAPSEC__(2+_GENERIC__) Addressing Modes - -@cindex addressing modes, H8/300 -@cindex H8/300 addressing modes -_AS__ understands the following addressing modes for the H8/300: -@table @code -@item r@var{n} -Register direct - -@item @@r@var{n} -Register indirect - -@item @@(@var{d}, r@var{n}) -@itemx @@(@var{d}:16, r@var{n}) -Register indirect: 16-bit displacement @var{d} from register @var{n}. -(You may specify the @samp{:16} for clarity if you wish, but it is not -required and has no effect.) - -@item @@r@var{n}+ -Register indirect with post-increment - -@item @@-r@var{n} -Register indirect with pre-decrement - -@item @code{@@}@var{aa} -@itemx @code{@@}@var{aa}:8 -@itemx @code{@@}@var{aa}:16 -Absolute address @code{aa}. You may specify the @samp{:8} or @samp{:16} -for clarity, if you wish; but @code{_AS__} neither requires this nor -uses it---the address size required is taken from context. - -@item #@var{xx} -@itemx #@var{xx}:8 -@itemx #@var{xx}:16 -Immediate data @var{xx}. You may specify the @samp{:8} or @samp{:16} -for clarity, if you wish; but @code{_AS__} neither requires this nor -uses it---the data size required is taken from context. - -@item @code{@@}@code{@@}@var{aa} -@itemx @code{@@}@code{@@}@var{aa}:8 -Memory indirect. You may specify the @samp{:8} for clarity, if you -wish; but @code{_AS__} neither requires this nor uses it. -@end table - -@node H8/300 Floating Point, H8/300 Directives, H8/300 Syntax, H8/300-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex floating point, H8/300 (@sc{ieee}) -@cindex H8/300 floating point (@sc{ieee}) -The H8/300 family uses @sc{ieee} floating-point numbers. - -@node H8/300 Directives, H8/300 Opcodes, H8/300 Floating Point, H8/300-Dependent -_CHAPSEC__(1+_GENERIC__) H8/300 Machine Directives - -@cindex H8/300 machine directives (none) -@cindex machine directives, H8/300 (none) -@cindex @code{word} directive, H8/300 -@cindex @code{int} directive, H8/300 -@code{_AS__} has no machine-dependent directives for the H8/300. -However, on this platform the @samp{.int} and @samp{.word} directives -generate 16-bit numbers. - -@node H8/300 Opcodes, , H8/300 Directives, H8/300-Dependent -_CHAPSEC__(1+_GENERIC__) Opcodes - -@cindex H8/300 opcode summary -@cindex opcode summary, H8/300 -@cindex mnemonics, H8/300 -@cindex instruction summary, H8/300 -For detailed information on the H8/300 machine instruction set, see -@cite{H8/300 Series Programming Manual} (Hitachi ADE--602--025). - -@code{_AS__} implements all the standard H8/300 opcodes. No additional -pseudo-instructions are needed on this family. - -The following table summarizes the opcodes and their arguments: -@c kluge due to lack of group outside example -@page -@smallexample -@group - Rs @r{source register} - Rd @r{destination register} - imm @r{immediate data} - x:3 @r{a bit (as a number between 0 and 7)} - d:8 @r{eight bit displacement from @code{pc}} - d:16 @r{sixteen bit displacement from @code{Rs}} - -add.b Rs,Rd biand #x:3,Rd -add.b #imm:8,Rd biand #x:3,@@Rd -add.w Rs,Rd biand #x:3,@@aa:8 -adds #1,Rd bild #x:3,Rd -adds #2,Rd bild #x:3,@@Rd -addx #imm:8,Rd bild #x:3,@@aa:8 -addx Rs,Rd bior #x:3,Rd -and #imm:8,Rd bior #x:3,@@Rd -and Rs,Rd bior #x:3,@@aa:8 -andc #imm:8,ccr bist #x:3,Rd -band #x:3,Rd bist #x:3,@@Rd -band #x:3,@@Rd bist #x:3,@@aa:8 -bra d:8 bixor #x:3,Rd -bt d:8 bixor #x:3,@@Rd -brn d:8 bixor #x:3,@@aa:8 -bf d:8 bld #x:3,Rd -bhi d:8 bld #x:3,@@Rd -bls d:8 bld #x:3,@@aa:8 -bcc d:8 bnot #x:3,Rd -bhs d:8 bnot #x:3,@@Rd -bcs d:8 bnot #x:3,@@aa:8 -blo d:8 bnot Rs,Rd -bne d:8 bnot Rs,@@Rd -beq d:8 bnot Rs,@@aa:8 -bvc d:8 bor #x:3,Rd -bvs d:8 bor #x:3,@@Rd -bpl d:8 bor #x:3,@@aa:8 -bmi d:8 bset #x:3,@@Rd -bge d:8 bset #x:3,@@aa:8 -blt d:8 bset Rs,Rd -bgt d:8 bset Rs,@@Rd -ble d:8 bset Rs,@@aa:8 -bclr #x:3,Rd bsr d:8 -bclr #x:3,@@Rd bst #x:3,Rd -bclr #x:3,@@aa:8 bst #x:3,@@Rd -bclr Rs,Rd bst #x:3,@@aa:8 -bclr Rs,@@Rd btst #x:3,Rd -@end group -@group -btst #x:3,@@Rd mov.w @@(d:16, Rs),Rd -btst #x:3,@@aa:8 mov.w @@Rs+,Rd -btst Rs,Rd mov.w @@aa:16,Rd -btst Rs,@@Rd mov.w Rs,@@Rd -btst Rs,@@aa:8 mov.w Rs,@@(d:16, Rd) -bxor #x:3,Rd mov.w Rs,@@-Rd -bxor #x:3,@@Rd mov.w Rs,@@aa:16 -bxor #x:3,@@aa:8 movfpe @@aa:16,Rd -cmp.b #imm:8,Rd movtpe Rs,@@aa:16 -cmp.b Rs,Rd mulxu Rs,Rd -cmp.w Rs,Rd neg Rs -daa Rs nop -das Rs not Rs -dec Rs or #imm:8,Rd -divxu Rs,Rd or Rs,Rd -eepmov orc #imm:8,ccr -inc Rs pop Rs -jmp @@Rs push Rs -jmp @@aa:16 rotl Rs -jmp @@@@aa rotr Rs -jsr @@Rs rotxl Rs -jsr @@aa:16 rotxr Rs -jsr @@@@aa:8 rte -ldc #imm:8,ccr rts -ldc Rs,ccr shal Rs -mov.b Rs,Rd shar Rs -mov.b #imm:8,Rd shll Rs -mov.b @@Rs,Rd shlr Rs -mov.b @@(d:16, Rs),Rd sleep -mov.b @@Rs+,Rd stc ccr,Rd -mov.b @@aa:16,Rd sub.b Rs,Rd -mov.b @@aa:8,Rd sub.w Rs,Rd -mov.b Rs,@@Rd subs #1,Rd -mov.b Rs,@@(d:16, Rd) subs #2,Rd -mov.b Rs,@@-Rd subx #imm:8,Rd -mov.b Rs,@@aa:16 subx Rs,Rd -mov.b Rs,@@aa:8 xor #imm:8,Rd -mov.w Rs,Rd xor Rs,Rd -mov.w #imm:16,Rd xorc #imm:8,ccr -mov.w @@Rs,Rd -@end group -@end smallexample - -@cindex size suffixes, H8/300 -@cindex H8/300 size suffixes -Four H8/300 instructions (@code{add}, @code{cmp}, @code{mov}, -@code{sub}) are defined with variants using the suffixes @samp{.b} and -@samp{.w} to specify the size of a memory operand. @code{_AS__} -supports these suffixes, but does not require them; since one of the -operands is always a register, @code{_AS__} can deduce the correct size. - -For example, since @code{r0} refers to a 16-bit register, -@example -mov r0,@@foo -@exdent is equivalent to -mov.w r0,@@foo -@end example - -If you use the size suffixes, @code{_AS__} will issue a warning if -there's a mismatch between the suffix and the register size. - -_fi__(_H8__) -_if__(_I960__) -_if__(_GENERIC__) -@node i960-Dependent, M68K-Dependent, H8/300-Dependent, Machine Dependent -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) Intel 80960 Dependent Features - -@cindex i960 support -@menu -* Options-i960:: i960 Command-line Options -* Floating Point-i960:: Floating Point -* Directives-i960:: i960 Machine Directives -* Opcodes for i960:: i960 Opcodes -@end menu - -@c FIXME! Add Syntax sec with discussion of bitfields here, at least so -@c long as they're not turned on for other machines than 960. -@node Options-i960, Floating Point-i960, i960-Dependent, i960-Dependent - -_CHAPSEC__(1+_GENERIC__) i960 Command-line Options - -@cindex i960 options -@cindex options, i960 -@table @code - -@item -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC -@cindex i960 architecture options -@cindex architecture options, i960 -@cindex @code{-A} options, i960 -Select the 80960 architecture. Instructions or features not supported -by the selected architecture cause fatal errors. - -@samp{-ACA} is equivalent to @samp{-ACA_A}; @samp{-AKC} is equivalent to -@samp{-AMC}. Synonyms are provided for compatibility with other tools. - -If none of these options is specified, @code{_AS__} will generate code for any -instruction or feature that is supported by @emph{some} version of the -960 (even if this means mixing architectures!). In principle, -@code{_AS__} will attempt to deduce the minimal sufficient processor -type if none is specified; depending on the object code format, the -processor type may be recorded in the object file. If it is critical -that the @code{_AS__} output match a specific architecture, specify that -architecture explicitly. - -@item -b -@cindex @code{-b} option, i960 -@cindex branch recording, i960 -@cindex i960 branch recording -Add code to collect information about conditional branches taken, for -later optimization using branch prediction bits. (The conditional branch -instructions have branch prediction bits in the CA, CB, and CC -architectures.) If @var{BR} represents a conditional branch instruction, -the following represents the code generated by the assembler when -@samp{-b} is specified: - -@smallexample - call @var{increment routine} - .word 0 # pre-counter -Label: @var{BR} - call @var{increment routine} - .word 0 # post-counter -@end smallexample - -The counter following a branch records the number of times that branch -was @emph{not} taken; the differenc between the two counters is the -number of times the branch @emph{was} taken. - -@cindex @code{gbr960}, i960 postprocessor -@cindex branch statistics table, i960 -A table of every such @code{Label} is also generated, so that the -external postprocessor @code{gbr960} (supplied by Intel) can locate all -the counters. This table is always labelled @samp{__BRANCH_TABLE__}; -this is a local symbol to permit collecting statistics for many separate -object files. The table is word aligned, and begins with a two-word -header. The first word, initialized to 0, is used in maintaining linked -lists of branch tables. The second word is a count of the number of -entries in the table, which follow immediately: each is a word, pointing -to one of the labels illustrated above. - -@c TEXI2ROFF-KILL -@ifinfo -@c END TEXI2ROFF-KILL -@example - +------------+------------+------------+ ... +------------+ - | | | | | | - | *NEXT | COUNT: N | *BRLAB 1 | | *BRLAB N | - | | | | | | - +------------+------------+------------+ ... +------------+ - - __BRANCH_TABLE__ layout -@end example -@c TEXI2ROFF-KILL -@end ifinfo -@tex -\vskip 1pc -\line{\leftskip=0pt\hskip\tableindent -\boxit{2cm}{\tt *NEXT}\boxit{2cm}{\tt COUNT: \it N}\boxit{2cm}{\tt -*BRLAB 1}\ibox{1cm}{\quad\dots}\boxit{2cm}{\tt *BRLAB \it N}\hfil} -\centerline{\it {\tt \_\_BRANCH\_TABLE\_\_} layout} -@end tex -@c END TEXI2ROFF-KILL - -The first word of the header is used to locate multiple branch tables, -since each object file may contain one. Normally the links are -maintained with a call to an initialization routine, placed at the -beginning of each function in the file. The GNU C compiler will -generate these calls automatically when you give it a @samp{-b} option. -For further details, see the documentation of @samp{gbr960}. - -@item -norelax -@cindex @code{-norelax} option, i960 -Normally, Compare-and-Branch instructions with targets that require -displacements greater than 13 bits (or that have external targets) are -replaced with the corresponding compare (or @samp{chkbit}) and branch -instructions. You can use the @samp{-norelax} option to specify that -@code{_AS__} should generate errors instead, if the target displacement -is larger than 13 bits. - -This option does not affect the Compare-and-Jump instructions; the code -emitted for them is @emph{always} adjusted when necessary (depending on -displacement size), regardless of whether you use @samp{-norelax}. -@end table - -@node Floating Point-i960, Directives-i960, Options-i960, i960-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex floating point, i960 (@sc{ieee}) -@cindex i960 floating point (@sc{ieee}) -@code{_AS__} generates @sc{ieee} floating-point numbers for the directives -@samp{.float}, @samp{.double}, @samp{.extended}, and @samp{.single}. - -@node Directives-i960, Opcodes for i960, Floating Point-i960, i960-Dependent -_CHAPSEC__(1+_GENERIC__) i960 Machine Directives - -@cindex machine directives, i960 -@cindex i960 machine directives - -@table @code -@cindex @code{bss} directive, i960 -@item .bss @var{symbol}, @var{length}, @var{align} -Reserve @var{length} bytes in the bss section for a local @var{symbol}, -aligned to the power of two specified by @var{align}. @var{length} and -@var{align} must be positive absolute expressions. This directive -differs from @samp{.lcomm} only in that it permits you to specify -an alignment. @xref{Lcomm,,@code{.lcomm}}. -@end table - -@table @code -@item .extended @var{flonums} -@cindex @code{extended} directive, i960 -@code{.extended} expects zero or more flonums, separated by commas; for -each flonum, @samp{.extended} emits an @sc{ieee} extended-format (80-bit) -floating-point number. - -@item .leafproc @var{call-lab}, @var{bal-lab} -@cindex @code{leafproc} directive, i960 -You can use the @samp{.leafproc} directive in conjunction with the -optimized @code{callj} instruction to enable faster calls of leaf -procedures. If a procedure is known to call no other procedures, you -may define an entry point that skips procedure prolog code (and that does -not depend on system-supplied saved context), and declare it as the -@var{bal-lab} using @samp{.leafproc}. If the procedure also has an -entry point that goes through the normal prolog, you can specify that -entry point as @var{call-lab}. - -A @samp{.leafproc} declaration is meant for use in conjunction with the -optimized call instruction @samp{callj}; the directive records the data -needed later to choose between converting the @samp{callj} into a -@code{bal} or a @code{call}. - -@var{call-lab} is optional; if only one argument is present, or if the -two arguments are identical, the single argument is assumed to be the -@code{bal} entry point. - -@item .sysproc @var{name}, @var{index} -@cindex @code{sysproc} directive, i960 -The @samp{.sysproc} directive defines a name for a system procedure. -After you define it using @samp{.sysproc}, you can use @var{name} to -refer to the system procedure identified by @var{index} when calling -procedures with the optimized call instruction @samp{callj}. - -Both arguments are required; @var{index} must be between 0 and 31 -(inclusive). -@end table - -@node Opcodes for i960, , Directives-i960, i960-Dependent -_CHAPSEC__(1+_GENERIC__) i960 Opcodes - -@cindex opcodes, i960 -@cindex i960 opcodes -All Intel 960 machine instructions are supported; -@pxref{Options-i960,,i960 Command-line Options} for a discussion of -selecting the instruction subset for a particular 960 -architecture.@refill - -Some opcodes are processed beyond simply emitting a single corresponding -instruction: @samp{callj}, and Compare-and-Branch or Compare-and-Jump -instructions with target displacements larger than 13 bits. - -@menu -* callj-i960:: @code{callj} -* Compare-and-branch-i960:: Compare-and-Branch -@end menu - -@node callj-i960, Compare-and-branch-i960, Opcodes for i960, Opcodes for i960 -_CHAPSEC__(2+_GENERIC__) @code{callj} - -@cindex @code{callj}, i960 pseudo-opcode -@cindex i960 @code{callj} pseudo-opcode -You can write @code{callj} to have the assembler or the linker determine -the most appropriate form of subroutine call: @samp{call}, -@samp{bal}, or @samp{calls}. If the assembly source contains -enough information---a @samp{.leafproc} or @samp{.sysproc} directive -defining the operand---then @code{_AS__} will translate the -@code{callj}; if not, it will simply emit the @code{callj}, leaving it -for the linker to resolve. - -@node Compare-and-branch-i960, , callj-i960, Opcodes for i960 -_CHAPSEC__(2+_GENERIC__) Compare-and-Branch - -@cindex i960 compare and branch instructions -@cindex compare and branch instructions, i960 -The 960 architectures provide combined Compare-and-Branch instructions -that permit you to store the branch target in the lower 13 bits of the -instruction word itself. However, if you specify a branch target far -enough away that its address won't fit in 13 bits, the assembler can -either issue an error, or convert your Compare-and-Branch instruction -into separate instructions to do the compare and the branch. - -@cindex compare and jump expansions, i960 -@cindex i960 compare and jump expansions -Whether @code{_AS__} gives an error or expands the instruction depends -on two choices you can make: whether you use the @samp{-norelax} option, -and whether you use a ``Compare and Branch'' instruction or a ``Compare -and Jump'' instruction. The ``Jump'' instructions are @emph{always} -expanded if necessary; the ``Branch'' instructions are expanded when -necessary @emph{unless} you specify @code{-norelax}---in which case -@code{_AS__} gives an error instead. - -These are the Compare-and-Branch instructions, their ``Jump'' variants, -and the instruction pairs they may expand into: - -@c TEXI2ROFF-KILL -@ifinfo -@c END TEXI2ROFF-KILL -@example - Compare and - Branch Jump Expanded to - ------ ------ ------------ - bbc chkbit; bno - bbs chkbit; bo - cmpibe cmpije cmpi; be - cmpibg cmpijg cmpi; bg - cmpibge cmpijge cmpi; bge - cmpibl cmpijl cmpi; bl - cmpible cmpijle cmpi; ble - cmpibno cmpijno cmpi; bno - cmpibne cmpijne cmpi; bne - cmpibo cmpijo cmpi; bo - cmpobe cmpoje cmpo; be - cmpobg cmpojg cmpo; bg - cmpobge cmpojge cmpo; bge - cmpobl cmpojl cmpo; bl - cmpoble cmpojle cmpo; ble - cmpobne cmpojne cmpo; bne -@end example -@c TEXI2ROFF-KILL -@end ifinfo -@tex -\hskip\tableindent -\halign{\hfil {\tt #}\quad&\hfil {\tt #}\qquad&{\tt #}\hfil\cr -\omit{\hfil\it Compare and\hfil}\span\omit&\cr -{\it Branch}&{\it Jump}&{\it Expanded to}\cr - bbc& & chkbit; bno\cr - bbs& & chkbit; bo\cr - cmpibe& cmpije& cmpi; be\cr - cmpibg& cmpijg& cmpi; bg\cr - cmpibge& cmpijge& cmpi; bge\cr - cmpibl& cmpijl& cmpi; bl\cr - cmpible& cmpijle& cmpi; ble\cr - cmpibno& cmpijno& cmpi; bno\cr - cmpibne& cmpijne& cmpi; bne\cr - cmpibo& cmpijo& cmpi; bo\cr - cmpobe& cmpoje& cmpo; be\cr - cmpobg& cmpojg& cmpo; bg\cr - cmpobge& cmpojge& cmpo; bge\cr - cmpobl& cmpojl& cmpo; bl\cr - cmpoble& cmpojle& cmpo; ble\cr - cmpobne& cmpojne& cmpo; bne\cr} -@end tex -@c END TEXI2ROFF-KILL -_fi__(_I960__) - -_if__(_M680X0__) -_if__(_GENERIC__) -@c FIXME! node conds are only sufficient for m68k alone, all, and vintage -_if__(_I960__) -@node M68K-Dependent, Sparc-Dependent, i960-Dependent, Machine Dependent -_fi__(_I960__) -_if__(!_I960__) -@node M68K-Dependent, Sparc-Dependent, Machine Dependent, Machine Dependent -_fi__(!_I960__) -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) M680x0 Dependent Features - -@cindex M680x0 support -@menu -* M68K-Opts:: M680x0 Options -* M68K-Syntax:: Syntax -* M68K-Float:: Floating Point -* M68K-Directives:: 680x0 Machine Directives -* M68K-opcodes:: Opcodes -@end menu - -@node M68K-Opts, M68K-Syntax, M68K-Dependent, M68K-Dependent -_CHAPSEC__(1+_GENERIC__) M680x0 Options - -@cindex options, M680x0 -@cindex M680x0 options -The Motorola 680x0 version of @code{_AS__} has two machine dependent options. -One shortens undefined references from 32 to 16 bits, while the -other is used to tell @code{_AS__} what kind of machine it is -assembling for. - -@cindex @code{-l} option, M680x0 -You can use the @kbd{-l} option to shorten the size of references to -undefined symbols. If the @kbd{-l} option is not given, references to -undefined symbols will be a full long (32 bits) wide. (Since @code{_AS__} -cannot know where these symbols will end up, @code{_AS__} can only allocate -space for the linker to fill in later. Since @code{_AS__} doesn't know how -far away these symbols will be, it allocates as much space as it can.) -If this option is given, the references will only be one word wide (16 -bits). This may be useful if you want the object file to be as small as -possible, and you know that the relevant symbols will be less than 17 -bits away. - -@cindex @code{-m68000} and related options, M680x0 -@cindex architecture options, M680x0 -@cindex M680x0 architecture options -The 680x0 version of @code{_AS__} is most frequently used to assemble -programs for the Motorola MC68020 microprocessor. Occasionally it is -used to assemble programs for the mostly similar, but slightly different -MC68000 or MC68010 microprocessors. You can give @code{_AS__} the options -@samp{-m68000}, @samp{-mc68000}, @samp{-m68010}, @samp{-mc68010}, -@samp{-m68020}, and @samp{-mc68020} to tell it what processor is the -target. - -@node M68K-Syntax, M68K-Float, M68K-Opts, M68K-Dependent -_CHAPSEC__(1+_GENERIC__) Syntax - -@cindex M680x0 syntax -@cindex syntax, M680x0 -@cindex M680x0 size modifiers -@cindex size modifiers, M680x0 -The 680x0 version of @code{_AS__} uses syntax similar to the Sun assembler. -Size modifiers are appended directly to the end of the opcode without an -intervening period. For example, write @samp{movl} rather than -@samp{move.l}. - -_if__(_INTERNALS__) -If @code{_AS__} is compiled with SUN_ASM_SYNTAX defined, it will also allow -Sun-style local labels of the form @samp{1$} through @samp{$9}. -_fi__(_INTERNALS__) - -In the following table @dfn{apc} stands for any of the address -registers (@samp{a0} through @samp{a7}), nothing, (@samp{}), the -Program Counter (@samp{pc}), or the zero-address relative to the -program counter (@samp{zpc}). - -@cindex M680x0 addressing modes -@cindex addressing modes, M680x0 -The following addressing modes are understood: -@table @dfn -@item Immediate -@samp{#@var{digits}} - -@item Data Register -@samp{d0} through @samp{d7} - -@item Address Register -@samp{a0} through @samp{a7} - -@item Address Register Indirect -@samp{a0@@} through @samp{a7@@} - -@item Address Register Postincrement -@samp{a0@@+} through @samp{a7@@+} - -@item Address Register Predecrement -@samp{a0@@-} through @samp{a7@@-} - -@item Indirect Plus Offset -@samp{@var{apc}@@(@var{digits})} - -@item Index -@samp{@var{apc}@@(@var{digits},@var{register}:@var{size}:@var{scale})} - -or @samp{@var{apc}@@(@var{register}:@var{size}:@var{scale})} - -@item Postindex -@samp{@var{apc}@@(@var{digits})@@(@var{digits},@var{register}:@var{size}:@var{scale})} - -or @samp{@var{apc}@@(@var{digits})@@(@var{register}:@var{size}:@var{scale})} - -@item Preindex -@samp{@var{apc}@@(@var{digits},@var{register}:@var{size}:@var{scale})@@(@var{digits})} - -or @samp{@var{apc}@@(@var{register}:@var{size}:@var{scale})@@(@var{digits})} - -@item Memory Indirect -@samp{@var{apc}@@(@var{digits})@@(@var{digits})} - -@item Absolute -@samp{@var{symbol}}, or @samp{@var{digits}} -@ignore -@c pesch@cygnus.com: gnu, rich concur the following needs careful -@c research before documenting. - , or either of the above followed -by @samp{:b}, @samp{:w}, or @samp{:l}. -@end ignore -@end table - -@node M68K-Float, M68K-Directives, M68K-Syntax, M68K-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex floating point, M680x0 -@cindex M680x0 floating point -@c FIXME is this "not too well tested" crud STILL true? -The floating point code is not too well tested, and may have -subtle bugs in it. - -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 -@item .float -@cindex @code{float} directive, M680x0 -@code{Single} precision floating point constants. - -@item .double -@cindex @code{double} directive, M680x0 -@code{Double} precision floating point constants. -@end table - -There is no directive to produce regions of memory holding -extended precision numbers, however they can be used as -immediate operands to floating-point instructions. Adding a -directive to create extended precision numbers would not be -hard, but it has not yet seemed necessary. - -@node M68K-Directives, M68K-opcodes, M68K-Float, M68K-Dependent -_CHAPSEC__(1+_GENERIC__) 680x0 Machine Directives - -@cindex M680x0 directives -@cindex directives, M680x0 -In order to be compatible with the Sun assembler the 680x0 assembler -understands the following directives. - -@table @code -@item .data1 -@cindex @code{data1} directive, M680x0 -This directive is identical to a @code{.data 1} directive. - -@item .data2 -@cindex @code{data2} directive, M680x0 -This directive is identical to a @code{.data 2} directive. - -@item .even -@cindex @code{even} directive, M680x0 -This directive is identical to a @code{.align 1} directive. -@c Is this true? does it work??? - -@item .skip -@cindex @code{skip} directive, M680x0 -This directive is identical to a @code{.space} directive. -@end table - -@node M68K-opcodes, , M68K-Directives, M68K-Dependent -_CHAPSEC__(1+_GENERIC__) Opcodes - -@cindex M680x0 opcodes -@cindex opcodes, M680x0 -@cindex instruction set, M680x0 -@c pesch@cygnus.com: I don't see any point in the following -@c paragraph. Bugs are bugs; how does saying this -@c help anyone? -@ignore -Danger: Several bugs have been found in the opcode table (and -fixed). More bugs may exist. Be careful when using obscure -instructions. -@end ignore - -@menu -* M68K-Branch:: Branch Improvement -* M68K-Chars:: Special Characters -@end menu - -@node M68K-Branch, M68K-Chars, M68K-opcodes, M68K-opcodes -_CHAPSEC__(2+_GENERIC__) Branch Improvement - -@cindex pseudo-opcodes, M680x0 -@cindex M680x0 pseudo-opcodes -@cindex branch improvement, M680x0 -@cindex M680x0 branch improvement -Certain pseudo opcodes are permitted for branch instructions. -They expand to the shortest branch instruction that will reach the -target. Generally these mnemonics are made by substituting @samp{j} for -@samp{b} at the start of a Motorola mnemonic. - -The following table summarizes the pseudo-operations. A @code{*} flags -cases that are more fully described after the table: - -@smallexample - Displacement - +--------------------------------------------------------- - | 68020 68000/10 -Pseudo-Op |BYTE WORD LONG LONG non-PC relative - +--------------------------------------------------------- - jbsr |bsrs bsr bsrl jsr jsr - jra |bras bra bral jmp jmp -* jXX |bXXs bXX bXXl bNXs;jmpl bNXs;jmp -* dbXX |dbXX dbXX dbXX; bra; jmpl -* fjXX |fbXXw fbXXw fbXXl fbNXw;jmp - -XX: condition -NX: negative of condition XX - -@end smallexample -@center @code{*}---see full description below - -@table @code -@item jbsr -@itemx jra -These are the simplest jump pseudo-operations; they always map to one -particular machine instruction, depending on the displacement to the -branch target. - -@item j@var{XX} -Here, @samp{j@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 - jhi jls jcc jcs jne jeq jvc - jvs jpl jmi jge jlt jgt jle -@end smallexample - -For the cases of non-PC relative displacements and long displacements on -the 68000 or 68010, @code{_AS__} will issue a longer code fragment in terms of -@var{NX}, the opposite condition to @var{XX}: -@smallexample - j@var{XX} foo -@end smallexample -gives -@smallexample - b@var{NX}s oof - jmp foo - oof: -@end smallexample - -@item db@var{XX} -The full family of pseudo-operations covered here is -@smallexample - dbhi dbls dbcc dbcs dbne dbeq dbvc - dbvs dbpl dbmi dbge dblt dbgt dble - dbf dbra dbt -@end smallexample - -Other than for word and byte displacements, when the source reads -@samp{db@var{XX} foo}, @code{_AS__} will emit -@smallexample - db@var{XX} oo1 - bra oo2 - oo1:jmpl foo - oo2: -@end smallexample - -@item fj@var{XX} -This family includes -@smallexample - fjne fjeq fjge fjlt fjgt fjle fjf - fjt fjgl fjgle fjnge fjngl fjngle fjngt - fjnle fjnlt fjoge fjogl fjogt fjole fjolt - fjor fjseq fjsf fjsne fjst fjueq fjuge - fjugt fjule fjult fjun -@end smallexample - -For branch targets that are not PC relative, @code{_AS__} emits -@smallexample - fb@var{NX} oof - jmp foo - oof: -@end smallexample -when it encounters @samp{fj@var{XX} foo}. - -@end table - -@node M68K-Chars, , M68K-Branch, M68K-opcodes -_CHAPSEC__(2+_GENERIC__) Special Characters - -@cindex special characters, M680x0 -@cindex M680x0 immediate character -@cindex immediate character, M680x0 -@cindex M680x0 line comment character -@cindex line comment character, M680x0 -@cindex comments, M680x0 -The immediate character is @samp{#} for Sun compatibility. The -line-comment character is @samp{|}. If a @samp{#} appears at the -beginning of a line, it is treated as a comment unless it looks like -@samp{# line file}, in which case it is treated normally. - -_fi__(_M680X0__) -_if__(0) -@c pesch@cygnus.com: conditionalize on something other than 0 when filled in. -@section 32x32 -@section Options -The 32x32 version of @code{_AS__} accepts a @kbd{-m32032} option to -specify thiat it is compiling for a 32032 processor, or a -@kbd{-m32532} to specify that it is compiling for a 32532 option. -The default (if neither is specified) is chosen when the assembler -is compiled. - -@subsection Syntax -I don't know anything about the 32x32 syntax assembled by -@code{_AS__}. Someone who undersands the processor (I've never seen -one) and the possible syntaxes should write this section. - -@subsection Floating Point -The 32x32 uses @sc{ieee} floating point numbers, but @code{_AS__} will only -create single or double precision values. I don't know if the 32x32 -understands extended precision numbers. - -@subsection 32x32 Machine Directives -The 32x32 has no machine dependent directives. - -_fi__(0) -_if__(_SPARC__) -_if__(_GENERIC__) -_if__(_I80386__&&_M680X0__) -@node Sparc-Dependent, i386-Dependent, M68K-Dependent, Machine Dependent -_fi__(_I80386__&&_M680X0__) -_if__(_I80386__&&_I960__&&!_M680X0__) -@node Sparc-Dependent, i386-Dependent, i960-Dependent, Machine Dependent -_fi__(_I80386__&&_I960__&&!_M680X0__) -_if__(_I80386__&&_A29K__&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, i386-Dependent, AMD29K-Dependent, Machine Dependent -_fi__(_I80386__&&_A29K__&&(!_I960__)&&!_M680X0__) -_if__(_I80386__&&_VAX__&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, i386-Dependent, Vax-Dependent, Machine Dependent -_fi__(_I80386__&&_VAX__&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -_if__(_I80386__&&(!_VAX__)&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, i386-Dependent, Machine Dependent, Machine Dependent -_fi__(_I80386__&&(!_VAX__)&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -_if__((!_I80386__)&&_M680X0__) -@node Sparc-Dependent, , M68K-Dependent, Machine Dependent -_fi__((!_I80386__)&&_M680X0__) -_if__((!_I80386__)&&_I960__&&!_M680X0__) -@node Sparc-Dependent, , i960-Dependent, Machine Dependent -_fi__((!_I80386__)&&_I960__&&!_M680X0__) -_if__((!_I80386__)&&_A29K__&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, , AMD29K-Dependent, Machine Dependent -_fi__((!_I80386__)&&_A29K__&&(!_I960__)&&!_M680X0__) -_if__((!_I80386__)&&_VAX__&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, , Vax-Dependent, Machine Dependent -_fi__((!_I80386__)&&_VAX__&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -_if__((!_I80386__)&&(!_VAX__)&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -@node Sparc-Dependent, , Machine Dependent, Machine Dependent -_fi__((!_I80386__)&&(!_VAX__)&&(!_A29K__)&&(!_I960__)&&!_M680X0__) -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) SPARC Dependent Features - -@cindex SPARC support -@menu -* Sparc-Opts:: Options -* Sparc-Float:: Floating Point -* Sparc-Directives:: Sparc Machine Directives -@end menu - -@node Sparc-Opts, Sparc-Float, Sparc-Dependent, Sparc-Dependent -_CHAPSEC__(1+_GENERIC__) Options - -@cindex options for SPARC (none) -@cindex SPARC options (none) -The Sparc has no machine dependent options. - -@ignore -@c FIXME: (sparc) Fill in "syntax" section! -@c subsection syntax -I don't know anything about Sparc syntax. Someone who does -will have to write this section. -@end ignore - -@node Sparc-Float, Sparc-Directives, Sparc-Opts, Sparc-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex floating point, SPARC (@sc{ieee}) -@cindex SPARC floating point (@sc{ieee}) -The Sparc uses @sc{ieee} floating-point numbers. - -@node Sparc-Directives, , Sparc-Float, Sparc-Dependent -_CHAPSEC__(1+_GENERIC__) Sparc Machine Directives - -@cindex SPARC machine directives -@cindex machine directives, SPARC -The Sparc version of @code{_AS__} supports the following additional -machine directives: - -@table @code -@item .common -@cindex @code{common} directive, SPARC -This must be followed by a symbol name, a positive number, and -@code{"bss"}. This behaves somewhat like @code{.comm}, but the -syntax is different. - -@item .half -@cindex @code{half} directive, SPARC -This is functionally identical to @code{.short}. - -@item .proc -@cindex @code{proc} directive, SPARC -This directive is ignored. Any text following it on the same -line is also ignored. - -@item .reserve -@cindex @code{reserve} directive, SPARC -This must be followed by a symbol name, a positive number, and -@code{"bss"}. This behaves somewhat like @code{.lcomm}, but the -syntax is different. - -@item .seg -@cindex @code{seg} directive, SPARC -This must be followed by @code{"text"}, @code{"data"}, or -@code{"data1"}. It behaves like @code{.text}, @code{.data}, or -@code{.data 1}. - -@item .skip -@cindex @code{skip} directive, SPARC -This is functionally identical to the @code{.space} directive. - -@item .word -@cindex @code{word} directive, SPARC -On the Sparc, the .word directive produces 32 bit values, -instead of the 16 bit values it produces on many other machines. -@end table - -_fi__(_SPARC__) -_if__(_I80386__) -_if__(_GENERIC__) -@c FIXME! Conditionalize for all combinations in this section -@node i386-Dependent, , Sparc-Dependent, Machine Dependent -_fi__(_GENERIC__) -_CHAPSEC__(0+_GENERIC__) 80386 Dependent Features - -@cindex i386 support -@cindex i80306 support -@menu -* i386-Options:: Options -* i386-Syntax:: AT&T Syntax versus Intel Syntax -* i386-Opcodes:: Opcode Naming -* i386-Regs:: Register Naming -* i386-prefixes:: Opcode Prefixes -* i386-Memory:: Memory References -* i386-jumps:: Handling of Jump Instructions -* i386-Float:: Floating Point -* i386-Notes:: Notes -@end menu - -@node i386-Options, i386-Syntax, i386-Dependent, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Options - -@cindex options for i386 (none) -@cindex i386 options (none) -The 80386 has no machine dependent options. - -@node i386-Syntax, i386-Opcodes, i386-Options, i386-Dependent -_CHAPSEC__(1+_GENERIC__) AT&T Syntax versus Intel Syntax - -@cindex i386 syntax compatibility -@cindex syntax compatibility, i386 -In order to maintain compatibility with the output of @code{_GCC__}, -@code{_AS__} supports AT&T System V/386 assembler syntax. This is quite -different from Intel syntax. We mention these differences because -almost all 80386 documents used only Intel syntax. Notable differences -between the two syntaxes are: - -@itemize @bullet -@item -@cindex immediate operands, i386 -@cindex i386 immediate operands -@cindex register operands, i386 -@cindex i386 register operands -@cindex jump/call operands, i386 -@cindex i386 jump/call operands -@cindex operand delimiters, i386 -AT&T immediate operands are preceded by @samp{$}; Intel immediate -operands are undelimited (Intel @samp{push 4} is AT&T @samp{pushl $4}). -AT&T register operands are preceded by @samp{%}; Intel register operands -are undelimited. AT&T absolute (as opposed to PC relative) jump/call -operands are prefixed by @samp{*}; they are undelimited in Intel syntax. - -@item -@cindex i386 source, destination operands -@cindex source, destination operands; i386 -AT&T and Intel syntax use the opposite order for source and destination -operands. Intel @samp{add eax, 4} is @samp{addl $4, %eax}. The -@samp{source, dest} convention is maintained for compatibility with -previous Unix assemblers. - -@item -@cindex opcode suffixes, i386 -@cindex sizes operands, i386 -@cindex i386 size suffixes -In AT&T syntax the size of memory operands is determined from the last -character of the opcode name. Opcode suffixes of @samp{b}, @samp{w}, -and @samp{l} specify byte (8-bit), word (16-bit), and long (32-bit) -memory references. Intel syntax accomplishes this by prefixes memory -operands (@emph{not} the opcodes themselves) with @samp{byte ptr}, -@samp{word ptr}, and @samp{dword ptr}. Thus, Intel @samp{mov al, byte -ptr @var{foo}} is @samp{movb @var{foo}, %al} in AT&T syntax. - -@item -@cindex return instructions, i386 -@cindex i386 jump, call, return -Immediate form long jumps and calls are -@samp{lcall/ljmp $@var{section}, $@var{offset}} in AT&T syntax; the -Intel syntax is -@samp{call/jmp far @var{section}:@var{offset}}. Also, the far return -instruction -is @samp{lret $@var{stack-adjust}} in AT&T syntax; Intel syntax is -@samp{ret far @var{stack-adjust}}. - -@item -@cindex sections, i386 -@cindex i386 sections -The AT&T assembler does not provide support for multiple section -programs. Unix style systems expect all programs to be single sections. -@end itemize - -@node i386-Opcodes, i386-Regs, i386-Syntax, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Opcode Naming - -@cindex i386 opcode naming -@cindex opcode naming, i386 -Opcode names are suffixed with one character modifiers which specify the -size of operands. The letters @samp{b}, @samp{w}, and @samp{l} specify -byte, word, and long operands. If no suffix is specified by an -instruction and it contains no memory operands then @code{_AS__} tries to -fill in the missing suffix based on the destination register operand -(the last one by convention). Thus, @samp{mov %ax, %bx} is equivalent -to @samp{movw %ax, %bx}; also, @samp{mov $1, %bx} is equivalent to -@samp{movw $1, %bx}. Note that this is incompatible with the AT&T Unix -assembler which assumes that a missing opcode suffix implies long -operand size. (This incompatibility does not affect compiler output -since compilers always explicitly specify the opcode suffix.) - -Almost all opcodes have the same names in AT&T and Intel format. There -are a few exceptions. The sign extend and zero extend instructions need -two sizes to specify them. They need a size to sign/zero extend -@emph{from} and a size to zero extend @emph{to}. This is accomplished -by using two opcode suffixes in AT&T syntax. Base names for sign extend -and zero extend are @samp{movs@dots{}} and @samp{movz@dots{}} in AT&T -syntax (@samp{movsx} and @samp{movzx} in Intel syntax). The opcode -suffixes are tacked on to this base name, the @emph{from} suffix before -the @emph{to} suffix. Thus, @samp{movsbl %al, %edx} is AT&T syntax for -``move sign extend @emph{from} %al @emph{to} %edx.'' Possible suffixes, -thus, are @samp{bl} (from byte to long), @samp{bw} (from byte to word), -and @samp{wl} (from word to long). - -@cindex conversion instructions, i386 -@cindex i386 conversion instructions -The Intel-syntax conversion instructions - -@itemize @bullet -@item -@samp{cbw} --- sign-extend byte in @samp{%al} to word in @samp{%ax}, - -@item -@samp{cwde} --- sign-extend word in @samp{%ax} to long in @samp{%eax}, - -@item -@samp{cwd} --- sign-extend word in @samp{%ax} to long in @samp{%dx:%ax}, - -@item -@samp{cdq} --- sign-extend dword in @samp{%eax} to quad in @samp{%edx:%eax}, -@end itemize - -@noindent -are called @samp{cbtw}, @samp{cwtl}, @samp{cwtd}, and @samp{cltd} in -AT&T naming. @code{_AS__} accepts either naming for these instructions. - -@cindex jump instructions, i386 -@cindex call instructions, i386 -Far call/jump instructions are @samp{lcall} and @samp{ljmp} in -AT&T syntax, but are @samp{call far} and @samp{jump far} in Intel -convention. - -@node i386-Regs, i386-prefixes, i386-Opcodes, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Register Naming - -@cindex i386 registers -@cindex registers, i386 -Register operands are always prefixes with @samp{%}. The 80386 registers -consist of - -@itemize @bullet -@item -the 8 32-bit registers @samp{%eax} (the accumulator), @samp{%ebx}, -@samp{%ecx}, @samp{%edx}, @samp{%edi}, @samp{%esi}, @samp{%ebp} (the -frame pointer), and @samp{%esp} (the stack pointer). - -@item -the 8 16-bit low-ends of these: @samp{%ax}, @samp{%bx}, @samp{%cx}, -@samp{%dx}, @samp{%di}, @samp{%si}, @samp{%bp}, and @samp{%sp}. - -@item -the 8 8-bit registers: @samp{%ah}, @samp{%al}, @samp{%bh}, -@samp{%bl}, @samp{%ch}, @samp{%cl}, @samp{%dh}, and @samp{%dl} (These -are the high-bytes and low-bytes of @samp{%ax}, @samp{%bx}, -@samp{%cx}, and @samp{%dx}) - -@item -the 6 section registers @samp{%cs} (code section), @samp{%ds} -(data section), @samp{%ss} (stack section), @samp{%es}, @samp{%fs}, -and @samp{%gs}. - -@item -the 3 processor control registers @samp{%cr0}, @samp{%cr2}, and -@samp{%cr3}. - -@item -the 6 debug registers @samp{%db0}, @samp{%db1}, @samp{%db2}, -@samp{%db3}, @samp{%db6}, and @samp{%db7}. - -@item -the 2 test registers @samp{%tr6} and @samp{%tr7}. - -@item -the 8 floating point register stack @samp{%st} or equivalently -@samp{%st(0)}, @samp{%st(1)}, @samp{%st(2)}, @samp{%st(3)}, -@samp{%st(4)}, @samp{%st(5)}, @samp{%st(6)}, and @samp{%st(7)}. -@end itemize - -@node i386-prefixes, i386-Memory, i386-Regs, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Opcode Prefixes - -@cindex i386 opcode prefixes -@cindex opcode prefixes, i386 -@cindex prefixes, i386 -Opcode prefixes are used to modify the following opcode. They are used -to repeat string instructions, to provide section overrides, to perform -bus lock operations, and to give operand and address size (16-bit -operands are specified in an instruction by prefixing what would -normally be 32-bit operands with a ``operand size'' opcode prefix). -Opcode prefixes are usually given as single-line instructions with no -operands, and must directly precede the instruction they act upon. For -example, the @samp{scas} (scan string) instruction is repeated with: -@smallexample - repne - scas -@end smallexample - -Here is a list of opcode prefixes: - -@itemize @bullet -@item -@cindex section override prefixes, i386 -Section override prefixes @samp{cs}, @samp{ds}, @samp{ss}, @samp{es}, -@samp{fs}, @samp{gs}. These are automatically added by specifying -using the @var{section}:@var{memory-operand} form for memory references. - -@item -@cindex size prefixes, i386 -Operand/Address size prefixes @samp{data16} and @samp{addr16} -change 32-bit operands/addresses into 16-bit operands/addresses. Note -that 16-bit addressing modes (i.e. 8086 and 80286 addressing modes) -are not supported (yet). - -@item -@cindex bus lock prefixes, i386 -@cindex inhibiting interrupts, i386 -The bus lock prefix @samp{lock} inhibits interrupts during -execution of the instruction it precedes. (This is only valid with -certain instructions; see a 80386 manual for details). - -@item -@cindex coprocessor wait, i386 -The wait for coprocessor prefix @samp{wait} waits for the -coprocessor to complete the current instruction. This should never be -needed for the 80386/80387 combination. - -@item -@cindex repeat prefixes, i386 -The @samp{rep}, @samp{repe}, and @samp{repne} prefixes are added -to string instructions to make them repeat @samp{%ecx} times. -@end itemize - -@node i386-Memory, i386-jumps, i386-prefixes, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Memory References - -@cindex i386 memory references -@cindex memory references, i386 -An Intel syntax indirect memory reference of the form - -@smallexample -@var{section}:[@var{base} + @var{index}*@var{scale} + @var{disp}] -@end smallexample - -@noindent -is translated into the AT&T syntax - -@smallexample -@var{section}:@var{disp}(@var{base}, @var{index}, @var{scale}) -@end smallexample - -@noindent -where @var{base} and @var{index} are the optional 32-bit base and -index registers, @var{disp} is the optional displacement, and -@var{scale}, taking the values 1, 2, 4, and 8, multiplies @var{index} -to calculate the address of the operand. If no @var{scale} is -specified, @var{scale} is taken to be 1. @var{section} specifies the -optional section register for the memory operand, and may override the -default section register (see a 80386 manual for section register -defaults). Note that section overrides in AT&T syntax @emph{must} have -be preceded by a @samp{%}. If you specify a section override which -coincides with the default section register, @code{_AS__} will @emph{not} -output any section register override prefixes to assemble the given -instruction. Thus, section overrides can be specified to emphasize which -section register is used for a given memory operand. - -Here are some examples of Intel and AT&T style memory references: - -@table @asis -@item AT&T: @samp{-4(%ebp)}, Intel: @samp{[ebp - 4]} -@var{base} is @samp{%ebp}; @var{disp} is @samp{-4}. @var{section} is -missing, and the default section is used (@samp{%ss} for addressing with -@samp{%ebp} as the base register). @var{index}, @var{scale} are both missing. - -@item AT&T: @samp{foo(,%eax,4)}, Intel: @samp{[foo + eax*4]} -@var{index} is @samp{%eax} (scaled by a @var{scale} 4); @var{disp} is -@samp{foo}. All other fields are missing. The section register here -defaults to @samp{%ds}. - -@item AT&T: @samp{foo(,1)}; Intel @samp{[foo]} -This uses the value pointed to by @samp{foo} as a memory operand. -Note that @var{base} and @var{index} are both missing, but there is only -@emph{one} @samp{,}. This is a syntactic exception. - -@item AT&T: @samp{%gs:foo}; Intel @samp{gs:foo} -This selects the contents of the variable @samp{foo} with section -register @var{section} being @samp{%gs}. -@end table - -Absolute (as opposed to PC relative) call and jump operands must be -prefixed with @samp{*}. If no @samp{*} is specified, @code{_AS__} will -always choose PC relative addressing for jump/call labels. - -Any instruction that has a memory operand @emph{must} specify its size (byte, -word, or long) with an opcode suffix (@samp{b}, @samp{w}, or @samp{l}, -respectively). - -@node i386-jumps, i386-Float, i386-Memory, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Handling of Jump Instructions - -@cindex jump optimization, i386 -@cindex i386 jump optimization -Jump instructions are always optimized to use the smallest possible -displacements. This is accomplished by using byte (8-bit) displacement -jumps whenever the target is sufficiently close. If a byte displacement -is insufficient a long (32-bit) displacement is used. We do not support -word (16-bit) displacement jumps (i.e. prefixing the jump instruction -with the @samp{addr16} opcode prefix), since the 80386 insists upon masking -@samp{%eip} to 16 bits after the word displacement is added. - -Note that the @samp{jcxz}, @samp{jecxz}, @samp{loop}, @samp{loopz}, -@samp{loope}, @samp{loopnz} and @samp{loopne} instructions only come in -byte displacements, so that it is possible that use of these -instructions (@code{_GCC__} does not use them) will cause the assembler to -print an error message (and generate incorrect code). The AT&T 80386 -assembler tries to get around this problem by expanding @samp{jcxz foo} to -@smallexample - jcxz cx_zero - jmp cx_nonzero -cx_zero: jmp foo -cx_nonzero: -@end smallexample - -@node i386-Float, i386-Notes, i386-jumps, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Floating Point - -@cindex i386 floating point -@cindex floating point, i386 -All 80387 floating point types except packed BCD are supported. -(BCD support may be added without much difficulty). These data -types are 16-, 32-, and 64- bit integers, and single (32-bit), -double (64-bit), and extended (80-bit) precision floating point. -Each supported type has an opcode suffix and a constructor -associated with it. Opcode suffixes specify operand's data -types. Constructors build these data types into memory. - -@itemize @bullet -@item -@cindex @code{float} directive, i386 -@cindex @code{single} directive, i386 -@cindex @code{double} directive, i386 -@cindex @code{tfloat} directive, i386 -Floating point constructors are @samp{.float} or @samp{.single}, -@samp{.double}, and @samp{.tfloat} for 32-, 64-, and 80-bit formats. -These correspond to opcode suffixes @samp{s}, @samp{l}, and @samp{t}. -@samp{t} stands for temporary real, and that the 80387 only supports -this format via the @samp{fldt} (load temporary real to stack top) and -@samp{fstpt} (store temporary real and pop stack) instructions. - -@item -@cindex @code{word} directive, i386 -@cindex @code{long} directive, i386 -@cindex @code{int} directive, i386 -@cindex @code{quad} directive, i386 -Integer constructors are @samp{.word}, @samp{.long} or @samp{.int}, and -@samp{.quad} for the 16-, 32-, and 64-bit integer formats. The corresponding -opcode suffixes are @samp{s} (single), @samp{l} (long), and @samp{q} -(quad). As with the temporary real format the 64-bit @samp{q} format is -only present in the @samp{fildq} (load quad integer to stack top) and -@samp{fistpq} (store quad integer and pop stack) instructions. -@end itemize - -Register to register operations do not require opcode suffixes, -so that @samp{fst %st, %st(1)} is equivalent to @samp{fstl %st, %st(1)}. - -@cindex i386 @code{fwait} instruction -@cindex @code{fwait instruction}, i386 -Since the 80387 automatically synchronizes with the 80386 @samp{fwait} -instructions are almost never needed (this is not the case for the -80286/80287 and 8086/8087 combinations). Therefore, @code{_AS__} suppresses -the @samp{fwait} instruction whenever it is implicitly selected by one -of the @samp{fn@dots{}} instructions. For example, @samp{fsave} and -@samp{fnsave} are treated identically. In general, all the @samp{fn@dots{}} -instructions are made equivalent to @samp{f@dots{}} instructions. If -@samp{fwait} is desired it must be explicitly coded. - -@node i386-Notes, , i386-Float, i386-Dependent -_CHAPSEC__(1+_GENERIC__) Notes - -@cindex i386 @code{mul}, @code{imul} instructions -@cindex @code{mul} instruction, i386 -@cindex @code{imul} instruction, i386 -There is some trickery concerning the @samp{mul} and @samp{imul} -instructions that deserves mention. The 16-, 32-, and 64-bit expanding -multiplies (base opcode @samp{0xf6}; extension 4 for @samp{mul} and 5 -for @samp{imul}) can be output only in the one operand form. Thus, -@samp{imul %ebx, %eax} does @emph{not} select the expanding multiply; -the expanding multiply would clobber the @samp{%edx} register, and this -would confuse @code{_GCC__} output. Use @samp{imul %ebx} to get the -64-bit product in @samp{%edx:%eax}. - -We have added a two operand form of @samp{imul} when the first operand -is an immediate mode expression and the second operand is a register. -This is just a shorthand, so that, multiplying @samp{%eax} by 69, for -example, can be done with @samp{imul $69, %eax} rather than @samp{imul -$69, %eax, %eax}. - -_fi__(_I80386__) -_if__(0) -@c pesch@cygnus.com: we ignore the following chapters, since internals are -@c changing rapidly. These may need to be moved to another -@c book anyhow, if we adopt the model of user/modifier -@c books. -@node Maintenance, Retargeting, _MACH_DEP__, Top -@chapter Maintaining the Assembler -[[this chapter is still being built]] - -@section Design -We had these goals, in descending priority: -@table @b -@item Accuracy. -For every program composed by a compiler, @code{_AS__} should emit -``correct'' code. This leaves some latitude in choosing addressing -modes, order of @code{relocation_info} structures in the object -file, @emph{etc}. - -@item Speed, for usual case. -By far the most common use of @code{_AS__} will be assembling compiler -emissions. - -@item Upward compatibility for existing assembler code. -Well @dots{} we don't support Vax bit fields but everything else -seems to be upward compatible. - -@item Readability. -The code should be maintainable with few surprises. (JF: ha!) - -@end table - -We assumed that disk I/O was slow and expensive while memory was -fast and access to memory was cheap. We expect the in-memory data -structures to be less than 10 times the size of the emitted object -file. (Contrast this with the C compiler where in-memory structures -might be 100 times object file size!) -This suggests: -@itemize @bullet -@item -Try to read the source file from disk only one time. For other -reasons, we keep large chunks of the source file in memory during -assembly so this is not a problem. Also the assembly algorithm -should only scan the source text once if the compiler composed the -text according to a few simple rules. -@item -Emit the object code bytes only once. Don't store values and then -backpatch later. -@item -Build the object file in memory and do direct writes to disk of -large buffers. -@end itemize - -RMS suggested a one-pass algorithm which seems to work well. By not -parsing text during a second pass considerable time is saved on -large programs (@emph{e.g.} the sort of C program @code{yacc} would -emit). - -It happened that the data structures needed to emit relocation -information to the object file were neatly subsumed into the data -structures that do backpatching of addresses after pass 1. - -Many of the functions began life as re-usable modules, loosely -connected. RMS changed this to gain speed. For example, input -parsing routines which used to work on pre-sanitized strings now -must parse raw data. Hence they have to import knowledge of the -assemblers' comment conventions @emph{etc}. - -@section Deprecated Feature(?)s -We have stopped supporting some features: -@itemize @bullet -@item -@code{.org} statements must have @b{defined} expressions. -@item -Vax Bit fields (@kbd{:} operator) are entirely unsupported. -@end itemize - -It might be a good idea to not support these features in a future release: -@itemize @bullet -@item -@kbd{#} should begin a comment, even in column 1. -@item -Why support the logical line & file concept any more? -@item -Subsections are a good candidate for flushing. -Depends on which compilers need them I guess. -@end itemize - -@section Bugs, Ideas, Further Work -Clearly the major improvement is DON'T USE A TEXT-READING -ASSEMBLER for the back end of a compiler. It is much faster to -interpret binary gobbledygook from a compiler's tables than to -ask the compiler to write out human-readable code just so the -assembler can parse it back to binary. - -Assuming you use @code{_AS__} for human written programs: here are -some ideas: -@itemize @bullet -@item -Document (here) @code{APP}. -@item -Take advantage of knowing no spaces except after opcode -to speed up @code{_AS__}. (Modify @code{app.c} to flush useless spaces: -only keep space/tabs at begin of line or between 2 -symbols.) -@item -Put pointers in this documentation to @file{a.out} documentation. -@item -Split the assembler into parts so it can gobble direct binary -from @emph{e.g.} @code{cc}. It is silly for@code{cc} to compose text -just so @code{_AS__} can parse it back to binary. -@item -Rewrite hash functions: I want a more modular, faster library. -@item -Clean up LOTS of code. -@item -Include all the non-@file{.c} files in the maintenance chapter. -@item -Document flonums. -@item -Implement flonum short literals. -@item -Change all talk of expression operands to expression quantities, -or perhaps to expression arguments. -@item -Implement pass 2. -@item -Whenever a @code{.text} or @code{.data} statement is seen, we close -of the current frag with an imaginary @code{.fill 0}. This is -because we only have one obstack for frags, and we can't grow new -frags for a new subsection, then go back to the old subsection and -append bytes to the old frag. All this nonsense goes away if we -give each subsection its own obstack. It makes code simpler in -about 10 places, but nobody has bothered to do it because C compiler -output rarely changes subsections (compared to ending frags with -relaxable addresses, which is common). -@end itemize - -@section Sources -@c The following files in the @file{_AS__} directory -@c are symbolic links to other files, of -@c the same name, in a different directory. -@c @itemize @bullet -@c @item -@c @file{atof_generic.c} -@c @item -@c @file{atof_vax.c} -@c @item -@c @file{flonum_const.c} -@c @item -@c @file{flonum_copy.c} -@c @item -@c @file{flonum_get.c} -@c @item -@c @file{flonum_multip.c} -@c @item -@c @file{flonum_normal.c} -@c @item -@c @file{flonum_print.c} -@c @end itemize - -Here is a list of the source files in the @file{_AS__} directory. - -@table @file -@item app.c -This contains the pre-processing phase, which deletes comments, -handles whitespace, etc. This was recently re-written, since app -used to be a separate program, but RMS wanted it to be inline. - -@item append.c -This is a subroutine to append a string to another string returning a -pointer just after the last @code{char} appended. (JF: All these -little routines should probably all be put in one file.) - -@item as.c -Here you will find the main program of the assembler @code{_AS__}. - -@item expr.c -This is a branch office of @file{read.c}. This understands -expressions, arguments. Inside @code{_AS__}, arguments are called -(expression) @emph{operands}. This is confusing, because we also talk -(elsewhere) about instruction @emph{operands}. Also, expression -operands are called @emph{quantities} explicitly to avoid confusion -with instruction operands. What a mess. - -@item frags.c -This implements the @b{frag} concept. Without frags, finding the -right size for branch instructions would be a lot harder. - -@item hash.c -This contains the symbol table, opcode table @emph{etc.} hashing -functions. - -@item hex_value.c -This is a table of values of digits, for use in atoi() type -functions. Could probably be flushed by using calls to strtol(), or -something similar. - -@item input-file.c -This contains Operating system dependent source file reading -routines. Since error messages often say where we are in reading -the source file, they live here too. Since @code{_AS__} is intended to -run under GNU and Unix only, this might be worth flushing. Anyway, -almost all C compilers support stdio. - -@item input-scrub.c -This deals with calling the pre-processor (if needed) and feeding the -chunks back to the rest of the assembler the right way. - -@item messages.c -This contains operating system independent parts of fatal and -warning message reporting. See @file{append.c} above. - -@item output-file.c -This contains operating system dependent functions that write an -object file for @code{_AS__}. See @file{input-file.c} above. - -@item read.c -This implements all the directives of @code{_AS__}. This also deals -with passing input lines to the machine dependent part of the -assembler. - -@item strstr.c -This is a C library function that isn't in most C libraries yet. -See @file{append.c} above. - -@item subsegs.c -This implements subsections. - -@item symbols.c -This implements symbols. - -@item write.c -This contains the code to perform relaxation, and to write out -the object file. It is mostly operating system independent, but -different OSes have different object file formats in any case. - -@item xmalloc.c -This implements @code{malloc()} or bust. See @file{append.c} above. - -@item xrealloc.c -This implements @code{realloc()} or bust. See @file{append.c} above. - -@item atof-generic.c -The following files were taken from a machine-independent subroutine -library for manipulating floating point numbers and very large -integers. - -@file{atof-generic.c} turns a string into a flonum internal format -floating-point number. - -@item flonum-const.c -This contains some potentially useful floating point numbers in -flonum format. - -@item flonum-copy.c -This copies a flonum. - -@item flonum-multip.c -This multiplies two flonums together. - -@item bignum-copy.c -This copies a bignum. - -@end table - -Here is a table of all the machine-specific files (this includes -both source and header files). Typically, there is a -@var{machine}.c file, a @var{machine}-opcode.h file, and an -atof-@var{machine}.c file. The @var{machine}-opcode.h file should -be identical to the one used by GDB (which uses it for disassembly.) - -@table @file - -@item atof-ieee.c -This contains code to turn a flonum into a ieee literal constant. -This is used by tye 680x0, 32x32, sparc, and i386 versions of @code{_AS__}. - -@item i386-opcode.h -This is the opcode-table for the i386 version of the assembler. - -@item i386.c -This contains all the code for the i386 version of the assembler. - -@item i386.h -This defines constants and macros used by the i386 version of the assembler. - -@item m-generic.h -generic 68020 header file. To be linked to m68k.h on a -non-sun3, non-hpux system. - -@item m-sun2.h -68010 header file for Sun2 workstations. Not well tested. To be linked -to m68k.h on a sun2. (See also @samp{-DSUN_ASM_SYNTAX} in the -@file{Makefile}.) - -@item m-sun3.h -68020 header file for Sun3 workstations. To be linked to m68k.h before -compiling on a Sun3 system. (See also @samp{-DSUN_ASM_SYNTAX} in the -@file{Makefile}.) - -@item m-hpux.h -68020 header file for a HPUX (system 5?) box. Which box, which -version of HPUX, etc? I don't know. - -@item m68k.h -A hard- or symbolic- link to one of @file{m-generic.h}, -@file{m-hpux.h} or @file{m-sun3.h} depending on which kind of -680x0 you are assembling for. (See also @samp{-DSUN_ASM_SYNTAX} in the -@file{Makefile}.) - -@item m68k-opcode.h -Opcode table for 68020. This is now a link to the opcode table -in the @code{GDB} source directory. - -@item m68k.c -All the mc680x0 code, in one huge, slow-to-compile file. - -@item ns32k.c -This contains the code for the ns32032/ns32532 version of the -assembler. - -@item ns32k-opcode.h -This contains the opcode table for the ns32032/ns32532 version -of the assembler. - -@item vax-inst.h -Vax specific file for describing Vax operands and other Vax-ish things. - -@item vax-opcode.h -Vax opcode table. - -@item vax.c -Vax specific parts of @code{_AS__}. Also includes the former files -@file{vax-ins-parse.c}, @file{vax-reg-parse.c} and @file{vip-op.c}. - -@item atof-vax.c -Turns a flonum into a Vax constant. - -@item vms.c -This file contains the special code needed to put out a VMS -style object file for the Vax. - -@end table - -Here is a list of the header files in the source directory. -(Warning: This section may not be very accurate. I didn't -write the header files; I just report them.) Also note that I -think many of these header files could be cleaned up or -eliminated. - -@table @file - -@item a.out.h -This describes the structures used to create the binary header data -inside the object file. Perhaps we should use the one in -@file{/usr/include}? - -@item as.h -This defines all the globally useful things, and pulls in _0__<stdio.h>_1__ -and _0__<assert.h>_1__. - -@item bignum.h -This defines macros useful for dealing with bignums. - -@item expr.h -Structure and macros for dealing with expression() - -@item flonum.h -This defines the structure for dealing with floating point -numbers. It #includes @file{bignum.h}. - -@item frags.h -This contains macro for appending a byte to the current frag. - -@item hash.h -Structures and function definitions for the hashing functions. - -@item input-file.h -Function headers for the input-file.c functions. - -@item md.h -structures and function headers for things defined in the -machine dependent part of the assembler. - -@item obstack.h -This is the GNU systemwide include file for manipulating obstacks. -Since nobody is running under real GNU yet, we include this file. - -@item read.h -Macros and function headers for reading in source files. - -@item struct-symbol.h -Structure definition and macros for dealing with the _AS__ -internal form of a symbol. - -@item subsegs.h -structure definition for dealing with the numbered subsections -of the text and data sections. - -@item symbols.h -Macros and function headers for dealing with symbols. - -@item write.h -Structure for doing section fixups. -@end table - -@comment ~subsection Test Directory -@comment (Note: The test directory seems to have disappeared somewhere -@comment along the line. If you want it, you'll probably have to find a -@comment REALLY OLD dump tape~dots{}) -@comment -@comment The ~file{test/} directory is used for regression testing. -@comment After you modify ~@code{_AS__}, you can get a quick go/nogo -@comment confidence test by running the new ~@code{_AS__} over the source -@comment files in this directory. You use a shell script ~file{test/do}. -@comment -@comment The tests in this suite are evolving. They are not comprehensive. -@comment They have, however, caught hundreds of bugs early in the debugging -@comment cycle of ~@code{_AS__}. Most test statements in this suite were naturally -@comment selected: they were used to demonstrate actual ~@code{_AS__} bugs rather -@comment than being written ~i{a prioi}. -@comment -@comment Another testing suggestion: over 30 bugs have been found simply by -@comment running examples from this manual through ~@code{_AS__}. -@comment Some examples in this manual are selected -@comment to distinguish boundary conditions; they are good for testing ~@code{_AS__}. -@comment -@comment ~subsubsection Regression Testing -@comment Each regression test involves assembling a file and comparing the -@comment actual output of ~@code{_AS__} to ``known good'' output files. Both -@comment the object file and the error/warning message file (stderr) are -@comment inspected. Optionally the ~@code{_AS__} exit status may be checked. -@comment Discrepencies are reported. Each discrepency means either that -@comment you broke some part of ~@code{_AS__} or that the ``known good'' files -@comment are now out of date and should be changed to reflect the new -@comment definition of ``good''. -@comment -@comment Each regression test lives in its own directory, in a tree -@comment rooted in the directory ~file{test/}. Each such directory -@comment has a name ending in ~file{.ret}, where `ret' stands for -@comment REgression Test. The ~file{.ret} ending allows ~code{find -@comment (1)} to find all regression tests in the tree, without -@comment needing to list them explicitly. -@comment -@comment Any ~file{.ret} directory must contain a file called -@comment ~file{input} which is the source file to assemble. During -@comment testing an object file ~file{output} is created, as well as -@comment a file ~file{stdouterr} which contains the output to both -@comment stderr and stderr. If there is a file ~file{output.good} in -@comment the directory, and if ~file{output} contains exactly the -@comment same data as ~file{output.good}, the file ~file{output} is -@comment deleted. Likewise ~file{stdouterr} is removed if it exactly -@comment matches a file ~file{stdouterr.good}. If file -@comment ~file{status.good} is present, containing a decimal number -@comment before a newline, the exit status of ~@code{_AS__} is compared -@comment to this number. If the status numbers are not equal, a file -@comment ~file{status} is written to the directory, containing the -@comment actual status as a decimal number followed by newline. -@comment -@comment Should any of the ~file{*.good} files fail to match their corresponding -@comment actual files, this is noted by a 1-line message on the screen during -@comment the regression test, and you can use ~@code{find (1)} to find any -@comment files named ~file{status}, ~file {output} or ~file{stdouterr}. -@comment -@node Retargeting, Copying, Maintenance, Top -@chapter Teaching the Assembler about a New Machine - -This chapter describes the steps required in order to make the -assembler work with another machine's assembly language. This -chapter is not complete, and only describes the steps in the -broadest terms. You should look at the source for the -currently supported machine in order to discover some of the -details that aren't mentioned here. - -You should create a new file called @file{@var{machine}.c}, and -add the appropriate lines to the file @file{Makefile} so that -you can compile your new version of the assembler. This should -be straighforward; simply add lines similar to the ones there -for the four current versions of the assembler. - -If you want to be compatible with GDB, (and the current -machine-dependent versions of the assembler), you should create -a file called @file{@var{machine}-opcode.h} which should -contain all the information about the names of the machine -instructions, their opcodes, and what addressing modes they -support. If you do this right, the assembler and GDB can share -this file, and you'll only have to write it once. Note that -while you're writing @code{_AS__}, you may want to use an -independent program (if you have access to one), to make sure -that @code{_AS__} is emitting the correct bytes. Since @code{_AS__} -and @code{GDB} share the opcode table, an incorrect opcode -table entry may make invalid bytes look OK when you disassemble -them with @code{GDB}. - -@section Functions You will Have to Write - -Your file @file{@var{machine}.c} should contain definitions for -the following functions and variables. It will need to include -some header files in order to use some of the structures -defined in the machine-independent part of the assembler. The -needed header files are mentioned in the descriptions of the -functions that will need them. - -@table @code - -@item long omagic; -This long integer holds the value to place at the beginning of -the @file{a.out} file. It is usually @samp{OMAGIC}, except on -machines that store additional information in the magic-number. - -@item char comment_chars[]; -This character array holds the values of the characters that -start a comment anywhere in a line. Comments are stripped off -automatically by the machine independent part of the -assembler. Note that the @samp{/*} will always start a -comment, and that only @samp{*/} will end a comment started by -@samp{*/}. - -@item char line_comment_chars[]; -This character array holds the values of the chars that start a -comment only if they are the first (non-whitespace) character -on a line. If the character @samp{#} does not appear in this -list, you may get unexpected results. (Various -machine-independent parts of the assembler treat the comments -@samp{#APP} and @samp{#NO_APP} specially, and assume that lines -that start with @samp{#} are comments.) - -@item char EXP_CHARS[]; -This character array holds the letters that can separate the -mantissa and the exponent of a floating point number. Typical -values are @samp{e} and @samp{E}. - -@item char FLT_CHARS[]; -This character array holds the letters that--when they appear -immediately after a leading zero--indicate that a number is a -floating-point number. (Sort of how 0x indicates that a -hexadecimal number follows.) - -@item pseudo_typeS md_pseudo_table[]; -(@var{pseudo_typeS} is defined in @file{md.h}) -This array contains a list of the machine_dependent directives -the assembler must support. It contains the name of each -pseudo op (Without the leading @samp{.}), a pointer to a -function to be called when that directive is encountered, and -an integer argument to be passed to that function. - -@item void md_begin(void) -This function is called as part of the assembler's -initialization. It should do any initialization required by -any of your other routines. - -@item int md_parse_option(char **optionPTR, int *argcPTR, char ***argvPTR) -This routine is called once for each option on the command line -that the machine-independent part of @code{_AS__} does not -understand. This function should return non-zero if the option -pointed to by @var{optionPTR} is a valid option. If it is not -a valid option, this routine should return zero. The variables -@var{argcPTR} and @var{argvPTR} are provided in case the option -requires a filename or something similar as an argument. If -the option is multi-character, @var{optionPTR} should be -advanced past the end of the option, otherwise every letter in -the option will be treated as a separate single-character -option. - -@item void md_assemble(char *string) -This routine is called for every machine-dependent -non-directive line in the source file. It does all the real -work involved in reading the opcode, parsing the operands, -etc. @var{string} is a pointer to a null-terminated string, -that comprises the input line, with all excess whitespace and -comments removed. - -@item void md_number_to_chars(char *outputPTR,long value,int nbytes) -This routine is called to turn a C long int, short int, or char -into the series of bytes that represents that number on the -target machine. @var{outputPTR} points to an array where the -result should be stored; @var{value} is the value to store; and -@var{nbytes} is the number of bytes in 'value' that should be -stored. - -@item void md_number_to_imm(char *outputPTR,long value,int nbytes) -This routine is called to turn a C long int, short int, or char -into the series of bytes that represent an immediate value on -the target machine. It is identical to the function @code{md_number_to_chars}, -except on NS32K machines.@refill - -@item void md_number_to_disp(char *outputPTR,long value,int nbytes) -This routine is called to turn a C long int, short int, or char -into the series of bytes that represent an displacement value on -the target machine. It is identical to the function @code{md_number_to_chars}, -except on NS32K machines.@refill - -@item void md_number_to_field(char *outputPTR,long value,int nbytes) -This routine is identical to @code{md_number_to_chars}, -except on NS32K machines. - -@item void md_ri_to_chars(struct relocation_info *riPTR,ri) -(@code{struct relocation_info} is defined in @file{a.out.h}) -This routine emits the relocation info in @var{ri} -in the appropriate bit-pattern for the target machine. -The result should be stored in the location pointed -to by @var{riPTR}. This routine may be a no-op unless you are -attempting to do cross-assembly. - -@item char *md_atof(char type,char *outputPTR,int *sizePTR) -This routine turns a series of digits into the appropriate -internal representation for a floating-point number. -@var{type} is a character from @var{FLT_CHARS[]} that describes -what kind of floating point number is wanted; @var{outputPTR} -is a pointer to an array that the result should be stored in; -and @var{sizePTR} is a pointer to an integer where the size (in -bytes) of the result should be stored. This routine should -return an error message, or an empty string (not (char *)0) for -success. - -@item int md_short_jump_size; -This variable holds the (maximum) size in bytes of a short (16 -bit or so) jump created by @code{md_create_short_jump()}. This -variable is used as part of the broken-word feature, and isn't -needed if the assembler is compiled with -@samp{-DWORKING_DOT_WORD}. - -@item int md_long_jump_size; -This variable holds the (maximum) size in bytes of a long (32 -bit or so) jump created by @code{md_create_long_jump()}. This -variable is used as part of the broken-word feature, and isn't -needed if the assembler is compiled with -@samp{-DWORKING_DOT_WORD}. - -@item void md_create_short_jump(char *resultPTR,long from_addr, -@code{long to_addr,fragS *frag,symbolS *to_symbol)} -This function emits a jump from @var{from_addr} to @var{to_addr} in -the array of bytes pointed to by @var{resultPTR}. If this creates a -type of jump that must be relocated, this function should call -@code{fix_new()} with @var{frag} and @var{to_symbol}. The jump -emitted by this function may be smaller than @var{md_short_jump_size}, -but it must never create a larger one. -(If it creates a smaller jump, the extra bytes of memory will not be -used.) This function is used as part of the broken-word feature, -and isn't needed if the assembler is compiled with -@samp{-DWORKING_DOT_WORD}.@refill - -@item void md_create_long_jump(char *ptr,long from_addr, -@code{long to_addr,fragS *frag,symbolS *to_symbol)} -This function is similar to the previous function, -@code{md_create_short_jump()}, except that it creates a long -jump instead of a short one. This function is used as part of -the broken-word feature, and isn't needed if the assembler is -compiled with @samp{-DWORKING_DOT_WORD}. - -@item int md_estimate_size_before_relax(fragS *fragPTR,int segment_type) -This function does the initial setting up for relaxation. This -includes forcing references to still-undefined symbols to the -appropriate addressing modes. - -@item relax_typeS md_relax_table[]; -(relax_typeS is defined in md.h) -This array describes the various machine dependent states a -frag may be in before relaxation. You will need one group of -entries for each type of addressing mode you intend to relax. - -@item void md_convert_frag(fragS *fragPTR) -(@var{fragS} is defined in @file{as.h}) -This routine does the required cleanup after relaxation. -Relaxation has changed the type of the frag to a type that can -reach its destination. This function should adjust the opcode -of the frag to use the appropriate addressing mode. -@var{fragPTR} points to the frag to clean up. - -@item void md_end(void) -This function is called just before the assembler exits. It -need not free up memory unless the operating system doesn't do -it automatically on exit. (In which case you'll also have to -track down all the other places where the assembler allocates -space but never frees it.) - -@end table - -@section External Variables You will Need to Use - -You will need to refer to or change the following external variables -from within the machine-dependent part of the assembler. - -@table @code -@item extern char flagseen[]; -This array holds non-zero values in locations corresponding to -the options that were on the command line. Thus, if the -assembler was called with @samp{-W}, @var{flagseen['W']} would -be non-zero. - -@item extern fragS *frag_now; -This pointer points to the current frag--the frag that bytes -are currently being added to. If nothing else, you will need -to pass it as an argument to various machine-independent -functions. It is maintained automatically by the -frag-manipulating functions; you should never have to change it -yourself. - -@item extern LITTLENUM_TYPE generic_bignum[]; -(@var{LITTLENUM_TYPE} is defined in @file{bignum.h}. -This is where @dfn{bignums}--numbers larger than 32 bits--are -returned when they are encountered in an expression. You will -need to use this if you need to implement directives (or -anything else) that must deal with these large numbers. -@code{Bignums} are of @code{segT} @code{SEG_BIG} (defined in -@file{as.h}, and have a positive @code{X_add_number}. The -@code{X_add_number} of a @code{bignum} is the number of -@code{LITTLENUMS} in @var{generic_bignum} that the number takes -up. - -@item extern FLONUM_TYPE generic_floating_point_number; -(@var{FLONUM_TYPE} is defined in @file{flonum.h}. -The is where @dfn{flonums}--floating-point numbers within -expressions--are returned. @code{Flonums} are of @code{segT} -@code{SEG_BIG}, and have a negative @code{X_add_number}. -@code{Flonums} are returned in a generic format. You will have -to write a routine to turn this generic format into the -appropriate floating-point format for your machine. - -@item extern int need_pass_2; -If this variable is non-zero, the assembler has encountered an -expression that cannot be assembled in a single pass. Since -the second pass isn't implemented, this flag means that the -assembler is punting, and is only looking for additional syntax -errors. (Or something like that.) - -@item extern segT now_seg; -This variable holds the value of the section the assembler is -currently assembling into. - -@end table - -@section External functions will you need - -You will find the following external functions useful (or -indispensable) when you're writing the machine-dependent part -of the assembler. - -@table @code - -@item char *frag_more(int bytes) -This function allocates @var{bytes} more bytes in the current -frag (or starts a new frag, if it can't expand the current frag -any more.) for you to store some object-file bytes in. It -returns a pointer to the bytes, ready for you to store data in. - -@item void fix_new(fragS *frag, int where, short size, symbolS *add_symbol, symbolS *sub_symbol, long offset, int pcrel) -This function stores a relocation fixup to be acted on later. -@var{frag} points to the frag the relocation belongs in; -@var{where} is the location within the frag where the relocation begins; -@var{size} is the size of the relocation, and is usually 1 (a single byte), - 2 (sixteen bits), or 4 (a longword). -The value @var{add_symbol} @minus{} @var{sub_symbol} + @var{offset}, is added to the byte(s) -at _0__@var{frag->literal[where]}_1__. If @var{pcrel} is non-zero, the address of the -location is subtracted from the result. A relocation entry is also added -to the @file{a.out} file. @var{add_symbol}, @var{sub_symbol}, and/or -@var{offset} may be NULL.@refill - -@item char *frag_var(relax_stateT type, int max_chars, int var, -@code{relax_substateT subtype, symbolS *symbol, char *opcode)} -This function creates a machine-dependent frag of type @var{type} -(usually @code{rs_machine_dependent}). -@var{max_chars} is the maximum size in bytes that the frag may grow by; -@var{var} is the current size of the variable end of the frag; -@var{subtype} is the sub-type of the frag. The sub-type is used to index into -@var{md_relax_table[]} during @code{relaxation}. -@var{symbol} is the symbol whose value should be used to when relax-ing this frag. -@var{opcode} points into a byte whose value may have to be modified if the -addressing mode used by this frag changes. It typically points into the -@var{fr_literal[]} of the previous frag, and is used to point to a location -that @code{md_convert_frag()}, may have to change.@refill - -@item void frag_wane(fragS *fragPTR) -This function is useful from within @code{md_convert_frag}. It -changes a frag to type rs_fill, and sets the variable-sized -piece of the frag to zero. The frag will never change in size -again. - -@item segT expression(expressionS *retval) -(@var{segT} is defined in @file{as.h}; @var{expressionS} is defined in @file{expr.h}) -This function parses the string pointed to by the external char -pointer @var{input_line_pointer}, and returns the section-type -of the expression. It also stores the results in the -@var{expressionS} pointed to by @var{retval}. -@var{input_line_pointer} is advanced to point past the end of -the expression. (@var{input_line_pointer} is used by other -parts of the assembler. If you modify it, be sure to restore -it to its original value.) - -@item as_warn(char *message,@dots{}) -If warning messages are disabled, this function does nothing. -Otherwise, it prints out the current file name, and the current -line number, then uses @code{fprintf} to print the -@var{message} and any arguments it was passed. - -@item as_bad(char *message,@dots{}) -This function should be called when @code{_AS__} encounters -conditions that are bad enough that @code{_AS__} should not -produce an object file, but should continue reading input and -printing warning and bad error messages. - -@item as_fatal(char *message,@dots{}) -This function prints out the current file name and line number, -prints the word @samp{FATAL:}, then uses @code{fprintf} to -print the @var{message} and any arguments it was passed. Then -the assembler exits. This function should only be used for -serious, unrecoverable errors. - -@item void float_const(int float_type) -This function reads floating-point constants from the current -input line, and calls @code{md_atof} to assemble them. It is -useful as the function to call for the directives -@samp{.single}, @samp{.double}, @samp{.float}, etc. -@var{float_type} must be a character from @var{FLT_CHARS}. - -@item void demand_empty_rest_of_line(void); -This function can be used by machine-dependent directives to -make sure the rest of the input line is empty. It prints a -warning message if there are additional characters on the line. - -@item long int get_absolute_expression(void) -This function can be used by machine-dependent directives to -read an absolute number from the current input line. It -returns the result. If it isn't given an absolute expression, -it prints a warning message and returns zero. - -@end table - - -@section The concept of Frags - -This assembler works to optimize the size of certain addressing -modes. (e.g. branch instructions) This means the size of many -pieces of object code cannot be determined until after assembly -is finished. (This means that the addresses of symbols cannot be -determined until assembly is finished.) In order to do this, -@code{_AS__} stores the output bytes as @dfn{frags}. - -Here is the definition of a frag (from @file{as.h}) -@smallexample -struct frag -@{ - long int fr_fix; - long int fr_var; - relax_stateT fr_type; - relax_substateT fr_substate; - unsigned long fr_address; - long int fr_offset; - struct symbol *fr_symbol; - char *fr_opcode; - struct frag *fr_next; - char fr_literal[]; -@} -@end smallexample - -@table @var -@item fr_fix -is the size of the fixed-size piece of the frag. - -@item fr_var -is the maximum (?) size of the variable-sized piece of the frag. - -@item fr_type -is the type of the frag. -Current types are: -rs_fill -rs_align -rs_org -rs_machine_dependent - -@item fr_substate -This stores the type of machine-dependent frag this is. (what -kind of addressing mode is being used, and what size is being -tried/will fit/etc. - -@item fr_address -@var{fr_address} is only valid after relaxation is finished. -Before relaxation, the only way to store an address is (pointer -to frag containing the address) plus (offset into the frag). - -@item fr_offset -This contains a number, whose meaning depends on the type of -the frag. -for machine_dependent frags, this contains the offset from -fr_symbol that the frag wants to go to. Thus, for branch -instructions it is usually zero. (unless the instruction was -@samp{jba foo+12} or something like that.) - -@item fr_symbol -for machine_dependent frags, this points to the symbol the frag -needs to reach. - -@item fr_opcode -This points to the location in the frag (or in a previous frag) -of the opcode for the instruction that caused this to be a frag. -@var{fr_opcode} is needed if the actual opcode must be changed -in order to use a different form of the addressing mode. -(For example, if a conditional branch only comes in size tiny, -a large-size branch could be implemented by reversing the sense -of the test, and turning it into a tiny branch over a large jump. -This would require changing the opcode.) - -@var{fr_literal} is a variable-size array that contains the -actual object bytes. A frag consists of a fixed size piece of -object data, (which may be zero bytes long), followed by a -piece of object data whose size may not have been determined -yet. Other information includes the type of the frag (which -controls how it is relaxed), - -@item fr_next -This is the next frag in the singly-linked list. This is -usually only needed by the machine-independent part of -@code{_AS__}. - -@end table -_fi__(0) - -@node Copying, Index, _MACH_DEP__, Top -@unnumbered GNU GENERAL PUBLIC LICENSE - -@cindex license -@cindex GPL -@cindex copying @code{_AS__} -@center Version 2, June 1991 - -@display -Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. -675 Mass Ave, Cambridge, MA 02139, USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display - -@unnumberedsec Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software---to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - -@iftex -@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end iftex -@ifinfo -@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end ifinfo - -@enumerate -@item -This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The ``Program'', below, -refers to any such program or work, and a ``work based on the Program'' -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term ``modification''.) Each licensee is addressed as ``you''. - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -@item -You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -@item -You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -@enumerate a -@item -You must cause the modified files to carry prominent notices -stating that you changed the files and the date of any change. - -@item -You must cause any work that you distribute or publish, that in -whole or in part contains or is derived from the Program or any -part thereof, to be licensed as a whole at no charge to all third -parties under the terms of this License. - -@item -If the modified program normally reads commands interactively -when run, you must cause it, when started running for such -interactive use in the most ordinary way, to print or display an -announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide -a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this -License. (Exception: if the Program itself is interactive but -does not normally print such an announcement, your work based on -the Program is not required to print an announcement.) -@end enumerate - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -@item -You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - -@enumerate a -@item -Accompany it with the complete corresponding machine-readable -source code, which must be distributed under the terms of Sections -1 and 2 above on a medium customarily used for software interchange; or, - -@item -Accompany it with a written offer, valid for at least three -years, to give any third party, for a charge no more than your -cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be -distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, - -@item -Accompany it with the information you received as to the offer -to distribute corresponding source code. (This alternative is -allowed only for noncommercial distribution and only if you -received the program in object code or executable form with such -an offer, in accord with Subsection b above.) -@end enumerate - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -@item -You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -@item -You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -@item -Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -@item -If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -@item -If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -@item -The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and ``any -later version'', you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -@item -If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - -@iftex -@heading NO WARRANTY -@end iftex -@ifinfo -@center NO WARRANTY -@end ifinfo - -@item -BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -@item -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. -@end enumerate - -@iftex -@heading END OF TERMS AND CONDITIONS -@end iftex -@ifinfo -@center END OF TERMS AND CONDITIONS -@end ifinfo - -@page -@unnumberedsec Applying These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the ``copyright'' line and a pointer to where the full notice is found. - -@smallexample -@var{one line to give the program's name and an idea of what it does.} -Copyright (C) 19@var{yy} @var{name of author} - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the -Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. -@end smallexample - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - -@smallexample -Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} -Gnomovision comes with ABSOLUTELY NO WARRANTY; for details -type `show w'. This is free software, and you are welcome -to redistribute it under certain conditions; type `show c' -for details. -@end smallexample - -The hypothetical commands @samp{show w} and @samp{show c} should show -the appropriate parts of the General Public License. Of course, the -commands you use may be called something other than @samp{show w} and -@samp{show c}; they could even be mouse-clicks or menu items---whatever -suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a ``copyright disclaimer'' for the program, if -necessary. Here is a sample; alter the names: - -@smallexample -Yoyodyne, Inc., hereby disclaims all copyright interest in -the program `Gnomovision' (which makes passes at compilers) -written by James Hacker. - -@var{signature of Ty Coon}, 1 April 1989 -Ty Coon, President of Vice -@end smallexample - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - -@node Index, , Copying, Top -@unnumbered Index - -@printindex cp - -@summarycontents -@contents -@bye diff --git a/gnu/usr.bin/as/doc/config.status b/gnu/usr.bin/as/doc/config.status deleted file mode 100644 index f1e7f63fdd36b..0000000000000 --- a/gnu/usr.bin/as/doc/config.status +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -# This file was generated automatically by configure. Do not edit. -# /d/users/pk/src/gnu/usr.bin/gas.1.93/gas/doc was configured as follows: -/d/users/pk/src/gnu/usr.bin/gas.1.93/./configure i386 -target=i386 -norecursion -# diff --git a/gnu/usr.bin/as/doc/configure.in b/gnu/usr.bin/as/doc/configure.in deleted file mode 100644 index f9820ea190328..0000000000000 --- a/gnu/usr.bin/as/doc/configure.in +++ /dev/null @@ -1,34 +0,0 @@ -# This file is configure.in -# -# Copyright (C) 1987-1992 Free Software Foundation, Inc. -# -# This file is part of GAS, the GNU Assembler. -# -# GAS is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# GAS is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GAS; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -# - -# This file is a shell script that supplies the information necessary -# to tailor a template configure script into the configure script -# appropriate for this directory. For more information, check any -# existing configure script. - -srctrigger=all.m4 -srcname="gas doc" - -# per-host: - -# per-target: - -# end of gas/doc/configure.in diff --git a/gnu/usr.bin/as/doc/gen.m4 b/gnu/usr.bin/as/doc/gen.m4 deleted file mode 100644 index bf444a63037fa..0000000000000 --- a/gnu/usr.bin/as/doc/gen.m4 +++ /dev/null @@ -1,14 +0,0 @@ -_divert__(-1) -<$Id: gen.m4,v 1.1 1993/10/02 21:00:19 pk Exp $> -_define__(<_GENERIC__>,<1>) In case none.m4 changes its mind abt default - -_define__(<_AOUT__>,<1>) -_define__(<_COFF__>,<1>) -_define__(<_ELF__>,<1>) - -_define__(<_I80386__>,<1>) -_define__(<_M680X0__>,<1>) -_define__(<_SPARC__>,<1>) -_define__(<_VAX__>,<1>) - -_divert__<> diff --git a/gnu/usr.bin/as/doc/h8.m4 b/gnu/usr.bin/as/doc/h8.m4 deleted file mode 100644 index ed52c857cf62b..0000000000000 --- a/gnu/usr.bin/as/doc/h8.m4 +++ /dev/null @@ -1,15 +0,0 @@ -_divert__(-1) -_define__(<_H8__>,<1>) -_define__(<_AS__>,<as83>) -_define__(<_GENERIC__>,<0>) -_define__(<_HOST__>,<H8/300>) -_define__(<_MACH_DEP__>,<H8/300-Dependent>) -_define__(<_AOUT__>,<0>) -_define__(<_BOUT__>,<0>) -_define__(<_COFF__>,<1>) -_define__(<_ELF__>,<0>) -_define__(<_DIFFTABKLUG__>,0) NO difference-table kluge -_define__(<_IEEEFLOAT__>,1) IEEE floating point -_define__(<_W32__>,0) -_define__(<_W16__>,1) 16-bit words -_divert__<> diff --git a/gnu/usr.bin/as/doc/i80386.m4 b/gnu/usr.bin/as/doc/i80386.m4 deleted file mode 100644 index e8718aa74716e..0000000000000 --- a/gnu/usr.bin/as/doc/i80386.m4 +++ /dev/null @@ -1,12 +0,0 @@ -_divert__(-1) -_define__(<_I80386__>,<1>) -_define__(<_GENERIC__>,<0>) -_define__(<_HOST__>,<Intel 80386>) -_define__(<_MACH_DEP__>,<i386-Dependent>) -_define__(<_AOUT__>,<1>) -_define__(<_BOUT__>,<0>) -_define__(<_COFF__>,<0>) -_define__(<_ELF__>,<0>) -_define__(<_W32__>,0) -_define__(<_W16__>,1) 16-bit words -_divert__<> diff --git a/gnu/usr.bin/as/doc/i960.m4 b/gnu/usr.bin/as/doc/i960.m4 deleted file mode 100644 index 1fca14725df99..0000000000000 --- a/gnu/usr.bin/as/doc/i960.m4 +++ /dev/null @@ -1,16 +0,0 @@ -_divert__(-1) -_define__(<_I960__>,<1>) -_define__(<_AOUT__>,<0>) -_define__(<_BOUT__>,<1>) -_define__(<_COFF__>,<1>) -_define__(<_AS__>,<gas960>) -_define__(<_GCC__>,<gcc960>) -_define__(<_LD__>,<gld960>) -_define__(<_GDB__>,<gdb960>) -_define__(<_HOST__>,<Intel 960>) -_define__(<_MACH_DEP__>,<i960-Dependent>) -_define__(<_DIFFTABKLUG__>,0) NO difference-table kluge -_define__(<_IEEEFLOAT__>,1) IEEE floating point -_define__(<_W32__>,1) 32-bit words -_define__(<_W16__>,0) -_divert__<> diff --git a/gnu/usr.bin/as/doc/m680x0.m4 b/gnu/usr.bin/as/doc/m680x0.m4 deleted file mode 100644 index 4013e72a3646a..0000000000000 --- a/gnu/usr.bin/as/doc/m680x0.m4 +++ /dev/null @@ -1,8 +0,0 @@ -_divert__(-1) -_define__(<_GENERIC__>,<0>) -_define__(<_M680X0__>,<1>) -_define__(<_HOST__>,<Motorola 680x0>) -_define__(<_MACH_DEP__>,<M68K-Dependent>) -_define__(<_W32__>,0) -_define__(<_W16__>,1) 16-bit words -_divert__<> diff --git a/gnu/usr.bin/as/doc/none.m4 b/gnu/usr.bin/as/doc/none.m4 deleted file mode 100644 index dfa17d3c356f3..0000000000000 --- a/gnu/usr.bin/as/doc/none.m4 +++ /dev/null @@ -1,57 +0,0 @@ -_divert__(-1) -<$Id: none.m4,v 1.1 1993/10/02 21:00:24 pk Exp $> - -Switches: - -_define__(<_ALL_ARCH__>,<0>) (Meant as most inclusive; file turning - it on is expected to also turn on - all arch-related switches including - "_GENERIC__") -_define__(<_GENERIC__>,<1>) (may not be quite all configs; - meant for "most vanilla" manual) -_define__(<_INTERNALS__>,<0>) - -_define__(<_AOUT__>,<1>) Object formats. Note we turn on one. -_define__(<_BOUT__>,<0>) -_define__(<_COFF__>,<0>) -_define__(<_ELF__>,<0>) - - Properties of the assembler -_define__(<_DIFFTABKLUG__>,1) Do we use the difference-table kluge? -_define__(<_IEEEFLOAT__>,0) IEEE floating-point? -_define__(<_W32__>,0) word is 32 bits -_define__(<_W16__>,1) word is 16 bits - -_define__(<_A29K__>,<0>) Specific architectures. Note none -_define__(<_H8__>,<0>) starts out on. -_define__(<_I80386__>,<0>) -_define__(<_I960__>,<0>) -_define__(<_M680X0__>,<0>) -_define__(<_SPARC__>,<0>) -_define__(<_VAX__>,<0>) -_define__(<_VXWORKS__>,<0>) - -Text: - -Default names; individual configs may override -Assembler: -_define__(<_AS__>,<as>) -C Compiler: -_define__(<_GCC__>,<gcc>) -Linker: -_define__(<_LD__>,<ld>) -Debugger name: -_define__(<_GDBN__>,<GDB>) -Debugger program: -_define__(<_GDBP__>,<gdb>) -Debugger init file: -_define__(<_GDBINIT__>,<.gdbinit>) - -Text for host; individual configs *should* override, but this may -catch some flubs -_define__(<_HOST__>,<machine specific>) - -"Machine Dependent" nodename -_define__(<_MACH_DEP__>,<Machine Dependent>) - -_divert__<> diff --git a/gnu/usr.bin/as/doc/pretex.m4 b/gnu/usr.bin/as/doc/pretex.m4 deleted file mode 100644 index 9a9696fb0dd2f..0000000000000 --- a/gnu/usr.bin/as/doc/pretex.m4 +++ /dev/null @@ -1,268 +0,0 @@ -divert(-1) -*-Text-*- -` Copyright (c) 1991 Free Software Foundation, Inc.' -` This file defines and documents the M4 macros used ' -` to preprocess some GNU manuals' -` $Id: pretex.m4,v 1.1 1993/10/02 21:00:25 pk Exp $' - -I. INTRODUCTION - -This collection of M4 macros is meant to help in pre-processing texinfo -files to allow configuring them by hosts; for example, the reader of an -as manual who only has access to a 386 may not really want to see crud about -VAXen. - -A preprocessor is used, rather than extending texinfo, because this -way we can hack the conditionals in only one place; otherwise we would -have to write TeX macros, update makeinfo, and update the Emacs -info-formatting functions. - -II. COMPATIBILITY - -These macros should work with GNU m4 and System V m4; they do not work -with Sun or Berkeley M4. - -III. USAGE - -A. M4 INVOCATION -Assume this file is called "pretex.m4". Then, to preprocess a -document "mybook.texinfo" you might do something like the following: - - m4 pretex.m4 none.m4 PARTIC.m4 mybook.texinfo >mybook-PARTIC.texinfo - ----where your path is set to find GNU or SysV "m4", and the other m4 -files mentioned are as follows: - - none.m4: A file that defines, as 0, all the options you might - want to turn on using the conditionals defined below. - Unlike the C preprocessor, m4 does not default - undefined macros to 0. For example, here is a "none.m4" - I have been using: - _divert__(-1) - - _define__(<_ALL_ARCH__>,<0>) - _define__(<_INTERNALS__>,<0>) - - _define__(<_AMD29K__>,<0>) - _define__(<_I80386__>,<0>) - _define__(<_I960__>,<0>) - _define__(<_M680X0__>,<0>) - _define__(<_SPARC__>,<0>) - _define__(<_VAX__>,<0>) - - _divert__<> - - PARTIC.m4: A file that turns on whichever options you actually - want the manual configured for, in this particular - instance. Its contents are similar to one or more of - the lines in "none.m4", but of course the second - argument to _define__ is <1> rather than <0>. - - This is also a convenient place to _define__ any macros - that you want to expand to different text for - different configurations---for example, the name of - the program being described. - -Naturally, these are just suggested conventions; you could put your macro -definitions in any files or combinations of files you like. - -These macros use the characters < and > as m4 quotes; if you need -these characters in your text, you will also want to use the macros -_0__ and _1__ from this package---see the description of "Quote -Handling" in the "Implementation" section below. - -B. WHAT GOES IN THE PRE-TEXINFO SOURCE - -For the most part, the text of your book. In addition, you can -have text that is included only conditionally, using the macros -_if__ and _fi__ defined below. They BOTH take an argument! This is -primarily meant for readability (so a human can more easily see what -conditional end matches what conditional beginning), but the argument -is actually used in the _fi__ as well as the _if__ implementation. -You should always give a _fi__ the same argument as its matching -_if__. Other arguments may appear to work for a while, but are almost -certain to produce the wrong output for some configurations. - -For example, here is an excerpt from the very beginning of the -documentation for GNU as, to name the info file appropriately for -different configurations: - _if__(_ALL_ARCH__) - @setfilename as.info - _fi__(_ALL_ARCH__) - _if__(_M680X0__ && !_ALL_ARCH__) - @setfilename as-m680x0.info - _fi__(_M680X0__ && !_ALL_ARCH__) - _if__(_AMD29K__ && !_ALL_ARCH__) - @setfilename as-29k.info - _fi__(_AMD29K__ && !_ALL_ARCH__) - -Note that you can use Boolean expressions in the arguments; the -expression language is that of the built-in m4 macro `eval', described -in the m4 manual. - -IV. IMPLEMENTATION - -A.PRIMITIVE RENAMING -First, we redefine m4's built-ins to avoid conflict with plain text. -The naming convention used is that our macros all begin with a single -underbar and end with two underbars. The asymmetry is meant to avoid -conflict with some other conventions (which we may want to document) that -are intended to avoid conflict, like ANSI C predefined macros. - -define(`_undefine__',defn(`undefine')) -define(`_define__',defn(`define')) -define(`_defn__',defn(`defn')) -define(`_ppf__',`_define__(`_$1__',_defn__(`$1'))_undefine__(`$1')') -_ppf__(`builtin') -_ppf__(`changecom') -_ppf__(`changequote') -_ppf__(`decr') -_ppf__(`define') -_ppf__(`defn') -_ppf__(`divert') -_ppf__(`divnum') -_ppf__(`dnl') -_ppf__(`dumpdef') -_ppf__(`errprint') -_ppf__(`esyscmd') -_ppf__(`eval') -_ppf__(`format') -_ppf__(`ifdef') -_ppf__(`ifelse') -_ppf__(`include') -_ppf__(`incr') -_ppf__(`index') -_ppf__(`len') -_ppf__(`m4exit') -_ppf__(`m4wrap') -_ppf__(`maketemp') -_ppf__(`patsubst') -_ppf__(`popdef') -_ppf__(`pushdef') -_ppf__(`regexp') -_ppf__(`shift') -_ppf__(`sinclude') -_ppf__(`substr') -_ppf__(`syscmd') -_ppf__(`sysval') -_ppf__(`traceoff') -_ppf__(`traceon') -_ppf__(`translit') -_ppf__(`undefine') -_ppf__(`undivert') -_ppf__(`unix') - -B. QUOTE HANDLING. - -The characters used as quotes by M4, by default, are unfortunately -quite likely to occur in ordinary text. To avoid surprises, we will -use the characters <> ---which are just as suggestive (more so to -Francophones, perhaps) but a little less common in text (save for -those poor Francophones. You win some, you lose some). Still, we -expect also to have to set < and > occasionally in text; to do that, -we define a macro to turn off quote handling (_0__) and a macro to -turn it back on (_1__), according to our convention. - - BEWARE: This seems to make < and > unusable as relational operations - in calls to the builtin "eval". So far I've gotten - along without; but a better choice may be possible. - -Note that we postponed this for a while, for convenience in discussing -the issue and in the primitive renaming---not to mention in defining -_0__ and _1__ themselves! However, the quote redefinitions MUST -precede the _if__ / _fi__ definitions, because M4 will expand the text -as given---if we use the wrong quotes here, we will get the wrong -quotes when we use the conditionals. - -_define__(_0__,`_changequote__(,)')_define__(_1__,`_changequote__(<,>)') -_1__ - -C. CONDITIONALS - -We define two macros, _if__ and _fi__. BOTH take arguments! This is -meant both to help the human reader match up a _fi__ with its -corresponding _if__ and to aid in the implementation. You may use the -full expression syntax supported by M4 (see docn of `eval' builtin in -the m4 manual). - -The conditional macros are carefully defined to avoid introducing -extra whitespace (i.e., blank lines or blank characters). One side -effect exists--- - - BEWARE: text following an `_if__' on the same line is - DISCARDED even if the condition is true; text - following a `_fi__' on the same line is also - always discarded. - -The recommended convention is to always place _if__ and _fi__ on a -line by themselves. This will also aid the human reader. TeX won't -care about the line breaks; as for info, you may want to insert calls -to `@refill' at the end of paragraphs containing conditionalized text, -where you don't want line breaks separating unconditional from -conditional text. info formatting will then give you nice looking -paragraphs in the info file. - -Nesting: conditionals are designed to nest, in the following way: -*nothing* is output between an outer pair of false conditionals, even -if there are true conditionals inside. A false conditional "defeats" -all conditionals within it. The counter _IF_FS__ is used to -implement this; kindly avoid redefining it directly. - -_define__(<_IF_FS__>,<0>) - -NOTE: The definitions for our "pushf" and "popf" macros use eval -rather than incr and decr, because GNU m4 (0.75) tries to call eval -for us when we say "incr" or "decr"---but doesn't notice we've changed -eval's name. - -_define__( - <_pushf__>, - <_define__(<_IF_FS__>, - _eval__((_IF_FS__)+1))>) -_define__( - <_popf__>, - <_ifelse__(0,_IF_FS__, - <<>_dnl__<>>, - <_define__(<_IF_FS__>,_eval__((_IF_FS__)-1))>)>) - -_define__( - <_if__>, - <_ifelse__(1,_eval__( ($1) ), - <<>_dnl__<>>, - <_pushf__<>_divert__(-1)>)>) -_define__( - <_fi__>, - <_ifelse__(1,_eval__( ($1) ), - <<>_dnl__<>>, - <_popf__<>_ifelse__(0,_IF_FS__, - <_divert__<>_dnl__<>>,<>)>)>) - -D. CHAPTER/SECTION MACRO -In a parametrized manual, the heading level may need to be calculated; -for example, a manual that has a chapter on machine dependencies -should be conditionally structured as follows: - - IF the manual is configured for a SINGLE machine type, use -the chapter heading for that machine type, and run headings down -from there (top level for a particular machine is chapter, then within -that we have section, subsection etc); - - ELSE, if MANY machine types are described in the chapter, -use a generic chapter heading such as "@chapter Machine Dependencies", -use "section" for the top level description of EACH machine, and run -headings down from there (top level for a particular machine is -section, then within that we have subsection, subsubsection etc). - -The macro <_CHAPSEC__> is for this purpose: its argument is evaluated (so -you can construct expressions to express choices such as above), then -expands as follows: - 0: @chapter - 1: @section - 2: @subsection - 3: @subsubsection - ...and so on. - -_define__(<_CHAPSEC__>,<@_cs__(_eval__($1))>) -_define__(<_cs__>,<_ifelse__( - 0, $1, <chapter>, - 1, $1, <section>, - <sub<>_cs__(_eval__($1 - 1))>)>) - -_divert__<>_dnl__<> diff --git a/gnu/usr.bin/as/doc/sparc.m4 b/gnu/usr.bin/as/doc/sparc.m4 deleted file mode 100644 index 121855a978657..0000000000000 --- a/gnu/usr.bin/as/doc/sparc.m4 +++ /dev/null @@ -1,8 +0,0 @@ -_divert__(-1) -_define__(<_SPARC__>,<1>) -_define__(<_HOST__>,<SPARC>) -_define__(<_MACH_DEP__>,<Sparc-Dependent>) -_define__(<_IEEEFLOAT__>,1) IEEE floating point -_define__(<_W32__>,1) 32-bit words -_define__(<_W16__>,0) -_divert__<> diff --git a/gnu/usr.bin/as/doc/vax.m4 b/gnu/usr.bin/as/doc/vax.m4 deleted file mode 100644 index 009e3343bbfe6..0000000000000 --- a/gnu/usr.bin/as/doc/vax.m4 +++ /dev/null @@ -1,7 +0,0 @@ -_divert__(-1) -_define__(<_VAX__>,<1>) -_define__(<_HOST__>,<VAX>) -_define__(<_MACH_DEP__>,<VAX-Dependent>) -_define__(<_W32__>,0) -_define__(<_W16__>,1) 16-bit words -_divert__<> diff --git a/gnu/usr.bin/as/doc/vintage.m4 b/gnu/usr.bin/as/doc/vintage.m4 deleted file mode 100644 index d5913be64f532..0000000000000 --- a/gnu/usr.bin/as/doc/vintage.m4 +++ /dev/null @@ -1,11 +0,0 @@ -_divert__(-1) -<$Id: vintage.m4,v 1.1 1993/10/02 21:00:29 pk Exp $> -_define__(<_ALL_ARCH__>,<1>) -_define__(<_GENERIC__>,<1>) In case none.m4 changes its mind abt default - -_define__(<_AOUT__>,<1>) - -_define__(<_M680X0__>,<1>) -_define__(<_SPARC__>,<1>) - -_divert__<> diff --git a/gnu/usr.bin/as/flonum-const.c b/gnu/usr.bin/as/flonum-const.c deleted file mode 100644 index 617e58529181f..0000000000000 --- a/gnu/usr.bin/as/flonum-const.c +++ /dev/null @@ -1,157 +0,0 @@ -/* flonum_const.c - Useful Flonum constants - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "flonum.h" -/* JF: I added the last entry to this table, and I'm not - sure if its right or not. Could go either way. I wish - I really understood this stuff. */ - - -const int table_size_of_flonum_powers_of_ten = 11; - -static const LITTLENUM_TYPE zero[] = { 1 }; - -/***********************************************************************\ -* * -* Warning: the low order bits may be WRONG here. * -* I took this from a suspect bc(1) script. * -* "minus_X"[] is supposed to be 10^(2^-X) expressed in base 2^16. * -* The radix point is just AFTER the highest element of the [] * -* * -* Because bc rounds DOWN for printing (I think), the lowest * -* significance littlenums should probably have 1 added to them. * -* * -\***********************************************************************/ - -/* JF: If this equals 6553/(2^16)+39321/(2^32)+... it approaches .1 */ -static const LITTLENUM_TYPE minus_1 [] = { - 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, - 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 6553 }; -static const LITTLENUM_TYPE plus_1 [] = { 10 }; - -/* JF: If this equals 655/(2^16) + 23592/(2^32) + ... it approaches .01 */ -static const LITTLENUM_TYPE minus_2 [] = { - 10485, 36700, 62914, 23592, 49807, 10485, 36700, 62914, 23592, 49807, - 10485, 36700, 62914, 23592, 49807, 10485, 36700, 62914, 23592, 655 }; -static const LITTLENUM_TYPE plus_2 [] = { 100 }; - -/* This approaches .0001 */ -static const LITTLENUM_TYPE minus_3 [] = { - 52533, 20027, 37329, 65116, 64067, 60397, 14784, 18979, 33659, 19503, - 2726, 9542, 629, 2202, 40475, 10590, 4299, 47815, 36280, 6 }; -static const LITTLENUM_TYPE plus_3 [] = { 10000 }; - -/* JF: this approaches 1e-8 */ -static const LITTLENUM_TYPE minus_4 [] = { - 22516, 49501, 54293, 19424, 60699, 6716, 24348, 22618, 23904, 21327, - 3919, 44703, 19149, 28803, 48959, 6259, 50273, 62237, 42 }; -/* This equals 1525 * 2^16 + 57600 */ -static const LITTLENUM_TYPE plus_4 [] = { 57600, 1525 }; - -/* This approaches 1e-16 */ -static const LITTLENUM_TYPE minus_5 [] = { - 22199, 45957, 17005, 26266, 10526, 16260, 55017, 35680, 40443, 19789, - 17356, 30195, 55905, 28426, 63010, 44197, 1844 }; -static const LITTLENUM_TYPE plus_5 [] = { 28609, 34546, 35 }; - -static const LITTLENUM_TYPE minus_6 [] = { - 30926, 26518, 13110, 43018, 54982, 48258, 24658, 15209, 63366, 11929, - 20069, 43857, 60487, 51 }; -static const LITTLENUM_TYPE plus_6 [] = { 61313, 34220, 16731, 11629, 1262 }; - -static const LITTLENUM_TYPE minus_7 [] = { - 29819, 14733, 21490, 40602, 31315, 65186, 2695 }; -static const LITTLENUM_TYPE plus_7 [] = { - 7937, 49002, 60772, 28216, 38893, 55975, 63988, 59711, 20227, 24 }; - -static const LITTLENUM_TYPE minus_8 [] = { - 45849, 19069, 18068, 36324, 37948, 48745, 10873, 64360, 15961, 20566, - 24178, 15922, 59427, 110 }; -static const LITTLENUM_TYPE plus_8 [] = { - 15873, 11925, 39177, 991, 14589, 19735, 25347, 65086, 53853, 938, - 37209, 47086, 33626, 23253, 32586, 42547, 9731, 59679, 590 }; - -static const LITTLENUM_TYPE minus_9 [] = { - 63601, 55221, 43562, 33661, 29067, 28203, 65417, 64352, 22462, 41110, - 12570, 28635, 23199, 50572, 28471, 27074, 46375, 64028, 13106, 63700, - 32698, 17493, 32420, 34382, 22750, 20681, 12300 }; -static const LITTLENUM_TYPE plus_9 [] = { - 63564, 61556, 29377, 54467, 18621, 28141, 36415, 61241, 47119, 30026, - 19740, 46002, 13541, 61413, 30480, 38664, 32205, 50593, 51112, 48904, - 48263, 43814, 286, 30826, 52813, 62575, 61390, 24540, 21495, 5 }; - -static const LITTLENUM_TYPE minus_10 [] = { - 50313, 34681, 1464, 25889, 19575, 41125, 17635, 4598, 49708, 13427, - 17287, 56115, 53783, 38255, 32415, 17778, 31596, 7557, 20951, 18477, - 40353, 1178, 44405, 11837, 11571, 50963, 15649, 11698, 40675, 2308, }; -static const LITTLENUM_TYPE plus_10[] = { -18520, 53764, 54535, 61910, 61962, 59843, 46270, 58053, 12473, 63785, - 2449, 43230, 50044, 47595, 10403, 35766, 32607, 1124, 24966, 35044, -25524, 23631, 18826, 14518, 58448, 14562, 49618, 5588, 25396, 28 }; - -static const LITTLENUM_TYPE minus_11 [] = { - 6223, 59909, 62437, 59960, 14652, 45336, 48800, 7647, 51962, 37982, - 60436, 58176, 26767, 8440, 9831, 48556, 20994, 14148, 6757, 17221, - 60624, 46129, 53210, 44085, 54016, 24259, 11232, 21229, 21313, 81, }; -static const LITTLENUM_TYPE plus_11 [] = { - 36159, 2055, 33615, 61362, 23581, 62454, 9748, 15275, 39284, 58636, - 16269, 42793, 47240, 45774, 50861, 48400, 9413, 40281, 4030, 9572, - 7984, 33038, 59522, 19450, 40593, 24486, 54320, 6661, 55766, 805, }; - -/* Shut up complaints about differing pointer types. They only differ - in the const attribute, but there isn't any easy way to do this - */ -#define X (LITTLENUM_TYPE *) - -const FLONUM_TYPE flonum_negative_powers_of_ten [] = { - {X zero, X zero, X zero, 0, '+'}, - {X minus_1, X minus_1 +19, X minus_1 + 19, -20, '+'}, - {X minus_2, X minus_2 +19, X minus_2 + 19, -20, '+'}, - {X minus_3, X minus_3 +19, X minus_3 + 19, -20, '+'}, - {X minus_4, X minus_4 +18, X minus_4 + 18, -20, '+'}, - {X minus_5, X minus_5 +16, X minus_5 + 16, -20, '+'}, - {X minus_6, X minus_6 +13, X minus_6 + 13, -20, '+'}, - {X minus_7, X minus_7 + 6, X minus_7 + 6, -20, '+'}, - {X minus_8, X minus_8 +13, X minus_8 + 13, -40, '+'}, - {X minus_9, X minus_9 +26, X minus_9 + 26, -80, '+'}, - {X minus_10, X minus_10+29, X minus_10 + 29,-136, '+'}, - {X minus_11, X minus_11+29, X minus_11 + 29,-242, '+'}, -}; - -const FLONUM_TYPE flonum_positive_powers_of_ten [] = { - {X zero, X zero, X zero, 0, '+'}, - {X plus_1, X plus_1 + 0, X plus_1 + 0, 0, '+'}, - {X plus_2, X plus_2 + 0, X plus_2 + 0, 0, '+'}, - {X plus_3, X plus_3 + 0, X plus_3 + 0, 0, '+'}, - {X plus_4, X plus_4 + 1, X plus_4 + 1, 0, '+'}, - {X plus_5, X plus_5 + 2, X plus_5 + 2, 1, '+'}, - {X plus_6, X plus_6 + 4, X plus_6 + 4, 2, '+'}, - {X plus_7, X plus_7 + 9, X plus_7 + 9, 4, '+'}, - {X plus_8, X plus_8 + 18, X plus_8 + 18, 8, '+'}, - {X plus_9, X plus_9 + 29, X plus_9 + 29, 24, '+'}, - {X plus_10, X plus_10 + 29, X plus_10 + 29, 77, '+'}, - {X plus_11, X plus_11 + 29, X plus_11 + 29, 183, '+'}, -}; - -#ifdef VMS -dummy1() -{ -} -#endif -/* end: flonum_const.c */ diff --git a/gnu/usr.bin/as/flonum-copy.c b/gnu/usr.bin/as/flonum-copy.c deleted file mode 100644 index 3a51f06d7efb0..0000000000000 --- a/gnu/usr.bin/as/flonum-copy.c +++ /dev/null @@ -1,76 +0,0 @@ -/* flonum_copy.c - copy a flonum - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "flonum.h" -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#define bcopy(from,to,n) memcpy(to,from,n) -#endif - -void -flonum_copy (in, out) - FLONUM_TYPE * in; - FLONUM_TYPE * out; -{ - int in_length; /* 0 origin */ - int out_length; /* 0 origin */ - - out -> sign = in -> sign; - in_length = in -> leader - in -> low; - if (in_length < 0) - { - out -> leader = out -> low - 1; /* 0.0 case */ - } - else - { - out_length = out -> high - out -> low; - /* - * Assume no GAPS in packing of littlenums. - * I.e. sizeof(array) == sizeof(element) * number_of_elements. - */ - if (in_length <= out_length) - { - { - /* - * For defensive programming, zero any high-order littlenums we don't need. - * This is destroying evidence and wasting time, so why bother??? - */ - if (in_length < out_length) - { - bzero ((char *)(out->low + in_length + 1), out_length - in_length); - } - } - bcopy ((char *)(in->low), (char *)(out->low), (int)((in_length + 1) * sizeof(LITTLENUM_TYPE))); - out -> exponent = in -> exponent; - out -> leader = in -> leader - in -> low + out -> low; - } - else - { - int shorten; /* 1-origin. Number of littlenums we drop. */ - - shorten = in_length - out_length; - /* Assume out_length >= 0 ! */ - bcopy ((char *)(in->low + shorten),(char *)( out->low), (int)((out_length + 1) * sizeof(LITTLENUM_TYPE))); - out -> leader = out -> high; - out -> exponent = in -> exponent + shorten; - } - } /* if any significant bits */ -} - -/* end: flonum_copy.c */ diff --git a/gnu/usr.bin/as/md.h b/gnu/usr.bin/as/md.h deleted file mode 100644 index 681d027e52bc8..0000000000000 --- a/gnu/usr.bin/as/md.h +++ /dev/null @@ -1,57 +0,0 @@ -/* md.h -machine dependent- */ - -/* Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of Gas, the GNU Assembler. - -The GNU assembler is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU Assembler General -Public License for full details. - -Everyone is granted permission to copy, modify and redistribute -the GNU Assembler, but only under the conditions described in the -GNU Assembler General Public License. A copy of this license is -supposed to have been given to you along with the GNU Assembler -so you can know your rights and responsibilities. It should be -in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. */ - -/* In theory (mine, at least!) the machine dependent part of the assembler - should only have to include one file. This one. -- JF */ - -/* JF added this here */ -typedef struct { - char * poc_name; /* assembler mnemonic, lower case, no '.' */ - void (*poc_handler)(); /* Do the work */ - int poc_val; /* Value to pass to handler */ -} -pseudo_typeS; -extern const pseudo_typeS md_pseudo_table[]; - -/* JF moved this here from as.h under the theory that nobody except MACHINE.c - and write.c care about it anyway. */ - -typedef struct -{ - long rlx_forward; /* Forward reach. Signed number. > 0. */ - long rlx_backward; /* Backward reach. Signed number. < 0. */ - unsigned char rlx_length; /* Bytes length of this address. */ - relax_substateT rlx_more; /* Next longer relax-state. */ - /* 0 means there is no 'next' relax-state. */ -} -relax_typeS; - -extern const relax_typeS md_relax_table[]; /* Define it in MACHINE.c */ - -char * md_atof(); -void md_assemble(); -void md_begin(); -void md_convert_frag(); -void md_end(); -int md_estimate_size_before_relax(); -void md_number_to_chars(); - -/* end: md.h */ diff --git a/gnu/usr.bin/as/objrecdef.h b/gnu/usr.bin/as/objrecdef.h deleted file mode 100644 index fca8af40f5675..0000000000000 --- a/gnu/usr.bin/as/objrecdef.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * - * $OBJRECDEF - * Generated automatically by "vms_struct Version 1.00" - * Created from VMS definition file "objrecdef.mar" - * Mon Oct 14 14:01:29 1985 - * - */ -struct OBJREC { - unsigned char obj$b_rectyp; - unsigned char obj$b_subtyp; - unsigned char obj$b_mhd_strlv; - unsigned char obj$b_mhd_recsz[2]; - unsigned char obj$t_mhd_name[1]; - }; - -#define OBJ$C_HDR 0 -#define OBJ$C_HDR_MHD 0 -#define OBJ$C_HDR_LNM 1 -#define OBJ$C_HDR_SRC 2 -#define OBJ$C_HDR_TTL 3 -#define OBJ$C_HDR_CPR 4 -#define OBJ$C_HDR_MTC 5 -#define OBJ$C_HDR_GTX 6 -#define OBJ$C_GSD 1 -#define OBJ$C_GSD_PSC 0 -#define OBJ$C_GSD_SYM 1 -#define OBJ$C_GSD_EPM 2 -#define OBJ$C_GSD_PRO 3 -#define OBJ$C_GSD_SYMW 4 -#define OBJ$C_GSD_EPMW 5 -#define OBJ$C_GSD_PROW 6 -#define OBJ$C_GSD_IDC 7 -#define OBJ$C_GSD_ENV 8 -#define OBJ$C_GSD_LSY 9 -#define OBJ$C_GSD_LEPM 10 -#define OBJ$C_GSD_LPRO 11 -#define OBJ$C_GSD_SPSC 12 -#define OBJ$C_TIR 2 -#define OBJ$C_EOM 3 -#define OBJ$C_DBG 4 -#define OBJ$C_TBT 5 -#define OBJ$C_LNK 6 -#define OBJ$C_EOMW 7 -#define OBJ$C_MAXRECTYP 7 -#define OBJ$K_SUBTYP 1 -#define OBJ$C_SUBTYP 1 -#define OBJ$C_MAXRECSIZ 2048 -#define OBJ$C_STRLVL 0 -#define OBJ$C_SYMSIZ 31 -#define OBJ$C_STOREPLIM -1 -#define OBJ$C_PSCALILIM 9 - -#define MHD$C_MHD 0 -#define MHD$C_LNM 1 -#define MHD$C_SRC 2 -#define MHD$C_TTL 3 -#define MHD$C_CPR 4 -#define MHD$C_MTC 5 -#define MHD$C_GTX 6 -#define MHD$C_MAXHDRTYP 6 - -#define GSD$K_ENTRIES 1 -#define GSD$C_ENTRIES 1 -#define GSD$C_PSC 0 -#define GSD$C_SYM 1 -#define GSD$C_EPM 2 -#define GSD$C_PRO 3 -#define GSD$C_SYMW 4 -#define GSD$C_EPMW 5 -#define GSD$C_PROW 6 -#define GSD$C_IDC 7 -#define GSD$C_ENV 8 -#define GSD$C_LSY 9 -#define GSD$C_LEPM 10 -#define GSD$C_LPRO 11 -#define GSD$C_SPSC 12 -#define GSD$C_SYMV 13 -#define GSD$C_EPMV 14 -#define GSD$C_PROV 15 -#define GSD$C_MAXRECTYP 15 - -#define GSY$M_WEAK 1 -#define GSY$M_DEF 2 -#define GSY$M_UNI 4 -#define GSY$M_REL 8 - -#define GPS$M_PIC 1 -#define GPS$M_LIB 2 -#define GPS$M_OVR 4 -#define GPS$M_REL 8 -#define GPS$M_GBL 16 -#define GPS$M_SHR 32 -#define GPS$M_EXE 64 -#define GPS$M_RD 128 -#define GPS$M_WRT 256 -#define GPS$M_VEC 512 -#define GPS$K_NAME 9 -#define GPS$C_NAME 9 - -#define TIR$C_STA_GBL 0 -#define TIR$C_STA_SB 1 -#define TIR$C_STA_SW 2 -#define TIR$C_STA_LW 3 -#define TIR$C_STA_PB 4 -#define TIR$C_STA_PW 5 -#define TIR$C_STA_PL 6 -#define TIR$C_STA_UB 7 -#define TIR$C_STA_UW 8 -#define TIR$C_STA_BFI 9 -#define TIR$C_STA_WFI 10 -#define TIR$C_STA_LFI 11 -#define TIR$C_STA_EPM 12 -#define TIR$C_STA_CKARG 13 -#define TIR$C_STA_WPB 14 -#define TIR$C_STA_WPW 15 -#define TIR$C_STA_WPL 16 -#define TIR$C_STA_LSY 17 -#define TIR$C_STA_LIT 18 -#define TIR$C_STA_LEPM 19 -#define TIR$C_MAXSTACOD 19 -#define TIR$C_MINSTOCOD 20 -#define TIR$C_STO_SB 20 -#define TIR$C_STO_SW 21 -#define TIR$C_STO_L 22 -#define TIR$C_STO_BD 23 -#define TIR$C_STO_WD 24 -#define TIR$C_STO_LD 25 -#define TIR$C_STO_LI 26 -#define TIR$C_STO_PIDR 27 -#define TIR$C_STO_PICR 28 -#define TIR$C_STO_RSB 29 -#define TIR$C_STO_RSW 30 -#define TIR$C_STO_RL 31 -#define TIR$C_STO_VPS 32 -#define TIR$C_STO_USB 33 -#define TIR$C_STO_USW 34 -#define TIR$C_STO_RUB 35 -#define TIR$C_STO_RUW 36 -#define TIR$C_STO_B 37 -#define TIR$C_STO_W 38 -#define TIR$C_STO_RB 39 -#define TIR$C_STO_RW 40 -#define TIR$C_STO_RIVB 41 -#define TIR$C_STO_PIRR 42 -#define TIR$C_MAXSTOCOD 42 -#define TIR$C_MINOPRCOD 50 -#define TIR$C_OPR_NOP 50 -#define TIR$C_OPR_ADD 51 -#define TIR$C_OPR_SUB 52 -#define TIR$C_OPR_MUL 53 -#define TIR$C_OPR_DIV 54 -#define TIR$C_OPR_AND 55 -#define TIR$C_OPR_IOR 56 -#define TIR$C_OPR_EOR 57 -#define TIR$C_OPR_NEG 58 -#define TIR$C_OPR_COM 59 -#define TIR$C_OPR_INSV 60 -#define TIR$C_OPR_ASH 61 -#define TIR$C_OPR_USH 62 -#define TIR$C_OPR_ROT 63 -#define TIR$C_OPR_SEL 64 -#define TIR$C_OPR_REDEF 65 -#define TIR$C_OPR_DFLIT 66 -#define TIR$C_MAXOPRCOD 66 -#define TIR$C_MINCTLCOD 80 -#define TIR$C_CTL_SETRB 80 -#define TIR$C_CTL_AUGRB 81 -#define TIR$C_CTL_DFLOC 82 -#define TIR$C_CTL_STLOC 83 -#define TIR$C_CTL_STKDL 84 -#define TIR$C_MAXCTLCOD 84 - -/* - * Debugger symbol definitions: These are done by hand, as no - * machine-readable version seems - * to be available. - */ -#define DST$C_C 7 /* Language == "C" */ -#define DST$C_VERSION 153 -#define DST$C_SOURCE 155 /* Source file */ -#define DST$C_PROLOG 162 -#define DST$C_BLKBEG 176 /* Beginning of block */ -#define DST$C_BLKEND 177 /* End of block */ -#define DST$C_ENTRY 181 -#define DST$C_PSECT 184 -#define DST$C_LINE_NUM 185 /* Line Number */ -#define DST$C_LBLORLIT 186 -#define DST$C_LABEL 187 -#define DST$C_MODBEG 188 /* Beginning of module */ -#define DST$C_MODEND 189 /* End of module */ -#define DST$C_RTNBEG 190 /* Beginning of routine */ -#define DST$C_RTNEND 191 /* End of routine */ -#define DST$C_DELTA_PC_W 1 /* Incr PC */ -#define DST$C_INCR_LINUM 2 /* Incr Line # */ -#define DST$C_INCR_LINUM_W 3 /* Incr Line # */ -#define DST$C_SET_LINUM_INCR 4 -#define DST$C_SET_LINUM_INCR_W 5 -#define DST$C_RESET_LINUM_INCR 6 -#define DST$C_BEG_STMT_MODE 7 -#define DST$C_END_STMT_MODE 8 -#define DST$C_SET_LINE_NUM 9 /* Set Line # */ -#define DST$C_SET_PC 10 -#define DST$C_SET_PC_W 11 -#define DST$C_SET_PC_L 12 -#define DST$C_SET_STMTNUM 13 -#define DST$C_TERM 14 /* End of lines */ -#define DST$C_TERM_W 15 /* End of lines */ -#define DST$C_SET_ABS_PC 16 /* Set PC */ -#define DST$C_DELTA_PC_L 17 /* Incr PC */ -#define DST$C_INCR_LINUM_L 18 /* Incr Line # */ -#define DST$C_SET_LINUM_B 19 /* Set Line # */ -#define DST$C_SET_LINUM_L 20 /* Set Line # */ -#define DST$C_TERM_L 21 /* End of lines */ -/* these are used with DST$C_SOURCE */ -#define DST$C_SRC_FORMFEED 16 /* ^L counts */ -#define DST$C_SRC_DECLFILE 1 /* Declare file */ -#define DST$C_SRC_SETFILE 2 /* Set file */ -#define DST$C_SRC_SETREC_L 3 /* Set record */ -#define DST$C_SRC_DEFLINES_W 10 /* # of line */ -/* the following are the codes for the various data types. Anything not on - * the list is included under 'advanced_type' - */ -#define DBG$C_UCHAR 0x02 -#define DBG$C_USINT 0x03 -#define DBG$C_ULINT 0x04 -#define DBG$C_SCHAR 0x06 -#define DBG$C_SSINT 0x07 -#define DBG$C_SLINT 0x08 -#define DBG$C_REAL4 0x0a -#define DBG$C_REAL8 0x0b -#define DBG$C_FUNCTION_ADDR 0x17 -#define DBG$C_ADVANCED_TYPE 0xa3 -/* These are the codes that are used to generate the definitions of struct - * union and enum records - */ -#define DBG$C_ENUM_ITEM 0xa4 -#define DBG$C_ENUM_START 0xa5 -#define DBG$C_ENUM_END 0xa6 -#define DBG$C_STRUCT_START 0xab -#define DBG$C_STRUCT_ITEM 0xff -#define DBG$C_STRUCT_END 0xac -/* These are the codes that are used in the suffix records to determine the - * actual data type - */ -#define DBG$C_BASIC 0x01 -#define DBG$C_BASIC_ARRAY 0x02 -#define DBG$C_STRUCT 0x03 -#define DBG$C_POINTER 0x04 -#define DBG$C_VOID 0x05 -#define DBG$C_COMPLEX_ARRAY 0x07 -/* These codes are used in the generation of the symbol definition records - */ -#define DBG$C_FUNCTION_PARAMETER 0xc9 -#define DBG$C_LOCAL_SYM 0xd9 |
