init20.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,033 行 · 第 1/3 页
C
1,033 行
#include "fail.h"
#include <stdlib.h>
#include <string.h>
/* Initialization torture test. This is extracted (with modifications)
* from the prag386 module of the C++ compiler. The primary purpose is
* to ensure that the cfe doesn't keel over when parsing this mess.
*/
typedef unsigned hw_reg_part;
typedef hw_reg_part HWT;
typedef struct hw_reg_set {
HWT _0;
} hw_reg_set;
enum { HW_AH_0 = (HWT)0x0001U+(HWT)(0x0000U<<16) } ;
enum { HW_AL_0 = (HWT)0x0002U+(HWT)(0x0000U<<16) } ;
enum { HW_BH_0 = (HWT)0x0004U+(HWT)(0x0000U<<16) } ;
enum { HW_BL_0 = (HWT)0x0008U+(HWT)(0x0000U<<16) } ;
enum { HW_CH_0 = (HWT)0x0010U+(HWT)(0x0000U<<16) } ;
enum { HW_CL_0 = (HWT)0x0020U+(HWT)(0x0000U<<16) } ;
enum { HW_DH_0 = (HWT)0x0040U+(HWT)(0x0000U<<16) } ;
enum { HW_DL_0 = (HWT)0x0080U+(HWT)(0x0000U<<16) } ;
enum { HW_SI_0 = (HWT)0x0100U+(HWT)(0x0000U<<16) } ;
enum { HW_DI_0 = (HWT)0x0200U+(HWT)(0x0000U<<16) } ;
enum { HW_BP_0 = (HWT)0x0400U+(HWT)(0x0000U<<16) } ;
enum { HW_SP_0 = (HWT)0x0800U+(HWT)(0x0000U<<16) } ;
enum { HW_DS_0 = (HWT)0x1000U+(HWT)(0x0000U<<16) } ;
enum { HW_ES_0 = (HWT)0x2000U+(HWT)(0x0000U<<16) } ;
enum { HW_CS_0 = (HWT)0x4000U+(HWT)(0x0000U<<16) } ;
enum { HW_SS_0 = (HWT)0x8000U+(HWT)(0x0000U<<16) } ;
enum { HW_ST0_0 = (HWT)0x0000U+(HWT)(0x0001U<<16) } ;
enum { HW_ST1_0 = (HWT)0x0000U+(HWT)(0x0002U<<16) } ;
enum { HW_ST2_0 = (HWT)0x0000U+(HWT)(0x0004U<<16) } ;
enum { HW_ST3_0 = (HWT)0x0000U+(HWT)(0x0008U<<16) } ;
enum { HW_ST4_0 = (HWT)0x0000U+(HWT)(0x0010U<<16) } ;
enum { HW_ST5_0 = (HWT)0x0000U+(HWT)(0x0020U<<16) } ;
enum { HW_ST6_0 = (HWT)0x0000U+(HWT)(0x0040U<<16) } ;
enum { HW_ST7_0 = (HWT)0x0000U+(HWT)(0x0080U<<16) } ;
enum { HW_EAXH_0 = (HWT)0x0000U+(HWT)(0x0100U<<16) } ;
enum { HW_EBXH_0 = (HWT)0x0000U+(HWT)(0x0200U<<16) } ;
enum { HW_ECXH_0 = (HWT)0x0000U+(HWT)(0x0400U<<16) } ;
enum { HW_EDXH_0 = (HWT)0x0000U+(HWT)(0x0800U<<16) } ;
enum { HW_ESIH_0 = (HWT)0x0000U+(HWT)(0x1000U<<16) } ;
enum { HW_EDIH_0 = (HWT)0x0000U+(HWT)(0x2000U<<16) } ;
enum { HW_FS_0 = (HWT)0x0000U+(HWT)(0x4000U<<16) } ;
enum { HW_GS_0 = (HWT)0x0000U+(HWT)(0x8000U<<16) } ;
enum { HW_FULL_0 = (HWT)0xffffU+(HWT)(0xffffU<<16) } ;
enum { HW_UNUSED_0 = (HWT)0x0000U+(HWT)(0x0000U<<16) } ;
enum { HW_EMPTY_0 = (HWT)0x0000U+(HWT)(0x0000U<<16) } ;
enum { HW_AX_0 = (hw_reg_part)(HW_AL_0+HW_AH_0),
HW_BX_0 = (hw_reg_part)(HW_BL_0+HW_BH_0),
HW_CX_0 = (hw_reg_part)(HW_CL_0+HW_CH_0),
HW_DX_0 = (hw_reg_part)(HW_DL_0+HW_DH_0),
HW_EAX_0 = (hw_reg_part)(HW_EAXH_0+HW_AX_0),
HW_EBX_0 = (hw_reg_part)(HW_EBXH_0+HW_BX_0),
HW_ECX_0 = (hw_reg_part)(HW_ECXH_0+HW_CX_0),
HW_EDX_0 = (hw_reg_part)(HW_EDXH_0+HW_DX_0),
HW_ESI_0 = (hw_reg_part)(HW_ESIH_0+HW_SI_0),
HW_EDI_0 = (hw_reg_part)(HW_EDIH_0+HW_DI_0),
HW_ABCD_0 = (hw_reg_part)(HW_AX_0+HW_BX_0 +HW_CX_0+HW_DX_0),
HW_SDSB_0 = (hw_reg_part)(HW_SI_0+HW_DI_0 +HW_SP_0+HW_BP_0),
HW_SEGS_0 = (hw_reg_part)(HW_DS_0+HW_ES_0+HW_CS_0 +HW_SS_0+HW_FS_0+HW_GS_0),
HW_IDX16_0 = (hw_reg_part)(HW_SI_0+HW_DI_0+HW_BX_0),
HW_FLTS_0 = (hw_reg_part)(HW_ST0_0+HW_ST1_0 +HW_ST2_0+HW_ST3_0 +HW_ST4_0+HW_ST5_0+HW_ST6_0+HW_ST7_0),
HW_FLTS_NOT_ST0_0 = (hw_reg_part)(HW_ST1_0 +HW_ST2_0+HW_ST3_0 +HW_ST4_0+HW_ST5_0+HW_ST6_0+HW_ST7_0),
HW_32_0 = (hw_reg_part)(HW_EAXH_0+HW_EBXH_0 +HW_ECXH_0+HW_EDXH_0+HW_ESIH_0+HW_EDIH_0),
HW_DX_AX_0 = (hw_reg_part)(HW_DX_0+HW_AX_0),
HW_CX_BX_0 = (hw_reg_part)(HW_CX_0+HW_BX_0),
HW_CX_DI_0 = (hw_reg_part)(HW_CX_0+HW_DI_0),
HW_BX_SI_0 = (hw_reg_part)(HW_BX_0+HW_SI_0),
HW_BX_DI_0 = (hw_reg_part)(HW_BX_0+HW_DI_0),
HW_BP_SI_0 = (hw_reg_part)(HW_BP_0+HW_SI_0),
HW_BP_DI_0 = (hw_reg_part)(HW_BP_0+HW_DI_0),
HW_DS_BX_0 = (hw_reg_part)(HW_DS_0+HW_BX_0),
HW_DS_SI_0 = (hw_reg_part)(HW_DS_0+HW_SI_0),
HW_DS_ESI_0 = (hw_reg_part)(HW_DS_0+HW_ESI_0),
HW_DS_DI_0 = (hw_reg_part)(HW_DS_0+HW_DI_0),
HW_SS_BX_0 = (hw_reg_part)(HW_SS_0+HW_BX_0),
HW_SS_SI_0 = (hw_reg_part)(HW_SS_0+HW_SI_0),
HW_SS_DI_0 = (hw_reg_part)(HW_SS_0+HW_DI_0),
HW_ES_BX_0 = (hw_reg_part)(HW_ES_0+HW_BX_0),
HW_ES_SI_0 = (hw_reg_part)(HW_ES_0+HW_SI_0),
HW_ES_DI_0 = (hw_reg_part)(HW_ES_0+HW_DI_0),
HW_ES_EDI_0 = (hw_reg_part)(HW_ES_0+HW_EDI_0),
HW_ECX_ESI_0 = (hw_reg_part)(HW_ECX_0+HW_ESI_0),
HW_ECX_EDI_0 = (hw_reg_part)(HW_ECX_0+HW_EDI_0),
HW_CS_EDI_0 = (hw_reg_part)(HW_CS_0+HW_EDI_0),
HW_FS_GS_0 = (hw_reg_part)(HW_FS_0+HW_GS_0),
HW_DS_GS_0 = (hw_reg_part)(HW_DS_0+HW_GS_0),
HW_ECX_EBX_0 = (hw_reg_part)(HW_ECX_0+HW_EBX_0),
HW_32_BP_SP_0= (hw_reg_part)(HW_32_0+HW_BP_0+HW_SP_0),
HW_DS_ES_FS_GS_0 = (hw_reg_part)(HW_DS_0+HW_ES_0+ HW_FS_0+HW_GS_0),
HW_DS_ES_SS_CS_0 = (hw_reg_part)(HW_DS_0+HW_ES_0+ HW_SS_0+HW_CS_0),
HW_AL_BL_CL_DL_0 = (hw_reg_part)(HW_AL_0+HW_BL_0+ HW_CL_0+HW_DL_0),
HW_AH_BH_CH_DH_0 = (hw_reg_part)(HW_AH_0+HW_BH_0+ HW_CH_0+HW_DH_0),
HW_AX_BX_CX_DX_SI_DI_0 = (hw_reg_part)(HW_AX_0+HW_BX_0 +HW_CX_0+HW_DX_0+HW_SI_0+HW_DI_0), HW__COMPOUND_END_0
};
typedef unsigned long call_class;
typedef unsigned long byte_seq_len;
#pragma pack(1)
typedef struct byte_seq {
byte_seq_len length;
char data[];
} byte_seq;
#pragma pack()
struct inline_funcs {
char *name;
byte_seq *code;
hw_reg_set *parms;
hw_reg_set returns;
hw_reg_set save;
};
hw_reg_set DefaultParms[] = {
{+ (HW_EAX_0+HW_EBX_0+HW_ECX_0+HW_EDX_0 ) } ,
{ 0 } };
char Registers[] = {
'e','s', '\0' ,
'd','s', '\0' ,
'c','s', '\0' ,
's','s', '\0' ,
'a','x', '\0' ,
'b','x', '\0' ,
'c','x', '\0' ,
'd','x', '\0' ,
'a','l', '\0' ,
'b','l', '\0' ,
'c','l', '\0' ,
'd','l', '\0' ,
'a','h', '\0' ,
'b','h', '\0' ,
'c','h', '\0' ,
'd','h', '\0' ,
's','i', '\0' ,
'd','i', '\0' ,
'b','p', '\0' ,
's','p', '\0' ,
'f','s', '\0' ,
'g','s', '\0' ,
'e','a','x', '\0' ,
'e','b','x', '\0' ,
'e','c','x', '\0' ,
'e','d','x', '\0' ,
'e','s','i', '\0' ,
'e','d','i', '\0' ,
'e','b','p', '\0' ,
'e','s','p', '\0' ,
'\0' };
hw_reg_set RegBits[] ={ {+ (HW_ES_0 ) } ,
{+ (HW_DS_0 ) } ,
{+ (HW_CS_0 ) } ,
{+ (HW_SS_0 ) } ,
{+ (HW_AX_0 ) } ,
{+ (HW_BX_0 ) } ,
{+ (HW_CX_0 ) } ,
{+ (HW_DX_0 ) } ,
{+ (HW_AL_0 ) } ,
{+ (HW_BL_0 ) } ,
{+ (HW_CL_0 ) } ,
{+ (HW_DL_0 ) } ,
{+ (HW_AH_0 ) } ,
{+ (HW_BH_0 ) } ,
{+ (HW_CH_0 ) } ,
{+ (HW_DH_0 ) } ,
{+ (HW_SI_0 ) } ,
{+ (HW_DI_0 ) } ,
{+ (HW_BP_0 ) } ,
{+ (HW_SP_0 ) } ,
{+ (HW_FS_0 ) } ,
{+ (HW_GS_0 ) } ,
{+ (HW_EAX_0 ) } ,
{+ (HW_EBX_0 ) } ,
{+ (HW_ECX_0 ) } ,
{+ (HW_EDX_0 ) } ,
{+ (HW_ESI_0 ) } ,
{+ (HW_EDI_0 ) } ,
{+ (HW_BP_0 ) } ,
{+ (HW_SP_0 ) } ,
};
hw_reg_set DefaultVarParms[] = {
{ 0 } };
hw_reg_set MSC_Save = {+ (HW_ESI_0+HW_EDI_0+HW_BP_0 ) } ;
enum asm_codes {
push_es = 0x06,
pop_es = 0x07,
sbb_rr = 0x19,
push_ds = 0x1e,
pop_ds = 0x1f,
sub_rr = 0x29,
xor_rr = 0x31,
cmp_al = 0x3c,
inc_cx = 0x41,
inc_di = 0x47,
dec_cx = 0x49,
dec_si = 0x4e,
dec_di = 0x4f,
push_ax = 0x50,
push_cx = 0x51,
push_dx = 0x52,
push_si = 0x56,
push_di = 0x57,
pop_ax = 0x58,
pop_cx = 0x59,
pop_dx = 0x5a,
pop_si = 0x5e,
pop_di = 0x5f,
size_prefix = 0x66,
je = 0x74,
jne = 0x75,
jge = 0x7d,
xchg_cx_ax = 0x91,
xchg_si_ax = 0x96,
cbw = 0x98,
cwde = 0x98,
cwd = 0x99,
fwait = 0x9b,
movsb = 0xa4,
movsd = 0xa5,
cmpsb = 0xa6,
stosb = 0xaa,
stosd = 0xab,
lodsb = 0xac,
lodsd = 0xad,
scasb = 0xae,
jcxz = 0xe3,
in_al_dx= 0xec,
in_ax_dx= 0xed,
out_dx_al=0xee,
out_dx_ax=0xef,
rep = 0xf3,
repnz = 0xf2,
repz = 0xf3,
cli = 0xfa,
sti = 0xfb,
cld = 0xfc,
ax_ax = 0xc0,
di_cx = 0xcf,
ax_dx = 0xd0,
cx_cx = 0xc9,
si_si = 0xf6,
hide1 = 0xa8,
cmc = 0xf5,
};
static byte_seq C_strcpy = { 0x1A, {
0x57,0x8A,0x06,0x88,0x07,0x3C,0x00,0x74,0x10,0x8A,
0x46,0x01,0x83,0xC6,0x02,0x88,0x47,0x01,0x83,0xC7,
0x02,0x3C,0x00,0x75,0xE8,0x5F
} };
static byte_seq S_strcpy = { 0x0A, {
0x57,0xAC,0x88,0x07,0x47,0x3C,0x00,0x75,0xF8,0x5F
} };
static byte_seq Z_strcpy = { 0x08, {
0x57,0xAC,0xAA,0x3C,0x00,0x75,0xFA,0x5F
} };
static byte_seq BD_strcpy = { 0x1C, {
0x57,0x8A,0x06,0x26,0x88,0x07,0x3C,0x00,0x74,0x11,
0x8A,0x46,0x01,0x83,0xC6,0x02,0x26,0x88,0x47,0x01,
0x83,0xC7,0x02,0x3C,0x00,0x75,0xE6,0x5F
} };
static byte_seq DP_strcpy = { 0x2A, {
0x1E,0x06,0x50,0x66,0x8E,0xC2,0x66,0x8E,0xD9,0x89,
0xDE,0x89,0xC7,0x8A,0x06,0x26,0x88,0x07,0x3C,0x00,
0x74,0x11,0x8A,0x46,0x01,0x83,0xC6,0x02,0x26,0x88,
0x47,0x01,0x83,0xC7,0x02,0x3C,0x00,0x75,0xE6,0x58,
0x07,0x1F
} };
static byte_seq C_strcat = { 0x26, {
0x06,0x1E,0x07,0x57,0x29,0xC9,0x49,0xB0,0x00,0xF2,
0xAE,0x4F,0x8A,0x06,0x88,0x07,0x3C,0x00,0x74,0x10,
0x8A,0x46,0x01,0x83,0xC6,0x02,0x88,0x47,0x01,0x83,
0xC7,0x02,0x3C,0x00,0x75,0xE8,0x5F,0x07
} };
static byte_seq FC_strcat = { 0x22, {
0x57,0x29,0xC9,0x49,0xB0,0x00,0xF2,0xAE,0x4F,0x8A,
0x06,0x88,0x07,0x3C,0x00,0x74,0x10,0x8A,0x46,0x01,
0x83,0xC6,0x02,0x88,0x47,0x01,0x83,0xC7,0x02,0x3C,
0x00,0x75,0xE8,0x5F
} };
static byte_seq S_strcat = { 0x11, {
0x57,0x4F,0x47,0x80,0x3F,0x00,0x75,0xFA,0xAC,0x88,
0x07,0x47,0x3C,0x00,0x75,0xF8,0x5F
} };
static byte_seq Z_strcat = { 0x12, {
0x57,0x51,0x29,0xC9,0x49,0xB0,0x00,0xF2,0xAE,0x59,
0x4F,0xAC,0xAA,0x3C,0x00,0x75,0xFA,0x5F
} };
static byte_seq BD_strcat = { 0x1C, {
0x57,0x29,0xC9,0x49,0xB0,0x00,0xF2,0xAE,0x4F,0x8A,
0x06,0xAA,0x3C,0x00,0x74,0x0B,0x8A,0x46,0x01,0x83,
0xC6,0x02,0xAA,0x3C,0x00,0x75,0xEE,0x5F
} };
static byte_seq DP_strcat = { 0x2A, {
0x1E,0x06,0x50,0x66,0x8E,0xC2,0x66,0x8E,0xD9,0x89,
0xDE,0x89,0xC7,0x29,0xC9,0x49,0xB0,0x00,0xF2,0xAE,
0x4F,0x8A,0x06,0xAA,0x3C,0x00,0x74,0x0B,0x8A,0x46,
0x01,0x83,0xC6,0x02,0xAA,0x3C,0x00,0x75,0xEE,0x58,
0x07,0x1F
} };
static byte_seq C_strchr = { 0x18, {
0x8A,0x06,0x38,0xD0,0x74,0x12,0x3C,0x00,0x74,0x0C,
0x46,0x8A,0x06,0x38,0xD0,0x74,0x07,0x46,0x3C,0x00,
0x75,0xEA,0x29,0xF6
} };
static byte_seq S_strchr = { 0x0D, {
0x8A,0x06,0x38,0xD0,0x74,0x07,0x46,0x3C,0x00,0x75,
0xF5,0x29,0xF6
} };
static byte_seq BD_strchr = { 0x12, {
0x66,0x8C,0xDA,0x8A,0x06,0x38,0xC8,0x74,0x09,0x46,
0x3C,0x00,0x75,0xF5,0x29,0xF6,0x29,0xD2
} };
static byte_seq C_div = {
8,
{ cwd,
0xf7,0xf9 ,
0x89,0x06,
0x89,0x56,0x04 }
};
static byte_seq S_memset = {
8,
{ push_es,
push_di,
push_ds,
pop_es,
rep,
stosb,
pop_di,
pop_es }
};
static byte_seq FS_memset = {
4,
{ push_di,
rep,
stosb,
pop_di, }
};
static byte_seq C_memset = {
13 +4,
{ push_es,
push_ds,
pop_es,
push_di, 0x88,0xc4, 0xd1,0xe9, rep, size_prefix,stosd, 0x11,0xc9, rep, stosb, pop_di ,
pop_es }
};
static byte_seq FC_memset = {
13 ,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?