objemit.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 807 行 · 第 1/2 页

C
807
字号
        case EASY_EXEC_ONLY:    Emit( "EO " );  break;
        case EASY_EXEC_READ:    Emit( "ER " );  break;
        case EASY_READ_WRITE:   Emit( "RW " );  break;
        }
    }
}


static  void  EmitSegCombine( void )
/**********************************/

{
    char                combine;

    if( Segment->class == TYPE_COMDAT ) return;
    combine = _SegCombine( Segment );
    switch( combine ) {
    case 0:
        if( ( Options & FORM_ASSEMBLER ) == 0 ) {
            Emit( "PRIVATE " );
        }
        break;
    case 2:
        Emit( "PUBLIC " );
        break;
    case 5:
        Emit( "STACK " );
        break;
    case 6:
        Emit( "COMMON " );
        break;
    }
}


void  EmitEndSeg()
/****************/

{
    if( !DO_UNIX ) {
        if( Segment->name != NULL ) {
            if( Options & FORM_ASSEMBLER ) {
                if( Segment->start != 0 ) {
                    EmitOrg( Segment->start );
                }
                EmitSegName( Segment, LABEL_LEN );
                EmitLine( "ENDS" );
                EmitNL();
            } else {
                DumpImpList();
                EmitDashes( LINE_LEN );
            }
        }
    } else {
        EmitNL();
    }
}


void  EmitLabel( char *lbl, uint_32 origin )
/******************************************/

{
    if( DO_UNIX ) {
        EmitSpaced( ".bss", LABEL_LEN );
        EmitSym( lbl, 0 );
        EmitSpaced( ", ", OPCODE_LEN - strlen( lbl ) );
        EmitOrg( origin );
    } else {
        EmitOrg( origin );
        EmitSym( lbl, LABEL_LEN );
        if( Segment->data_seg ) {
            EmitLine( "LABEL   BYTE" );
        } else {
            EmitLine( "LABEL   NEAR" );
        }
    }
}

void EmitHex( uint_32 val )
/*************************/
{
    char                numbuff[ 16 ];

    DoIToHS( numbuff, val, WORD_SIZE );
    Emit( numbuff );
}


static void EmitOrg( uint_32 origin )
/***********************************/

{
    if( !DO_UNIX ) {
        EmitBlanks( LABEL_LEN );
        EmitSpaced( "ORG", OPCODE_LEN );
    }
    EmitHex( origin );
    EmitNL();
}


void  DoEmit( int msg_num )
/***************/
{
    char        msg_buff[MAX_RESOURCE_SIZE];

    MsgGet( msg_num, msg_buff );
    Emit( msg_buff );
}


void  Emit( str )
/***************/

    char                *str;
{
    if( ( Pass == 2 ) && ( str != NULL ) ) {
        PutString( str );
    }
}


void  EmitNL()
/************/

{
    if( Pass == 2 ) {
        FPutEnd( Output );
    }
}


void  EmitLine( ptr )
/*******************/

    char                *ptr;
{
    Emit( ptr );
    EmitNL();
}


void  EmitAddr( uint_32 addr, int len, char *straddr )
/*************************************/
{
    char                buff[ 16 ];

    Emit( " " );
    IToHS( buff, addr, len );
    buff[ len ] = NULLCHAR;
    if( straddr == NULL ){
        Emit( buff );
    } else {
        strcpy( straddr, buff );
    }
}


void  EmitDashes( int length )
/****************************/
{
    int                 i;

    i = 0;
    while( ++i <= length ) {
        Emit( "-" );
    }
    EmitNL();
}


void  EmitBlanks( int blanks )
/****************************/
{
    do {
        Emit( " " );
    } while( --blanks > 0 );
}


void  DoEmitSpaced( int msgnum, int spacing )
/******************************************/
{
    char        rc_buff[MAX_RESOURCE_SIZE];

    MsgGet( msgnum, rc_buff );
    EmitSpaced( rc_buff, spacing );
}


int  EmitSpaced( char *str, int spacing )
/***************************************/
{
    int                 length;
    int                 over;

    if( str == NULL ) {
        length = 0;
    } else {
        length = strlen( str );
        Emit( str );
    }
    over = (length >= spacing);
    do {
        Emit( " " );
    } while( ++length < spacing );
    return( over );
}

int EmitSym( char *sym, unsigned spacing )
{
    return( EmitSpaced( FormSym( sym ), spacing ) );
}

void EmitSegName( segment *seg, unsigned spacing )
{
    if( seg->class == TYPE_COMDAT ) {
        EmitSym( seg->name, spacing );
    } else {
        EmitSpaced( seg->name, spacing );
    }
}


void  DoEmitError( int msg_num )
/**************************/
{
    char        msg_buff[MAX_RESOURCE_SIZE];

    MsgGet( msg_num, msg_buff );
    EmitError( msg_buff );
}


void  EmitError( char *msg )
/**************************/
{
    if( Options & FORM_ASSEMBLER ) {
        Emit( "; " );
    }
    DoEmit( MSG_ERROR );
    EmitLine( msg );
    ++ErrCount;
}


void  EmitLoc()
/*************/

{
    if( ( Options & FORM_ASSEMBLER ) == 0 ) {
        EmitAddr( InsAddr, 4, NULL );
        Emit( "  " );
    }
}


void  EmitBytes()
/***************/

{
    int                 len, curr_len;
    char                DataBuff[ 3 ];

    if( ( Options & FORM_ASSEMBLER ) == 0 ) {
        len = 0;
        curr_len = 0;
        if( DataBytes != 0 ) {
            for( ;; ) {
                IToHS( DataBuff, DataString[ len ], 2 );
                DataBuff[ 2 ] = NULLCHAR;
                Emit( DataBuff );
                Emit( " " );
                ++len;
                ++curr_len;
                if( len >= DataBytes ) break;
                if( curr_len == DataLen ) {
                    EmitNL();
                    Emit( "       " );
                    curr_len = 0;
                }
            }
        }
        while( ++curr_len <= DataLen ) {
            Emit( "   " );
        }
    }
}


void  EmitSrc()
/*************/

{
    if( Source != NULL && Pass == 2 ) {
        FindSrcLine( GetOffset() );
    }
}


void  InitAsm()
/*************/

{
    ErrCount = 0;
    InitBuffs();
    if( Segment->data_seg ) {
        DataLen = 8;
    } else {
        DataLen = 6;
    }
}


static  void  InitBuffs()
/***********************/

{
    NameBuff[ 0 ] = NULLCHAR;
}


void  FiniAsm()
/*************/

{
    char                numbuff[ 16 ];

    if( ( Options & FORM_ASSEMBLER ) == 0 && Pass != 1 ) {
        EmitNL();
        if( ErrCount == 0 ) {
            DoEmit( MSG_NO_DISASM_ERR );
        } else {
            itoa( ErrCount, numbuff, 10 );
            SubStrEmit( MSG_DISASM_ERR, numbuff, 's' );
        }
        EmitNL();
        EmitNL();
    }
}


void  EmitDups()
/**************/

{
    int                 i;
    char                numbuff[ 16 ];

    itoa( Repeats - 1, numbuff, 10 );
    if( Options & FORM_ASSEMBLER ) {
        EmitBlanks( LABEL_LEN );
        Emit( DBstring() );
        Emit( numbuff );
        Emit( " DUP(" );
        i = 0;
        do {
            if( i > 0 ) {
                Emit( "," );
            }
            DoIToHS( numbuff, PrevString[ i ], 2 );
            Emit( numbuff );
        } while( ++i != MAX_DATA_LEN );
        EmitLine( ")" );
    } else {
        SubStrEmit( MSG_ABOVE_LN_REPEAT, numbuff, 's' );
        EmitNL();
    }
    Repeats = 0;
}


static void EmitRetFMacro( void )
/*******************************/

{
    char                **str;
    char                tmp_buff[ 8 ];

    strcpy( tmp_buff, "retf" );
    if( Options & FORM_NAME_UPPER ) {
        ZapUpper( tmp_buff );
    }
    Emit( tmp_buff );
    str = RetFMacro;
    while( *str != NULL ) {
        EmitLine( *str );
        ++str;
    }
}


static void SubStrEmit( int msgnum, char *para, char specifier )
/**************************************************************/
{
    char        msg_buff[MAX_RESOURCE_SIZE];

    MsgGet( msgnum, msg_buff );
    MsgSubStr( msg_buff, para, specifier );
    Emit( msg_buff );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?