📄 wsasm.h
字号:
/* * * wsasm.h * * Author: Markku Rossi <mtr@iki.fi> * * Copyright (c) 1999-2000 WAPIT OY LTD. * All rights reserved. * * Byte-code assembler definitions. * */#ifndef WSASM_H#define WSASM_H/********************* Opcodes for the ASM instructions *****************//* The instruction classes. *//* Class 1: 1xxPPPPP */#define WS_ASM_CLASS1P(op) (((op) & 0x80) == 0x80)#define WS_ASM_CLASS1_OP(op) ((op) & 0xe0)#define WS_ASM_CLASS1_ARG(op) ((op) & 0x1f)/* Class 2: 010xPPPP */#define WS_ASM_CLASS2P(op) (((op) & 0xe0) == 0x40)#define WS_ASM_CLASS2_OP(op) ((op) & 0xf0)#define WS_ASM_CLASS2_ARG(op) ((op) & 0x0f)/* Class 3: 011xxPPP */#define WS_ASM_CLASS3P(op) (((op) & 0xe0) == 0x60)#define WS_ASM_CLASS3_OP(op) ((op) & 0x78)#define WS_ASM_CLASS3_ARG(op) ((op) & 0x07)/* Class 4: 00xxxxxx */#define WS_ASM_CLASS4P(op) (((op) & 0xc0) == 0x00)#define WS_ASM_CLASS4_OP(op) (op)/* Get the opcode of the operand `op'. The operand `op' can belong to any of the classes 1-4. */#define WS_ASM_OP(op) \ (WS_ASM_CLASS1P(op) \ ? WS_ASM_CLASS1_OP(op) \ : (WS_ASM_CLASS2P(op) \ ? WS_ASM_CLASS2_OP(op) \ : (WS_ASM_CLASS3P(op) \ ? WS_ASM_CLASS3_OP(op) \ : WS_ASM_CLASS4_OP(op))))/* Get the implicit argument of the operand `op'. The operand `op' can belong to any of the classes 1-4. For the class 4 operands, this returns 0. */#define WS_ASM_ARG(op) \ (WS_ASM_CLASS1P(op) \ ? WS_ASM_CLASS1_ARG(op) \ : (WS_ASM_CLASS2P(op) \ ? WS_ASM_CLASS2_ARG(op) \ : (WS_ASM_CLASS3P(op) \ ? WS_ASM_CLASS3_ARG(op) \ : 0)))/* Create an operand with implicit argument from the operand `op' and argument `arg'. */#define WS_ASM_GLUE(op, arg) ((WsByte) (((WsByte) (op)) | ((WsByte) (arg))))/* The instruction opcodes. Opcode Binary Size */#define WS_ASM_JUMP_FW_S 0x80 /* 10000000 1 */#define WS_ASM_JUMP_FW 0x01 /* 00000001 2 */#define WS_ASM_JUMP_FW_W 0x02 /* 00000010 3 */#define WS_ASM_JUMP_BW_S 0xa0 /* 10100000 1 */#define WS_ASM_JUMP_BW 0x03 /* 00000011 2 */#define WS_ASM_JUMP_BW_W 0x04 /* 00000100 3 */#define WS_ASM_TJUMP_FW_S 0xc0 /* 11000000 1 */#define WS_ASM_TJUMP_FW 0x05 /* 00000101 2 */#define WS_ASM_TJUMP_FW_W 0x06 /* 00000110 3 */#define WS_ASM_TJUMP_BW 0x07 /* 00000111 2 */#define WS_ASM_TJUMP_BW_W 0x08 /* 00001000 3 */#define WS_ASM_CALL_S 0x60 /* 01100000 1 */#define WS_ASM_CALL 0x09 /* 00001001 2 */#define WS_ASM_CALL_LIB_S 0x68 /* 01101000 2 */#define WS_ASM_CALL_LIB 0x0a /* 00001010 3 */#define WS_ASM_CALL_LIB_W 0x0b /* 00001011 4 */#define WS_ASM_CALL_URL 0x0c /* 00001100 4 */#define WS_ASM_CALL_URL_W 0x0d /* 00001101 6 */#define WS_ASM_LOAD_VAR_S 0xe0 /* 11100000 1 */#define WS_ASM_LOAD_VAR 0x0e /* 00001110 2 */#define WS_ASM_STORE_VAR_S 0x40 /* 01000000 1 */#define WS_ASM_STORE_VAR 0x0f /* 00001111 2 */#define WS_ASM_INCR_VAR_S 0x70 /* 01110000 1 */#define WS_ASM_INCR_VAR 0x10 /* 00010000 2 */#define WS_ASM_DECR_VAR 0x11 /* 00010001 2 */#define WS_ASM_LOAD_CONST_S 0x50 /* 01010000 1 */#define WS_ASM_LOAD_CONST 0x12 /* 00010010 2 */#define WS_ASM_LOAD_CONST_W 0x13 /* 00010011 3 */#define WS_ASM_CONST_0 0x14 /* 00010100 1 */#define WS_ASM_CONST_1 0x15 /* 00010101 1 */#define WS_ASM_CONST_M1 0x16 /* 00010110 1 */#define WS_ASM_CONST_ES 0x17 /* 00010111 1 */#define WS_ASM_CONST_INVALID 0x18 /* 00011000 1 */#define WS_ASM_CONST_TRUE 0x19 /* 00011001 1 */#define WS_ASM_CONST_FALSE 0x1a /* 00011010 1 */#define WS_ASM_INCR 0x1b /* 00011011 1 */#define WS_ASM_DECR 0x1c /* 00011100 1 */#define WS_ASM_ADD_ASG 0x1d /* 00011101 2 */#define WS_ASM_SUB_ASG 0x1e /* 00011110 2 */#define WS_ASM_UMINUS 0x1f /* 00011111 1 */#define WS_ASM_ADD 0x20 /* 00100000 1 */#define WS_ASM_SUB 0x21 /* 00100001 1 */#define WS_ASM_MUL 0x22 /* 00100010 1 */#define WS_ASM_DIV 0x23 /* 00100011 1 */#define WS_ASM_IDIV 0x24 /* 00100100 1 */#define WS_ASM_REM 0x25 /* 00100101 1 */#define WS_ASM_B_AND 0x26 /* 00100110 1 */#define WS_ASM_B_OR 0x27 /* 00100111 1 */#define WS_ASM_B_XOR 0x28 /* 00101000 1 */#define WS_ASM_B_NOT 0x29 /* 00101001 1 */#define WS_ASM_B_LSHIFT 0x2a /* 00101010 1 */#define WS_ASM_B_RSSHIFT 0x2b /* 00101011 1 */#define WS_ASM_B_RSZSHIFT 0x2c /* 00101100 1 */#define WS_ASM_EQ 0x2d /* 00101101 1 */#define WS_ASM_LE 0x2e /* 00101110 1 */#define WS_ASM_LT 0x2f /* 00101111 1 */#define WS_ASM_GE 0x30 /* 00110000 1 */#define WS_ASM_GT 0x31 /* 00110001 1 */#define WS_ASM_NE 0x32 /* 00110010 1 */#define WS_ASM_NOT 0x33 /* 00110011 1 */#define WS_ASM_SCAND 0x34 /* 00110100 1 */#define WS_ASM_SCOR 0x35 /* 00110101 1 */#define WS_ASM_TOBOOL 0x36 /* 00110110 1 */#define WS_ASM_POP 0x37 /* 00110111 1 */#define WS_ASM_TYPEOF 0x38 /* 00111000 1 */#define WS_ASM_ISVALID 0x39 /* 00111001 1 */#define WS_ASM_RETURN 0x3a /* 00111010 1 */#define WS_ASM_RETURN_ES 0x3b /* 00111011 1 */#define WS_ASM_DEBUG 0x3c /* 00111100 1 *//********************* Pseudo opcodes for assembler *********************//* These are pseudo opcodes grouping together several real byte-code opcodes. These are used in the symbolic assembler. */#define WS_ASM_P_LABEL 0x0100#define WS_ASM_P_JUMP 0x0200#define WS_ASM_P_TJUMP 0x0300#define WS_ASM_P_CALL 0x0400#define WS_ASM_P_CALL_LIB 0x0500#define WS_ASM_P_CALL_URL 0x0600#define WS_ASM_P_LOAD_VAR 0x0700#define WS_ASM_P_STORE_VAR 0x0800#define WS_ASM_P_INCR_VAR 0x0900#define WS_ASM_P_LOAD_CONST 0x0a00/* Check whether the instruction `ins' is a pseudo-branch instruction. */#define WS_ASM_P_BRANCH(ins) \ ((ins)->type == WS_ASM_P_JUMP || (ins)->type == WS_ASM_P_TJUMP)/********************* Symbolic assembler instructions ******************/#define ws_label_idx u.ivalues.i1#define ws_label_refcount u.ivalues.i2#define ws_findex u.ivalues.i1#define ws_lindex u.ivalues.i2#define ws_args u.ivalues.i3#define ws_vindex u.ivalues.i1#define ws_cindex u.ivalues.i1#define ws_label u.branch.label#define ws_offset u.branch.offsetstruct WsAsmInsRec{ struct WsAsmInsRec *next; struct WsAsmInsRec *prev; WsUInt16 type; /* The source stream line number. */ WsUInt32 line; /* The operands offset in the linearized byte-code stream. */ WsUInt32 offset; union { /* The target label for branch instructions. */ struct { struct WsAsmInsRec *label; /* The offset argument of the branch operand. This is the adjustment that must be performed for the pc after this instruction. */ WsUInt32 offset; } branch; struct { WsUInt32 i1; WsUInt16 i2; WsUInt16 i3; } ivalues; } u;};typedef struct WsAsmInsRec WsAsmIns;/* Link the instruction `ins' to the end of the symbolic assembler chain, currently being constructed in `compiler'. */void ws_asm_link(WsCompilerPtr compiler, WsAsmIns *ins);/* Print the current assembler instructions of the compiler `compiler'. */void ws_asm_print(WsCompilerPtr compiler);/* Disassemble the byte-code `code', `len' to the standard output. */void ws_asm_dasm(WsCompilerPtr compiler, const unsigned char *code, size_t len);/* Linearize the assembler, currently being constructed in `compiler', into `compiler->byte_code'. */void ws_asm_linearize(WsCompilerPtr compiler);/* Constructors for assembler instructions. *//* Create a label instruction. */WsAsmIns *ws_asm_label(WsCompilerPtr compiler, WsUInt32 line);/* Create a branch instruction `ins' to label `label'. */WsAsmIns *ws_asm_branch(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 ins, WsAsmIns *label);/* Create a local call instruction to function `findex'. */WsAsmIns *ws_asm_call(WsCompilerPtr compiler, WsUInt32 line, WsUInt8 findex);/* Create a library call instruction to function `findex' from the libary `lindex'. */WsAsmIns *ws_asm_call_lib(WsCompilerPtr compiler, WsUInt32 line, WsUInt8 findex, WsUInt16 lindex);/* Create an URL call instruction for function `findex' from the URL `urlindex' with `args' arguments. The arguments `urlindex' and `findex' pont to the constant pool. */WsAsmIns *ws_asm_call_url(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 findex, WsUInt16 urlindex, WsUInt8 args);/* Create a variable modification instruction `ins' for the variable `vindex'. */WsAsmIns *ws_asm_variable(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 ins, WsUInt8 vindex);/* Create a constant loading instruction for the constant `cindex'. */WsAsmIns *ws_asm_load_const(WsCompilerPtr compiler, WsUInt32 line, WsUInt16 cindex);/* Create an instruction `ins'. */WsAsmIns *ws_asm_ins(WsCompilerPtr compiler, WsUInt32 line, WsUInt8 opcode);#endif /* not WSASM_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -