wsasm.h
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:9k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsasm.h
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Byte-code assembler definitions.
  11.  *
  12.  */
  13. #ifndef WSASM_H
  14. #define WSASM_H
  15. /********************* Opcodes for the ASM instructions *****************/
  16. /* The instruction classes. */
  17. /* Class 1: 1xxPPPPP */
  18. #define WS_ASM_CLASS1P(op) (((op) & 0x80) == 0x80)
  19. #define WS_ASM_CLASS1_OP(op) ((op) & 0xe0)
  20. #define WS_ASM_CLASS1_ARG(op) ((op) & 0x1f)
  21. /* Class 2: 010xPPPP */
  22. #define WS_ASM_CLASS2P(op) (((op) & 0xe0) == 0x40)
  23. #define WS_ASM_CLASS2_OP(op) ((op) & 0xf0)
  24. #define WS_ASM_CLASS2_ARG(op) ((op) & 0x0f)
  25. /* Class 3: 011xxPPP */
  26. #define WS_ASM_CLASS3P(op) (((op) & 0xe0) == 0x60)
  27. #define WS_ASM_CLASS3_OP(op) ((op) & 0x78)
  28. #define WS_ASM_CLASS3_ARG(op) ((op) & 0x07)
  29. /* Class 4: 00xxxxxx */
  30. #define WS_ASM_CLASS4P(op) (((op) & 0xc0) == 0x00)
  31. #define WS_ASM_CLASS4_OP(op) (op)
  32. /* Get the opcode of the operand `op'.  The operand `op' can belong to
  33.    any of the classes 1-4. */
  34. #define WS_ASM_OP(op)
  35.     (WS_ASM_CLASS1P(op)
  36.      ? WS_ASM_CLASS1_OP(op)
  37.      : (WS_ASM_CLASS2P(op)
  38.        ? WS_ASM_CLASS2_OP(op)
  39.        : (WS_ASM_CLASS3P(op)
  40.          ? WS_ASM_CLASS3_OP(op) 
  41.          : WS_ASM_CLASS4_OP(op))))
  42. /* Get the implicit argument of the operand `op'.  The operand `op'
  43.    can belong to any of the classes 1-4.  For the class 4 operands,
  44.    this returns 0. */
  45. #define WS_ASM_ARG(op)
  46.     (WS_ASM_CLASS1P(op)
  47.      ? WS_ASM_CLASS1_ARG(op)
  48.      : (WS_ASM_CLASS2P(op)
  49.        ? WS_ASM_CLASS2_ARG(op)
  50.        : (WS_ASM_CLASS3P(op)
  51.          ? WS_ASM_CLASS3_ARG(op)
  52.          : 0)))
  53. /* Create an operand with implicit argument from the operand `op' and
  54.    argument `arg'. */
  55. #define WS_ASM_GLUE(op, arg) ((WsByte) (((WsByte) (op)) | ((WsByte) (arg))))
  56. /* The instruction opcodes.             Opcode  Binary  Size */
  57. #define WS_ASM_JUMP_FW_S 0x80 /* 10000000   1 */
  58. #define WS_ASM_JUMP_FW 0x01 /* 00000001   2 */
  59. #define WS_ASM_JUMP_FW_W 0x02 /* 00000010   3 */
  60. #define WS_ASM_JUMP_BW_S 0xa0 /* 10100000   1 */
  61. #define WS_ASM_JUMP_BW 0x03 /* 00000011   2 */
  62. #define WS_ASM_JUMP_BW_W 0x04 /* 00000100   3 */
  63. #define WS_ASM_TJUMP_FW_S 0xc0 /* 11000000   1 */
  64. #define WS_ASM_TJUMP_FW 0x05 /* 00000101   2 */
  65. #define WS_ASM_TJUMP_FW_W 0x06 /* 00000110   3 */
  66. #define WS_ASM_TJUMP_BW 0x07 /* 00000111   2 */
  67. #define WS_ASM_TJUMP_BW_W 0x08 /* 00001000   3 */
  68. #define WS_ASM_CALL_S 0x60 /* 01100000   1 */
  69. #define WS_ASM_CALL 0x09 /* 00001001   2 */
  70. #define WS_ASM_CALL_LIB_S 0x68 /* 01101000   2 */
  71. #define WS_ASM_CALL_LIB 0x0a /* 00001010   3 */
  72. #define WS_ASM_CALL_LIB_W 0x0b /* 00001011   4 */
  73. #define WS_ASM_CALL_URL 0x0c /* 00001100   4 */
  74. #define WS_ASM_CALL_URL_W 0x0d /* 00001101   6 */
  75. #define WS_ASM_LOAD_VAR_S 0xe0 /* 11100000   1 */
  76. #define WS_ASM_LOAD_VAR 0x0e /* 00001110   2 */
  77. #define WS_ASM_STORE_VAR_S 0x40 /* 01000000   1 */
  78. #define WS_ASM_STORE_VAR 0x0f /* 00001111   2 */
  79. #define WS_ASM_INCR_VAR_S 0x70 /* 01110000   1 */
  80. #define WS_ASM_INCR_VAR 0x10 /* 00010000   2 */
  81. #define WS_ASM_DECR_VAR 0x11 /* 00010001   2 */
  82. #define WS_ASM_LOAD_CONST_S 0x50 /* 01010000   1 */
  83. #define WS_ASM_LOAD_CONST 0x12 /* 00010010   2 */
  84. #define WS_ASM_LOAD_CONST_W 0x13 /* 00010011   3 */
  85. #define WS_ASM_CONST_0 0x14 /* 00010100   1 */
  86. #define WS_ASM_CONST_1 0x15 /* 00010101   1 */
  87. #define WS_ASM_CONST_M1 0x16 /* 00010110   1 */
  88. #define WS_ASM_CONST_ES 0x17 /* 00010111   1 */
  89. #define WS_ASM_CONST_INVALID 0x18 /* 00011000   1 */
  90. #define WS_ASM_CONST_TRUE 0x19 /* 00011001   1 */
  91. #define WS_ASM_CONST_FALSE 0x1a /* 00011010   1 */
  92. #define WS_ASM_INCR 0x1b /* 00011011   1 */
  93. #define WS_ASM_DECR 0x1c /* 00011100   1 */
  94. #define WS_ASM_ADD_ASG 0x1d /* 00011101   2 */
  95. #define WS_ASM_SUB_ASG 0x1e /* 00011110   2 */
  96. #define WS_ASM_UMINUS  0x1f /* 00011111   1 */
  97. #define WS_ASM_ADD 0x20 /* 00100000   1 */
  98. #define WS_ASM_SUB 0x21 /* 00100001   1 */
  99. #define WS_ASM_MUL 0x22 /* 00100010   1 */
  100. #define WS_ASM_DIV 0x23 /* 00100011   1 */
  101. #define WS_ASM_IDIV 0x24 /* 00100100   1 */
  102. #define WS_ASM_REM  0x25 /* 00100101   1 */
  103. #define WS_ASM_B_AND 0x26 /* 00100110   1 */
  104. #define WS_ASM_B_OR  0x27 /* 00100111   1 */
  105. #define WS_ASM_B_XOR  0x28 /* 00101000   1 */
  106. #define WS_ASM_B_NOT  0x29 /* 00101001   1 */
  107. #define WS_ASM_B_LSHIFT 0x2a /* 00101010   1 */
  108. #define WS_ASM_B_RSSHIFT 0x2b /* 00101011   1 */
  109. #define WS_ASM_B_RSZSHIFT 0x2c /* 00101100   1 */
  110. #define WS_ASM_EQ 0x2d /* 00101101   1 */
  111. #define WS_ASM_LE 0x2e /* 00101110   1 */
  112. #define WS_ASM_LT 0x2f /* 00101111   1 */
  113. #define WS_ASM_GE 0x30 /* 00110000   1 */
  114. #define WS_ASM_GT 0x31 /* 00110001   1 */
  115. #define WS_ASM_NE 0x32 /* 00110010   1 */
  116. #define WS_ASM_NOT 0x33 /* 00110011   1 */
  117. #define WS_ASM_SCAND 0x34 /* 00110100   1 */
  118. #define WS_ASM_SCOR  0x35 /* 00110101   1 */
  119. #define WS_ASM_TOBOOL 0x36 /* 00110110   1 */
  120. #define WS_ASM_POP 0x37 /* 00110111   1 */
  121. #define WS_ASM_TYPEOF 0x38 /* 00111000   1 */
  122. #define WS_ASM_ISVALID 0x39 /* 00111001   1 */
  123. #define WS_ASM_RETURN  0x3a /* 00111010   1 */
  124. #define WS_ASM_RETURN_ES 0x3b /* 00111011   1 */
  125. #define WS_ASM_DEBUG 0x3c /* 00111100   1 */
  126. /********************* Pseudo opcodes for assembler *********************/
  127. /* These are pseudo opcodes grouping together several real byte-code
  128.    opcodes.  These are used in the symbolic assembler. */
  129. #define WS_ASM_P_LABEL 0x0100
  130. #define WS_ASM_P_JUMP 0x0200
  131. #define WS_ASM_P_TJUMP 0x0300
  132. #define WS_ASM_P_CALL 0x0400
  133. #define WS_ASM_P_CALL_LIB 0x0500
  134. #define WS_ASM_P_CALL_URL 0x0600
  135. #define WS_ASM_P_LOAD_VAR 0x0700
  136. #define WS_ASM_P_STORE_VAR 0x0800
  137. #define WS_ASM_P_INCR_VAR 0x0900
  138. #define WS_ASM_P_LOAD_CONST 0x0a00
  139. /* Check whether the instruction `ins' is a pseudo-branch
  140.    instruction. */
  141. #define WS_ASM_P_BRANCH(ins) 
  142.     ((ins)->type == WS_ASM_P_JUMP || (ins)->type == WS_ASM_P_TJUMP)
  143. /********************* Symbolic assembler instructions ******************/
  144. #define ws_label_idx u.ivalues.i1
  145. #define ws_label_refcount u.ivalues.i2
  146. #define ws_findex u.ivalues.i1
  147. #define ws_lindex u.ivalues.i2
  148. #define ws_args u.ivalues.i3
  149. #define ws_vindex u.ivalues.i1
  150. #define ws_cindex u.ivalues.i1
  151. #define ws_label u.branch.label
  152. #define ws_offset u.branch.offset
  153. struct WsAsmInsRec
  154. {
  155.     struct WsAsmInsRec *next;
  156.     struct WsAsmInsRec *prev;
  157.     WsUInt16 type;
  158.     /* The source stream line number. */
  159.     WsUInt32 line;
  160.     /* The operands offset in the linearized byte-code stream. */
  161.     WsUInt32 offset;
  162.     union
  163.     {
  164.         /* The target label for branch instructions. */
  165.         struct
  166.         {
  167.             struct WsAsmInsRec *label;
  168.             /* The offset argument of the branch operand.  This is the
  169.                adjustment that must be performed for the pc after this
  170.                instruction. */
  171.             WsUInt32 offset;
  172.         }
  173.         branch;
  174.         struct
  175.         {
  176.             WsUInt32 i1;
  177.             WsUInt16 i2;
  178.             WsUInt16 i3;
  179.         }
  180.         ivalues;
  181.     } u;
  182. };
  183. typedef struct WsAsmInsRec WsAsmIns;
  184. /* Link the instruction `ins' to the end of the symbolic assembler
  185.    chain, currently being constructed in `compiler'. */
  186. void ws_asm_link(WsCompilerPtr compiler, WsAsmIns *ins);
  187. /* Print the current assembler instructions of the compiler
  188.    `compiler'. */
  189. void ws_asm_print(WsCompilerPtr compiler);
  190. /* Disassemble the byte-code `code', `len' to the standard output. */
  191. void ws_asm_dasm(WsCompilerPtr compiler, const unsigned char *code,
  192.                  size_t len);
  193. /* Linearize the assembler, currently being constructed in `compiler',
  194.    into `compiler->byte_code'. */
  195. void ws_asm_linearize(WsCompilerPtr compiler);
  196. /* Constructors for assembler instructions. */
  197. /* Create a label instruction. */
  198. WsAsmIns *ws_asm_label(WsCompilerPtr compiler, WsUInt32 line);
  199. /* Create a branch instruction `ins' to label `label'. */
  200. WsAsmIns *ws_asm_branch(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 ins,
  201.                         WsAsmIns *label);
  202. /* Create a local call instruction to function `findex'. */
  203. WsAsmIns *ws_asm_call(WsCompilerPtr compiler, WsUInt32 line, WsUInt8 findex);
  204. /* Create a library call instruction to function `findex' from the
  205.    libary `lindex'. */
  206. WsAsmIns *ws_asm_call_lib(WsCompilerPtr compiler, WsUInt32 line,
  207.                           WsUInt8 findex, WsUInt16 lindex);
  208. /* Create an URL call instruction for function `findex' from the URL
  209.    `urlindex' with `args' arguments.  The arguments `urlindex' and
  210.    `findex' pont to the constant pool. */
  211. WsAsmIns *ws_asm_call_url(WsCompilerPtr compiler, WsUInt32 line,
  212.                           WsUInt16 findex, WsUInt16 urlindex, WsUInt8 args);
  213. /* Create a variable modification instruction `ins' for the variable
  214.    `vindex'. */
  215. WsAsmIns *ws_asm_variable(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 ins,
  216.                           WsUInt8 vindex);
  217. /* Create a constant loading instruction for the constant `cindex'. */
  218. WsAsmIns *ws_asm_load_const(WsCompilerPtr compiler, WsUInt32 line,
  219.                             WsUInt16 cindex);
  220. /* Create an instruction `ins'. */
  221. WsAsmIns *ws_asm_ins(WsCompilerPtr compiler, WsUInt32 line, WsUInt8 opcode);
  222. #endif /* not WSASM_H */