📄 pdefn386.h
字号:
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#define NC '\0'
hw_reg_set DefaultParms[] = {
#if _CPU == 8086
HW_AX+HW_BX+HW_CX+HW_DX+HW_ST1+HW_ST2+HW_ST3+HW_ST4,
#elif _CPU == 386
HW_D_4( HW_EAX,HW_EBX,HW_ECX,HW_EDX ) /*+HW_ST1+HW_ST2+HW_ST3+HW_ST4*/,
#endif
{ 0 } };
#ifndef WCPP
char Registers[] = { /* table for TableLookup*/
'e','s',NC, /* should agree with RegBits*/
'd','s',NC,
'c','s',NC,
's','s',NC,
'a','x',NC,
'b','x',NC,
'c','x',NC,
'd','x',NC,
'a','l',NC,
'b','l',NC,
'c','l',NC,
'd','l',NC,
'a','h',NC,
'b','h',NC,
'c','h',NC,
'd','h',NC,
's','i',NC,
'd','i',NC,
'b','p',NC,
's','p',NC,
#if _CPU == 386
'f','s',NC,
'g','s',NC,
'e','a','x',NC,
'e','b','x',NC,
'e','c','x',NC,
'e','d','x',NC,
'e','s','i',NC,
'e','d','i',NC,
'e','b','p',NC,
'e','s','p',NC,
#endif
NC };
hw_reg_set RegBits[] ={ HW_D( HW_ES ),
HW_D( HW_DS ),
HW_D( HW_CS ),
HW_D( HW_SS ),
HW_D( HW_AX ),
HW_D( HW_BX ),
HW_D( HW_CX ),
HW_D( HW_DX ),
HW_D( HW_AL ),
HW_D( HW_BL ),
HW_D( HW_CL ),
HW_D( HW_DL ),
HW_D( HW_AH ),
HW_D( HW_BH ),
HW_D( HW_CH ),
HW_D( HW_DH ),
HW_D( HW_SI ),
HW_D( HW_DI ),
HW_D( HW_BP ),
HW_D( HW_SP ),
#if _CPU == 386
HW_D( HW_FS ),
HW_D( HW_GS ),
HW_D( HW_EAX ),
HW_D( HW_EBX ),
HW_D( HW_ECX ),
HW_D( HW_EDX ),
HW_D( HW_ESI ),
HW_D( HW_EDI ),
HW_D( HW_BP ),
HW_D( HW_SP ),
#endif
};
hw_reg_set DefaultVarParms[] = {
{ 0 } };
/* these are the registers that Microsoft saves and restores */
hw_reg_set MSC_Save = HW_D_3( HW_ESI, HW_EDI, HW_BP );
/* INLINE FUNCTIONS */
struct aux_info InlineInfo;
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 = 0xf2,
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,
};
#define hide2 size_prefix,0xa9
#define movsw size_prefix,movsd
#define stosw size_prefix,stosd
#define lodsw size_prefix,lodsd
#define sbb_ax_ffff 0x83,0xd8,0xff
#define sbb_cx_ffff 0x83,0xd9,0xff
#define mov_cx_ax 0x89,0xc1
#define mov_dx_ax 0x89,0xc2
#define mov_di_ax 0x89,0xc7
#define mov_ax_cx 0x89,0xc8
#define mov_ax_dx 0x89,0xd0
#define mov_ax_bx 0x89,0xd8
#define mov_si_bx 0x89,0xde
#define mov_dx_si 0x89,0xf2
#define mov_ax_di 0x89,0xf8
#define mov_cl_al 0x8a,0xc8
#define mov_ax_es 0x8c,0xc0
#define mov_cx_es 0x8c,0xc1
#define mov_dx_es 0x8c,0xc2
#define mov_ax_ds 0x8c,0xd8
#define mov_dx_ds 0x8c,0xda
#define mov_ds_ax 0x8e,0xd8
#define mov_es_ax 0x8e,0xc0
#define mov_es_cx 0x8e,0xc1
#define mov_es_dx 0x8e,0xc2
#define mov_ds_cx 0x8e,0xd9
#define mov_ds_dx 0x8e,0xda
#define mov_ds_si 0x8e,0xde
#define mov_ah_atdi 0x8a,0x27
#define mov_ah_atesdi 0x26,0x8a,0x27
#define not_cx 0xf7,0xd1
#define or_cx_cx 0x09,0xc9
#define or_dx_dx 0x0b,0xd2
#define neg_ax 0xf7,0xd8
#define adc_dx_0 0x83,0xd2,0x00
#define neg_dx 0xf7,0xda
#define sub_al_ah 0x28,0xe0
#define sub_ah_ah 0x28,0xe4
#define shr_cx_1 0xd1,0xe9
#define shr_cx_2 0xc1,0xe9,0x02
#define adc_cx_cx 0x11,0xc9
#define xchg_si_di 0x87,0xfe
#define mov_cx_ffff 0x29,0xc9,0x49 /* sub cx,cx; dec cx */
#define test_al_al 0x84,0xc0
#define test_ah_ah 0x84,0xe4
#define test_al_aa 0xa8,0xaa
#define fabs 0xd9,0xe1
#define and_cl 0x80,0xe1
#define and_ah_7f 0x80,0xe4,0x7f
#define mov_ah_al 0x88,0xc4
#define mov_di_cx 0x89,0xcf
#define cmp_al_dl 0x38,0xd0
#define cmp_ah_dl 0x38,0xd4
#define cmp_al_cl 0x38,0xc8
#define cmp_ah_cl 0x38,0xcc
#define cmp_al_ah 0x38,0xe0
#define mov_dx_si 0x89,0xf2
#define cmp_atdi_0 0x80,0x3f,0x00
#define cmp_atesdi_0 0x26,0x80,0x3f,0x00
#define idiv_cx 0xf7,0xf9
#define shl_edx_1 0xd1,0xe2
#define shr_edx_1 0xd1,0xea
#define sub_ax_dx 0x29,0xd0
#define sbb_cx_cx 0x19,0xc9
#define and_ax_cx 0x21,0xc8
#define add_ax_dx 0x01,0xd0
#define sbb_ah_ah 0x18,0xe4
/*
here come the code bursts ...
*/
#include "code386.gh"
/* dx:ax div( ax, cx ) */
#define C_div_ret HW_D( HW_EAX )
#define C_div_parms P_AX_CX
#define C_div_saves HW_NotD_2( HW_EAX, HW_EDX )
static byte_seq C_div = {
8,
{ cwd,
idiv_cx,
0x89,0x06, /* mov [esi],eax store quotient */
0x89,0x56,0x04 } /* mov 4[esi],edx store remainder */
};
/* di memset( di, al, cx ) zaps es,cx */
#define S_memset_ret HW_D( HW_EDI )
#define S_memset_parms P_DI_AL_CX
#define S_memset_saves HW_NotD( HW_ECX )
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, }
};
/* di memset( di, al, cx ) zaps es,ah,cx */
#define C_memset_ret HW_D( HW_EDI )
#define C_memset_parms P_DI_AL_CX
#define C_memset_saves HW_NotD_2( HW_AH, HW_ECX )
#define C_memset_bodysize 13
#define C_memset_body \
push_di,\
mov_ah_al,\
shr_cx_1,\
rep,\
stosw,\
adc_cx_cx,\
rep,\
stosb,\
pop_di
static byte_seq C_memset = {
C_memset_bodysize+4,
{ push_es,
push_ds,
pop_es,
C_memset_body,
pop_es }
};
static byte_seq FC_memset = {
C_memset_bodysize,
{ C_memset_body, }
};
/* es:di memset( es:di, al, cx ) zaps cx */
#define Z_memset_ret HW_D_2( HW_ES, HW_EDI )
#define Z_memset_parms P_ESDI_AL_CX
#define Z_memset_saves HW_NotD( HW_ECX )
static byte_seq Z_memset = {
4,
{ push_di,
rep,
stosb,
pop_di }
};
/* es:di memset( es:di, al, cx ) zaps ah,cx */
#define BD_memset_ret HW_D_2( HW_ES, HW_EDI )
#define BD_memset_parms P_ESDI_AL_CX
#define BD_memset_saves HW_NotD_2( HW_AH, HW_ECX )
static byte_seq BD_memset = {
13,
{ push_di,
mov_ah_al,
shr_cx_1,
rep,
stosw,
adc_cx_cx,
rep,
stosb,
pop_di }
};
/* dx:edi memset( dx:edi, al, ecx ) zaps ah,ecx */
#define DP_memset_ret HW_D_2( HW_DX, HW_EDI )
#define DP_memset_parms P_DXEDI_AL_ECX
#define DP_memset_saves HW_NotD_2( HW_AH, HW_ECX )
static byte_seq DP_memset = {
17,
{ push_es,
push_di,
mov_es_dx,
mov_ah_al,
shr_cx_1,
rep,
stosw,
adc_cx_cx,
rep,
stosb,
pop_di,
pop_es }
};
/****************************************************************/
/* edi stosw( es:edi, ax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be even */
#define C_stosw_ret HW_D( HW_EDI )
#define C_stosw_parms P_DXEDI_AX_CX
#define C_stosw_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq C_stosw = {
7,
{ push_es,
mov_es_dx,
rep,
stosw,
pop_es }
};
/* edi stosw( edi, ax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be even */
#define F_stosw_ret HW_D( HW_EDI )
#define F_stosw_parms P_DI_AX_CX
#define F_stosw_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq F_stosw = {
3,
{ rep,
stosw, }
};
/* es:edi stosw( es:edi, ax, ecx ) zaps edi,ecx */
#define BD_stosw_ret HW_D( HW_EDI )
#define BD_stosw_parms P_ESDI_AX_CX
#define BD_stosw_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq BD_stosw = {
3,
{ rep,
stosw, }
};
/* edi stosd( es:edi, eax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be multiple of 4 */
#define C_stosd_ret HW_D( HW_EDI )
#define C_stosd_parms P_DXEDI_EAX_ECX
#define C_stosd_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq C_stosd = {
6,
{ push_es,
mov_es_dx,
rep,
stosd,
pop_es }
};
/* edi stosd( edi, eax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be multiple of 4 */
#define F_stosd_ret HW_D( HW_EDI )
#define F_stosd_parms P_EDI_EAX_ECX
#define F_stosd_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq F_stosd = {
2,
{ rep,
stosd, }
};
/* es:edi stosd( es:edi, eax, ecx ) zaps edi,ecx */
#define BD_stosd_ret HW_D( HW_EDI )
#define BD_stosd_parms P_ESEDI_EAX_ECX
#define BD_stosd_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq BD_stosd = {
2,
{ rep,
stosd, }
};
/* edi stoswb( es:edi, ax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be odd */
#define C_stoswb_ret HW_D( HW_EDI )
#define C_stoswb_parms P_DXEDI_AX_CX
#define C_stoswb_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq C_stoswb = {
8,
{ push_es,
mov_es_dx,
rep,
stosw,
stosb,
pop_es }
};
/* edi stoswb( edi, ax, ecx ) zaps edi,ecx */
/* used when value of ECX is known to be odd */
#define F_stoswb_ret HW_D( HW_EDI )
#define F_stoswb_parms P_DI_AX_CX
#define F_stoswb_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq F_stoswb = {
4,
{ rep,
stosw,
stosb, }
};
/* es:edi stoswb( es:edi, al, ecx ) zaps edi,ecx */
#define BD_stoswb_ret HW_D( HW_EDI )
#define BD_stoswb_parms P_ESDI_AX_CX
#define BD_stoswb_saves HW_NotD_2( HW_EDI, HW_ECX )
static byte_seq BD_stoswb = {
4,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -