nasm.h
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:31k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* nasm.h   main header file for the Netwide Assembler: inter-module interface
  2.  *
  3.  * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
  4.  * Julian Hall. All rights reserved. The software is
  5.  * redistributable under the licence given in the file "Licence"
  6.  * distributed in the NASM archive.
  7.  *
  8.  * initial version: 27/iii/95 by Simon Tatham
  9.  */
  10. #ifndef NASM_NASM_H
  11. #define NASM_NASM_H
  12. #define NASM_MAJOR_VER 0
  13. #define NASM_MINOR_VER 98
  14. #define NASM_VER "0.98"
  15. #ifndef NULL
  16. #define NULL 0
  17. #endif
  18. #ifndef FALSE
  19. #define FALSE 0        /* comes in handy */
  20. #endif
  21. #ifndef TRUE
  22. #define TRUE 1
  23. #endif
  24. #define NO_SEG -1L        /* null segment value */
  25. #define SEG_ABS 0x40000000L        /* mask for far-absolute segments */
  26. #ifndef FILENAME_MAX
  27. #define FILENAME_MAX 256
  28. #endif
  29. /*
  30.  * Name pollution problems: <time.h> on Digital UNIX pulls in some
  31.  * strange hardware header file which sees fit to define R_SP. We
  32.  * undefine it here so as not to break the enum below.
  33.  */
  34. #ifdef R_SP
  35. #undef R_SP
  36. #endif
  37. /*
  38.  * We must declare the existence of this structure type up here,
  39.  * since we have to reference it before we define it...
  40.  */
  41. struct ofmt;
  42. /*
  43.  * -------------------------
  44.  * Error reporting functions
  45.  * -------------------------
  46.  */
  47. /*
  48.  * An error reporting function should look like this.
  49.  */
  50. typedef void (*efunc) (int severity, char *fmt, ...);
  51. /*
  52.  * These are the error severity codes which get passed as the first
  53.  * argument to an efunc.
  54.  */
  55. #define ERR_WARNING 0        /* warn only: no further action */
  56. #define ERR_NONFATAL 1        /* terminate assembly after phase */
  57. #define ERR_FATAL 2        /* instantly fatal: exit with error */
  58. #define ERR_PANIC 3        /* internal error: panic instantly
  59. * and dump core for reference */
  60. #define ERR_MASK 0x0F        /* mask off the above codes */
  61. #define ERR_NOFILE 0x10        /* don't give source file name/line */
  62. #define ERR_USAGE 0x20        /* print a usage message */
  63. #define ERR_PASS1 0x80        /* only print this error on pass one */
  64. /*
  65.  * These codes define specific types of suppressible warning.
  66.  */
  67. #define ERR_WARN_MNP  0x0100        /* macro-num-parameters warning */
  68. #define ERR_WARN_OL   0x0200        /* orphan label (no colon, and
  69. * alone on line) */
  70. #define ERR_WARN_NOV  0x0300        /* numeric overflow */
  71. #define ERR_WARN_MASK 0xFF00        /* the mask for this feature */
  72. #define ERR_WARN_SHR  8        /* how far to shift right */
  73. #define ERR_WARN_MAX  3        /* the highest numbered one */
  74. /*
  75.  * -----------------------
  76.  * Other function typedefs
  77.  * -----------------------
  78.  */
  79. /*
  80.  * A label-lookup function should look like this.
  81.  */
  82. typedef int (*lfunc) (char *label, long *segment, long *offset);
  83. /*
  84.  * And a label-definition function like this. The boolean parameter
  85.  * `is_norm' states whether the label is a `normal' label (which
  86.  * should affect the local-label system), or something odder like
  87.  * an EQU or a segment-base symbol, which shouldn't.
  88.  */
  89. typedef void (*ldfunc) (char *label, long segment, long offset, char *special,
  90. int is_norm, int isextrn, struct ofmt *ofmt,
  91. efunc error);
  92. /*
  93.  * List-file generators should look like this:
  94.  */
  95. typedef struct {
  96.     /*
  97.      * Called to initialise the listing file generator. Before this
  98.      * is called, the other routines will silently do nothing when
  99.      * called. The `char *' parameter is the file name to write the
  100.      * listing to.
  101.      */
  102.     void (*init) (char *, efunc);
  103.     /*
  104.      * Called to clear stuff up and close the listing file.
  105.      */
  106.     void (*cleanup) (void);
  107.     /*
  108.      * Called to output binary data. Parameters are: the offset;
  109.      * the data; the data type. Data types are similar to the
  110.      * output-format interface, only OUT_ADDRESS will _always_ be
  111.      * displayed as if it's relocatable, so ensure that any non-
  112.      * relocatable address has been converted to OUT_RAWDATA by
  113.      * then. Note that OUT_RAWDATA+0 is a valid data type, and is a
  114.      * dummy call used to give the listing generator an offset to
  115.      * work with when doing things like uplevel(LIST_TIMES) or
  116.      * uplevel(LIST_INCBIN).
  117.      */
  118.     void (*output) (long, void *, unsigned long);
  119.     /*
  120.      * Called to send a text line to the listing generator. The
  121.      * `int' parameter is LIST_READ or LIST_MACRO depending on
  122.      * whether the line came directly from an input file or is the
  123.      * result of a multi-line macro expansion.
  124.      */
  125.     void (*line) (int, char *);
  126.     /*
  127.      * Called to change one of the various levelled mechanisms in
  128.      * the listing generator. LIST_INCLUDE and LIST_MACRO can be
  129.      * used to increase the nesting level of include files and
  130.      * macro expansions; LIST_TIMES and LIST_INCBIN switch on the
  131.      * two binary-output-suppression mechanisms for large-scale
  132.      * pseudo-instructions.
  133.      *
  134.      * LIST_MACRO_NOLIST is synonymous with LIST_MACRO except that
  135.      * it indicates the beginning of the expansion of a `nolist'
  136.      * macro, so anything under that level won't be expanded unless
  137.      * it includes another file.
  138.      */
  139.     void (*uplevel) (int);
  140.     /*
  141.      * Reverse the effects of uplevel.
  142.      */
  143.     void (*downlevel) (int);
  144. } ListGen;
  145. /*
  146.  * The expression evaluator must be passed a scanner function; a
  147.  * standard scanner is provided as part of nasmlib.c. The
  148.  * preprocessor will use a different one. Scanners, and the
  149.  * token-value structures they return, look like this.
  150.  *
  151.  * The return value from the scanner is always a copy of the
  152.  * `t_type' field in the structure.
  153.  */
  154. struct tokenval {
  155.     int t_type;
  156.     long t_integer, t_inttwo;
  157.     char *t_charptr;
  158. };
  159. typedef int (*scanner) (void *private_data, struct tokenval *tv);
  160. /*
  161.  * Token types returned by the scanner, in addition to ordinary
  162.  * ASCII character values, and zero for end-of-string.
  163.  */
  164. enum {        /* token types, other than chars */
  165.     TOKEN_INVALID = -1,        /* a placeholder value */
  166.     TOKEN_EOS = 0,        /* end of string */
  167.     TOKEN_EQ = '=', TOKEN_GT = '>', TOKEN_LT = '<',   /* aliases */
  168.     TOKEN_ID = 256, TOKEN_NUM, TOKEN_REG, TOKEN_INSN,  /* major token types */
  169.     TOKEN_ERRNUM,        /* numeric constant with error in */
  170.     TOKEN_HERE, TOKEN_BASE,        /* $ and $$ */
  171.     TOKEN_SPECIAL,        /* BYTE, WORD, DWORD, FAR, NEAR, etc */
  172.     TOKEN_PREFIX,        /* A32, O16, LOCK, REPNZ, TIMES, etc */
  173.     TOKEN_SHL, TOKEN_SHR,        /* << and >> */
  174.     TOKEN_SDIV, TOKEN_SMOD,        /* // and %% */
  175.     TOKEN_GE, TOKEN_LE, TOKEN_NE,      /* >=, <= and <> (!= is same as <>) */
  176.     TOKEN_DBL_AND, TOKEN_DBL_OR, TOKEN_DBL_XOR,   /* &&, || and ^^ */
  177.     TOKEN_SEG, TOKEN_WRT,        /* SEG and WRT */
  178.     TOKEN_FLOAT        /* floating-point constant */
  179. };
  180. typedef struct {
  181.     long segment;
  182.     long offset;
  183.     int  known;
  184. } loc_t;
  185. /*
  186.  * Expression-evaluator datatype. Expressions, within the
  187.  * evaluator, are stored as an array of these beasts, terminated by
  188.  * a record with type==0. Mostly, it's a vector type: each type
  189.  * denotes some kind of a component, and the value denotes the
  190.  * multiple of that component present in the expression. The
  191.  * exception is the WRT type, whose `value' field denotes the
  192.  * segment to which the expression is relative. These segments will
  193.  * be segment-base types, i.e. either odd segment values or SEG_ABS
  194.  * types. So it is still valid to assume that anything with a
  195.  * `value' field of zero is insignificant.
  196.  */
  197. typedef struct {
  198.     long type;        /* a register, or EXPR_xxx */
  199.     long value;        /* must be >= 32 bits */
  200. } expr;
  201. /*
  202.  * The evaluator can also return hints about which of two registers
  203.  * used in an expression should be the base register. See also the
  204.  * `operand' structure.
  205.  */
  206. struct eval_hints {
  207.     int base;
  208.     int type;
  209. };
  210. /*
  211.  * The actual expression evaluator function looks like this. When
  212.  * called, it expects the first token of its expression to already
  213.  * be in `*tv'; if it is not, set tv->t_type to TOKEN_INVALID and
  214.  * it will start by calling the scanner.
  215.  *
  216.  * If a forward reference happens during evaluation, the evaluator
  217.  * must set `*fwref' to TRUE if `fwref' is non-NULL.
  218.  *
  219.  * `critical' is non-zero if the expression may not contain forward
  220.  * references. The evaluator will report its own error if this
  221.  * occurs; if `critical' is 1, the error will be "symbol not
  222.  * defined before use", whereas if `critical' is 2, the error will
  223.  * be "symbol undefined".
  224.  *
  225.  * If `critical' has bit 4 set (in addition to its main value: 0x11
  226.  * and 0x12 correspond to 1 and 2) then an extended expression
  227.  * syntax is recognised, in which relational operators such as =, <
  228.  * and >= are accepted, as well as low-precedence logical operators
  229.  * &&, ^^ and ||.
  230.  *
  231.  * If `hints' is non-NULL, it gets filled in with some hints as to
  232.  * the base register in complex effective addresses.
  233.  */
  234. typedef expr *(*evalfunc) (scanner sc, void *scprivate, struct tokenval *tv,
  235.    int *fwref, int critical, efunc error,
  236.    struct eval_hints *hints);
  237. /*
  238.  * Special values for expr->type. ASSUMPTION MADE HERE: the number
  239.  * of distinct register names (i.e. possible "type" fields for an
  240.  * expr structure) does not exceed 124 (EXPR_REG_START through
  241.  * EXPR_REG_END).
  242.  */
  243. #define EXPR_REG_START 1
  244. #define EXPR_REG_END 124
  245. #define EXPR_UNKNOWN 125L        /* for forward references */
  246. #define EXPR_SIMPLE 126L
  247. #define EXPR_WRT 127L
  248. #define EXPR_SEGBASE 128L
  249. /*
  250.  * Preprocessors ought to look like this:
  251.  */
  252. typedef struct {
  253.     /*
  254.      * Called at the start of a pass; given a file name, the number
  255.      * of the pass, an error reporting function, an evaluator
  256.      * function, and a listing generator to talk to.
  257.      */
  258.     void (*reset) (char *, int, efunc, evalfunc, ListGen *);
  259.     /*
  260.      * Called to fetch a line of preprocessed source. The line
  261.      * returned has been malloc'ed, and so should be freed after
  262.      * use.
  263.      */
  264.     char *(*getline) (void);
  265.     /*
  266.      * Called at the end of a pass.
  267.      */
  268.     void (*cleanup) (void);
  269. } Preproc;
  270. /*
  271.  * ----------------------------------------------------------------
  272.  * Some lexical properties of the NASM source language, included
  273.  * here because they are shared between the parser and preprocessor
  274.  * ----------------------------------------------------------------
  275.  */
  276. /*
  277.  * isidstart matches any character that may start an identifier, and isidchar
  278.  * matches any character that may appear at places other than the start of an
  279.  * identifier. E.g. a period may only appear at the start of an identifier
  280.  * (for local labels), whereas a number may appear anywhere *but* at the
  281.  * start. 
  282.  */
  283. #define isidstart(c) ( isalpha(c) || (c)=='_' || (c)=='.' || (c)=='?' 
  284.                                   || (c)=='@' )
  285. #define isidchar(c)  ( isidstart(c) || isdigit(c) || (c)=='$' || (c)=='#' 
  286.                                                   || (c)=='~' )
  287. /* Ditto for numeric constants. */
  288. #define isnumstart(c)  ( isdigit(c) || (c)=='$' )
  289. #define isnumchar(c)   ( isalnum(c) )
  290. /* This returns the numeric value of a given 'digit'. */
  291. #define numvalue(c)  ((c)>='a' ? (c)-'a'+10 : (c)>='A' ? (c)-'A'+10 : (c)-'0')
  292. /*
  293.  * Data-type flags that get passed to listing-file routines.
  294.  */
  295. enum {
  296.     LIST_READ, LIST_MACRO, LIST_MACRO_NOLIST, LIST_INCLUDE,
  297.     LIST_INCBIN, LIST_TIMES
  298. };
  299. /*
  300.  * -----------------------------------------------------------
  301.  * Format of the `insn' structure returned from `parser.c' and
  302.  * passed into `assemble.c'
  303.  * -----------------------------------------------------------
  304.  */
  305. /*
  306.  * Here we define the operand types. These are implemented as bit
  307.  * masks, since some are subsets of others; e.g. AX in a MOV
  308.  * instruction is a special operand type, whereas AX in other
  309.  * contexts is just another 16-bit register. (Also, consider CL in
  310.  * shift instructions, DX in OUT, etc.)
  311.  */
  312. /* size, and other attributes, of the operand */
  313. #define BITS8     0x00000001L
  314. #define BITS16    0x00000002L
  315. #define BITS32    0x00000004L
  316. #define BITS64    0x00000008L        /* FPU only */
  317. #define BITS80    0x00000010L        /* FPU only */
  318. #define FAR       0x00000020L        /* grotty: this means 16:16 or */
  319.        /* 16:32, like in CALL/JMP */
  320. #define NEAR      0x00000040L
  321. #define SHORT     0x00000080L        /* and this means what it says :) */
  322. #define SIZE_MASK 0x000000FFL        /* all the size attributes */
  323. #define NON_SIZE  (~SIZE_MASK)
  324. #define TO        0x00000100L          /* reverse effect in FADD, FSUB &c */
  325. #define COLON     0x00000200L        /* operand is followed by a colon */
  326. /* type of operand: memory reference, register, etc. */
  327. #define MEMORY    0x00204000L
  328. #define REGISTER  0x00001000L        /* register number in 'basereg' */
  329. #define IMMEDIATE 0x00002000L
  330. #define REGMEM    0x00200000L        /* for r/m, ie EA, operands */
  331. #define REGNORM   0x00201000L        /* 'normal' reg, qualifies as EA */
  332. #define REG8      0x00201001L
  333. #define REG16     0x00201002L
  334. #define REG32     0x00201004L
  335. #define MMXREG    0x00201008L        /* MMX registers */
  336. #define XMMREG    0x00201010L          /* XMM Katmai reg */
  337. #define FPUREG    0x01000000L        /* floating point stack registers */
  338. #define FPU0      0x01000800L        /* FPU stack register zero */
  339. /* special register operands: these may be treated differently */
  340. #define REG_SMASK 0x00070000L        /* a mask for the following */
  341. #define REG_ACCUM 0x00211000L        /* accumulator: AL, AX or EAX */
  342. #define REG_AL    0x00211001L        /* REG_ACCUM | BITSxx */
  343. #define REG_AX    0x00211002L        /* ditto */
  344. #define REG_EAX   0x00211004L        /* and again */
  345. #define REG_COUNT 0x00221000L        /* counter: CL, CX or ECX */
  346. #define REG_CL    0x00221001L        /* REG_COUNT | BITSxx */
  347. #define REG_CX    0x00221002L        /* ditto */
  348. #define REG_ECX   0x00221004L        /* another one */
  349. #define REG_DX    0x00241002L
  350. #define REG_SREG  0x00081002L        /* any segment register */
  351. #define REG_CS    0x01081002L        /* CS */
  352. #define REG_DESS  0x02081002L        /* DS, ES, SS (non-CS 86 registers) */
  353. #define REG_FSGS  0x04081002L        /* FS, GS (386 extended registers) */
  354. #define REG_CDT   0x00101004L        /* CRn, DRn and TRn */
  355. #define REG_CREG  0x08101004L        /* CRn */
  356. #define REG_CR4   0x08101404L        /* CR4 (Pentium only) */
  357. #define REG_DREG  0x10101004L        /* DRn */
  358. #define REG_TREG  0x20101004L        /* TRn */
  359. /* special type of EA */
  360. #define MEM_OFFS  0x00604000L        /* simple [address] offset */
  361. /* special type of immediate operand */
  362. #define ONENESS   0x00800000L          /* so UNITY == IMMEDIATE | ONENESS */
  363. #define UNITY     0x00802000L        /* for shift/rotate instructions */
  364. /*
  365.  * Next, the codes returned from the parser, for registers and
  366.  * instructions.
  367.  */
  368. enum {        /* register names */
  369.     R_AH = EXPR_REG_START, R_AL, R_AX, R_BH, R_BL, R_BP, R_BX, R_CH,
  370.     R_CL, R_CR0, R_CR2, R_CR3, R_CR4, R_CS, R_CX, R_DH, R_DI, R_DL,
  371.     R_DR0, R_DR1, R_DR2, R_DR3, R_DR6, R_DR7, R_DS, R_DX, R_EAX,
  372.     R_EBP, R_EBX, R_ECX, R_EDI, R_EDX, R_ES, R_ESI, R_ESP, R_FS,
  373.     R_GS, R_MM0, R_MM1, R_MM2, R_MM3, R_MM4, R_MM5, R_MM6, R_MM7,
  374.     R_SI, R_SP, R_SS, R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5,
  375.     R_ST6, R_ST7, R_TR3, R_TR4, R_TR5, R_TR6, R_TR7,
  376.     R_XMM0, R_XMM1, R_XMM2, R_XMM3, R_XMM4, R_XMM5, R_XMM6, R_XMM7, REG_ENUM_LIMIT
  377. };
  378. /* Instruction names automatically generated from insns.dat */
  379. #include "insnsi.h"
  380. /* max length of any instruction, register name etc. */
  381. #if MAX_INSLEN > 9
  382. #define MAX_KEYWORD MAX_INSLEN
  383. #else
  384. #define MAX_KEYWORD 9
  385. #endif
  386. enum {        /* condition code names */
  387.     C_A, C_AE, C_B, C_BE, C_C, C_E, C_G, C_GE, C_L, C_LE, C_NA, C_NAE,
  388.     C_NB, C_NBE, C_NC, C_NE, C_NG, C_NGE, C_NL, C_NLE, C_NO, C_NP,
  389.     C_NS, C_NZ, C_O, C_P, C_PE, C_PO, C_S, C_Z
  390. };
  391. /*
  392.  * Note that because segment registers may be used as instruction
  393.  * prefixes, we must ensure the enumerations for prefixes and
  394.  * register names do not overlap.
  395.  */
  396. enum {        /* instruction prefixes */
  397.     PREFIX_ENUM_START = REG_ENUM_LIMIT,
  398.     P_A16 = PREFIX_ENUM_START, P_A32, P_LOCK, P_O16, P_O32, P_REP, P_REPE,
  399.     P_REPNE, P_REPNZ, P_REPZ, P_TIMES
  400. };
  401. enum {        /* extended operand types */
  402.     EOT_NOTHING, EOT_DB_STRING, EOT_DB_NUMBER
  403. };
  404. enum {        /* special EA flags */
  405.     EAF_BYTEOFFS = 1,        /* force offset part to byte size */
  406.     EAF_WORDOFFS = 2,        /* force offset part to [d]word size */
  407.     EAF_TIMESTWO = 4        /* really do EAX*2 not EAX+EAX */
  408. };
  409. enum {        /* values for `hinttype' */
  410.     EAH_NOHINT = 0,        /* no hint at all - our discretion */
  411.     EAH_MAKEBASE = 1,        /* try to make given reg the base */
  412.     EAH_NOTBASE = 2        /* try _not_ to make reg the base */
  413. };
  414. typedef struct {        /* operand to an instruction */
  415.     long type;        /* type of operand */
  416.     int addr_size;        /* 0 means default; 16; 32 */
  417.     int basereg, indexreg, scale;      /* registers and scale involved */
  418.     int hintbase, hinttype;        /* hint as to real base register */
  419.     long segment;        /* immediate segment, if needed */
  420.     long offset;        /* any immediate number */
  421.     long wrt;        /* segment base it's relative to */
  422.     int eaflags;        /* special EA flags */
  423.     int opflags;        /* see OPFLAG_* defines below */
  424. } operand;
  425. #define OPFLAG_FORWARD 1      /* operand is a forward reference */
  426. #define OPFLAG_EXTERN 2      /* operand is an external reference */
  427. typedef struct extop {        /* extended operand */
  428.     struct extop *next;        /* linked list */
  429.     long type;        /* defined above */
  430.     char *stringval;        /* if it's a string, then here it is */
  431.     int stringlen;        /* ... and here's how long it is */
  432.     long segment;        /* if it's a number/address, then... */
  433.     long offset;        /* ... it's given here ... */
  434.     long wrt;        /* ... and here */
  435. } extop;
  436. #define MAXPREFIX 4
  437. typedef struct {        /* an instruction itself */
  438.     char *label;        /* the label defined, or NULL */
  439.     int prefixes[MAXPREFIX];        /* instruction prefixes, if any */
  440.     int nprefix;        /* number of entries in above */
  441.     int opcode;        /* the opcode - not just the string */
  442.     int condition;        /* the condition code, if Jcc/SETcc */
  443.     int operands;        /* how many operands? 0-3 
  444.                                         * (more if db et al) */
  445.     operand oprs[3];            /* the operands, defined as above */
  446.     extop *eops;        /* extended operands */
  447.     int eops_float;                    /* true if DD and floating */
  448.     long times;        /* repeat count (TIMES prefix) */
  449.     int forw_ref;        /* is there a forward reference? */
  450. } insn;
  451. enum geninfo { GI_SWITCH };
  452. /*
  453.  * ------------------------------------------------------------
  454.  * The data structure defining an output format driver, and the
  455.  * interfaces to the functions therein.
  456.  * ------------------------------------------------------------
  457.  */
  458. struct ofmt {
  459.     /*
  460.      * This is a short (one-liner) description of the type of
  461.      * output generated by the driver.
  462.      */
  463.     char *fullname;
  464.     /*
  465.      * This is a single keyword used to select the driver.
  466.      */
  467.     char *shortname;
  468.     /*
  469.      * this is reserved for out module specific help.
  470.      * It is set to NULL in all the out modules but is not implemented
  471.      * in the main program
  472.      */
  473.     char *helpstring;
  474.     /*
  475.      * this is a pointer to the first element of the debug information
  476.      */
  477.     struct dfmt **debug_formats;
  478.     /*
  479.      * and a pointer to the element that is being used
  480.      * note: this is set to the default at compile time and changed if the
  481.      * -F option is selected.  If developing a set of new debug formats for
  482.      * an output format, be sure to set this to whatever default you want
  483.      *
  484.      */
  485.     struct dfmt *current_dfmt;
  486.     /*
  487.      * This, if non-NULL, is a NULL-terminated list of `char *'s
  488.      * pointing to extra standard macros supplied by the object
  489.      * format (e.g. a sensible initial default value of __SECT__,
  490.      * and user-level equivalents for any format-specific
  491.      * directives).
  492.      */
  493.     char **stdmac;
  494.     /*
  495.      * This procedure is called at the start of an output session.
  496.      * It tells the output format what file it will be writing to,
  497.      * what routine to report errors through, and how to interface
  498.      * to the label manager and expression evaluator if necessary.
  499.      * It also gives it a chance to do other initialisation.
  500.      */
  501.     void (*init) (FILE *fp, efunc error, ldfunc ldef, evalfunc eval);
  502.     /*
  503.      * This procedure is called to pass generic information to the
  504.      * object file.  The first parameter gives the information type
  505.      * (currently only command line switches)
  506.      * and the second parameter gives the value.  This function returns
  507.      * 1 if recognized, 0 if unrecognized
  508.      */
  509.     int (*setinfo)(enum geninfo type, char **string);
  510.     /*
  511.      * This procedure is called by assemble() to write actual
  512.      * generated code or data to the object file. Typically it
  513.      * doesn't have to actually _write_ it, just store it for
  514.      * later.
  515.      *
  516.      * The `type' argument specifies the type of output data, and
  517.      * usually the size as well: its contents are described below.
  518.      */
  519.     void (*output) (long segto, void *data, unsigned long type,
  520.     long segment, long wrt);
  521.     /*
  522.      * This procedure is called once for every symbol defined in
  523.      * the module being assembled. It gives the name and value of
  524.      * the symbol, in NASM's terms, and indicates whether it has
  525.      * been declared to be global. Note that the parameter "name",
  526.      * when passed, will point to a piece of static storage
  527.      * allocated inside the label manager - it's safe to keep using
  528.      * that pointer, because the label manager doesn't clean up
  529.      * until after the output driver has.
  530.      *
  531.      * Values of `is_global' are: 0 means the symbol is local; 1
  532.      * means the symbol is global; 2 means the symbol is common (in
  533.      * which case `offset' holds the _size_ of the variable).
  534.      * Anything else is available for the output driver to use
  535.      * internally.
  536.      *
  537.      * This routine explicitly _is_ allowed to call the label
  538.      * manager to define further symbols, if it wants to, even
  539.      * though it's been called _from_ the label manager. That much
  540.      * re-entrancy is guaranteed in the label manager. However, the
  541.      * label manager will in turn call this routine, so it should
  542.      * be prepared to be re-entrant itself.
  543.      *
  544.      * The `special' parameter contains special information passed
  545.      * through from the command that defined the label: it may have
  546.      * been an EXTERN, a COMMON or a GLOBAL. The distinction should
  547.      * be obvious to the output format from the other parameters.
  548.      */
  549.     void (*symdef) (char *name, long segment, long offset, int is_global,
  550.     char *special);
  551.     /*
  552.      * This procedure is called when the source code requests a
  553.      * segment change. It should return the corresponding segment
  554.      * _number_ for the name, or NO_SEG if the name is not a valid
  555.      * segment name.
  556.      *
  557.      * It may also be called with NULL, in which case it is to
  558.      * return the _default_ section number for starting assembly in.
  559.      *
  560.      * It is allowed to modify the string it is given a pointer to.
  561.      *
  562.      * It is also allowed to specify a default instruction size for
  563.      * the segment, by setting `*bits' to 16 or 32. Or, if it
  564.      * doesn't wish to define a default, it can leave `bits' alone.
  565.      */
  566.     long (*section) (char *name, int pass, int *bits);
  567.     /*
  568.      * This procedure is called to modify the segment base values
  569.      * returned from the SEG operator. It is given a segment base
  570.      * value (i.e. a segment value with the low bit set), and is
  571.      * required to produce in return a segment value which may be
  572.      * different. It can map segment bases to absolute numbers by
  573.      * means of returning SEG_ABS types.
  574.      *
  575.      * It should return NO_SEG if the segment base cannot be
  576.      * determined; the evaluator (which calls this routine) is
  577.      * responsible for throwing an error condition if that occurs
  578.      * in pass two or in a critical expression.
  579.      */
  580.     long (*segbase) (long segment);
  581.     /*
  582.      * This procedure is called to allow the output driver to
  583.      * process its own specific directives. When called, it has the
  584.      * directive word in `directive' and the parameter string in
  585.      * `value'. It is called in both assembly passes, and `pass'
  586.      * will be either 1 or 2.
  587.      *
  588.      * This procedure should return zero if it does not _recognise_
  589.      * the directive, so that the main program can report an error.
  590.      * If it recognises the directive but then has its own errors,
  591.      * it should report them itself and then return non-zero. It
  592.      * should also return non-zero if it correctly processes the
  593.      * directive.
  594.      */
  595.     int (*directive) (char *directive, char *value, int pass);
  596.     /*
  597.      * This procedure is called before anything else - even before
  598.      * the "init" routine - and is passed the name of the input
  599.      * file from which this output file is being generated. It
  600.      * should return its preferred name for the output file in
  601.      * `outname', if outname[0] is not '', and do nothing to
  602.      * `outname' otherwise. Since it is called before the driver is
  603.      * properly initialised, it has to be passed its error handler
  604.      * separately.
  605.      *
  606.      * This procedure may also take its own copy of the input file
  607.      * name for use in writing the output file: it is _guaranteed_
  608.      * that it will be called before the "init" routine.
  609.      *
  610.      * The parameter `outname' points to an area of storage
  611.      * guaranteed to be at least FILENAME_MAX in size.
  612.      */
  613.     void (*filename) (char *inname, char *outname, efunc error);
  614.     /*
  615.      * This procedure is called after assembly finishes, to allow
  616.      * the output driver to clean itself up and free its memory.
  617.      * Typically, it will also be the point at which the object
  618.      * file actually gets _written_.
  619.      *
  620.      * One thing the cleanup routine should always do is to close
  621.      * the output file pointer.
  622.      */
  623.     void (*cleanup) (int debuginfo);
  624. };
  625. /*
  626.  * values for the `type' parameter to an output function. Each one
  627.  * must have the actual number of _bytes_ added to it.
  628.  *
  629.  * Exceptions are OUT_RELxADR, which denote an x-byte relocation
  630.  * which will be a relative jump. For this we need to know the
  631.  * distance in bytes from the start of the relocated record until
  632.  * the end of the containing instruction. _This_ is what is stored
  633.  * in the size part of the parameter, in this case.
  634.  *
  635.  * Also OUT_RESERVE denotes reservation of N bytes of BSS space,
  636.  * and the contents of the "data" parameter is irrelevant.
  637.  *
  638.  * The "data" parameter for the output function points to a "long",
  639.  * containing the address in question, unless the type is
  640.  * OUT_RAWDATA, in which case it points to an "unsigned char"
  641.  * array.
  642.  */
  643. #define OUT_RAWDATA 0x00000000UL
  644. #define OUT_ADDRESS 0x10000000UL
  645. #define OUT_REL2ADR 0x20000000UL
  646. #define OUT_REL4ADR 0x30000000UL
  647. #define OUT_RESERVE 0x40000000UL
  648. #define OUT_TYPMASK 0xF0000000UL
  649. #define OUT_SIZMASK 0x0FFFFFFFUL
  650. /*
  651.  * ------------------------------------------------------------
  652.  * The data structure defining a debug format driver, and the
  653.  * interfaces to the functions therein.
  654.  * ------------------------------------------------------------
  655.  */
  656. struct dfmt {
  657.     
  658.     /*
  659.      * This is a short (one-liner) description of the type of
  660.      * output generated by the driver.
  661.      */
  662.     char *fullname;
  663.     /*
  664.      * This is a single keyword used to select the driver.
  665.      */
  666.     char *shortname;
  667.     /*
  668.      * init - called initially to set up local pointer to object format, 
  669.      * void pointer to implementation defined data, file pointer (which
  670.      * probably won't be used, but who knows?), and error function.
  671.      */
  672.     void (*init) (struct ofmt * of, void * id, FILE * fp, efunc error);
  673.     /*
  674.      * linenum - called any time there is output with a change of
  675.      * line number or file.
  676.      */
  677.     void (*linenum) (const char * filename, long linenumber, long segto);
  678.     /*
  679.      * debug_deflabel - called whenever a label is defined. Parameters
  680.      * are the same as to 'symdef()' in the output format. This function
  681.      * would be called before the output format version.
  682.      */
  683.     void (*debug_deflabel) (char * name, long segment, long offset,
  684.                             int is_global, char * special);
  685.     /*
  686.      * debug_directive - called whenever a DEBUG directive other than 'LINE'
  687.      * is encountered. 'directive' contains the first parameter to the
  688.      * DEBUG directive, and params contains the rest. For example,
  689.      * 'DEBUG VAR _somevar:int' would translate to a call to this
  690.      * function with 'directive' equal to "VAR" and 'params' equal to 
  691.      * "_somevar:int".
  692.      */
  693.     void (*debug_directive) (const char * directive, const char * params);
  694.     /*
  695.      * typevalue - called whenever the assembler wishes to register a type
  696.      * for the last defined label.  This routine MUST detect if a type was
  697.      * already registered and not re-register it.
  698.      */
  699.     void (*debug_typevalue) (long type);
  700.     /*
  701.      * debug_output - called whenever output is required
  702.      * 'type' is the type of info required, and this is format-specific
  703.      */
  704.     void (*debug_output) (int type, void *param);
  705.     /*
  706.      * cleanup - called after processing of file is complete
  707.      */
  708.     void (*cleanup) (void);
  709. };
  710. /*
  711.  * The type definition macros
  712.  * for debugging
  713.  *
  714.  * low 3 bits: reserved
  715.  * next 5 bits: type
  716.  * next 24 bits: number of elements for arrays (0 for labels)
  717.  */
  718. #define TY_UNKNOWN 0x00
  719. #define TY_LABEL   0x08
  720. #define TY_BYTE    0x10
  721. #define TY_WORD    0x18
  722. #define TY_DWORD   0x20
  723. #define TY_FLOAT   0x28
  724. #define TY_QWORD   0x30
  725. #define TY_TBYTE   0x38
  726. #define TY_COMMON  0xE0
  727. #define TY_SEG     0xE8
  728. #define TY_EXTERN  0xF0
  729. #define TY_EQU     0xF8
  730. #define TYM_TYPE(x) ((x) & 0xF8)
  731. #define TYM_ELEMENTS(x) (((x) & 0xFFFFFF00) >> 8)
  732. #define TYS_ELEMENTS(x)  ((x) << 8)
  733. /*
  734.  * -----
  735.  * Other
  736.  * -----
  737.  */
  738. /*
  739.  * This is a useful #define which I keep meaning to use more often:
  740.  * the number of elements of a statically defined array.
  741.  */
  742. #define elements(x)     ( sizeof(x) / sizeof(*(x)) )
  743. #endif