NovaInstrucao/codigoCPU/montador.c
void DetectarLabels(void)
{

    parser_Init();
    char * str_tmp;
    char * str_tmp1;
    char str_msg[STRTAM];
    unsigned short end_cnt = 0;
    int op_code = 0;
    unsigned short aux = 0;

    while (Look != EOF)
    {
        str_tmp = parser_GetItem_s();
        op_code = BuscaInstrucao(str_tmp);
        if (op_code == LABEL_CODE)
        {
            parser_Match(':');
            AddLabel(str_tmp,end_cnt);
            sprintf(str_msg,"Label \"%s\" em 0x%x.",str_tmp,end_cnt);
            parser_Message(str_msg);
        }
        else if (op_code == VAR_CODE)
        {
            /* Faz parsing da pseudo-instrucao e pula 'n' enderecos */
            aux = RecebeNumero();
            end_cnt += aux;
        }
        else if (op_code == STRING_CODE)
        {
            /* Faz parsing da string, conta caracteres e pula o numero
               de caracteres + 1. */
            parser_Match_noskip('"');
            while (Look != '"')
            {
                if (Look == '\\')
                {
                    parser_GetChar();
                }
                end_cnt++;
                parser_GetChar();
            }
            parser_Match('"');
            end_cnt++;
        }
        else if (op_code == ALLOC_CODE)
        {
            /*
            alloc Label, #Nr

            Observacoes : alloc aloca, em tempo de montagem, um espaco
               (com base no numero) na parte da memoria para dados estaticos e
               cria um label para este espaco.

               Observacoes : alloc deve receber apenas numeros positivos (unsigned)
            */
            str_tmp1 = parser_GetItem_s();
            AddLabel(str_tmp1,alloc_cnt);
            sprintf(str_msg,"Label \"%s\" em 0x%x.",str_tmp1,alloc_cnt);
            free(str_tmp1);
            parser_Message(str_msg);
            parser_Match(',');
            aux = RecebeNumero();
            alloc_cnt += aux;
            if (alloc_cnt == END_STATIC_DATA_END+1)
                parser_Warning("Alloc ultrapassou o espaco de dados estaticos.");
        }
        else
        {
            /* Se for intrucao entao soma end_cnt
            conforme numero de linhas de endereco
            que esta funcao necessita.

            Tambem pula a declaracao da instrucao. */
            switch (op_code)
            {

            /* Loads e Stores */
            case LOAD_CODE :
            case STORE_CODE :
            case LOADIMED_CODE :
            case STOREIMED_CODE :
                parser_SkipUntil(','); 
                parser_SkipUntilEnd(); 
                end_cnt+=2; 
                break;
            case LOADINDEX_CODE :
            case STOREINDEX_CODE :
            case INPUT_CODE :
            case OUTPUT_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;

            /* BRA : instr +- () -> [...] */
            case BRA_CODE :
            case BEQ_CODE :
            case BNE_CODE :
            case BZ_CODE :
            case BNZ_CODE :
            case BC_CODE :
            case BNC_CODE :
            case BGT_CODE :
            case BLT_CODE :
            case BEG_CODE :
            case BEL_CODE :
            case BO_CODE :
            case BNO_CODE :
			    /* BRA nao implementado! */
                parser_Abort("BRA nao implementado!");				
                parser_SkipUntilEnd();
                end_cnt++;
                break;

            /* Instrucoes de 3 argumentos e 1 linha : instr (), (), () -> [...] */
            case ADD_CODE :
            case ADDC_CODE :
            case SUB_CODE :
            case SUBC_CODE :
            case MUL_CODE :
            case DIV_CODE :
	        case LMOD_CODE :	    
            case AND_CODE :
            case OR_CODE :
            case XOR_CODE :
            case ADDINTTOASCII_CODE :
                parser_SkipUntil(',');
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;

            /* Instrucoes de 2 argumentos e 1 linha : instr (), () -> [...] */
            case NOT_CODE :	/* Eu pus aqui pois sera' Rx <- Not Ry */
	        case MOV_CODE :
            case OUTCHAR_CODE :
            case CMP_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;

            /* Instrucoes de 1 argumento e 2 linhas : instr () -> [...] + [...] */
            case JMP_CODE :
            case JEQ_CODE :
            case JNE_CODE :
            case JZ_CODE :
            case JNZ_CODE :
            case JC_CODE :
            case JNC_CODE :
            case JGT_CODE :
            case JLT_CODE :
            case JEG_CODE :
            case JEL_CODE :
            case JO_CODE :
            case JNO_CODE :
	    case JDZ_CODE :
	    case JN_CODE :
            case CALL_CODE :
            case CEQ_CODE :
            case CNE_CODE :
            case CZ_CODE :
            case CNZ_CODE :
            case CC_CODE :
            case CNC_CODE :
            case CGT_CODE :
            case CLT_CODE :
            case CEG_CODE :
            case CEL_CODE :
            case CO_CODE :
            case CNO_CODE :
	    case CDZ_CODE :
	    case CN_CODE :
                parser_SkipUntilEnd();
                end_cnt+=2;
                break;

            /* Instrucoes de 1 argumento e 1 linha : instr () -> [...] */
            case INCHAR_CODE :
            case INC_CODE :
            case DEC_CODE :
/*            case NOT_CODE :  */
            case SHIFTL0_CODE :
            case SHIFTL1_CODE :
            case SHIFTR0_CODE :
            case SHIFTR1_CODE :
            case ROTL_CODE :
            case ROTR_CODE :
            case SET_CODE :
            case SEQ_CODE :
            case SNE_CODE :
            case SZ_CODE :
            case SNZ_CODE :
            case SC_CODE :
            case SNC_CODE :
            case SGT_CODE :
            case SLT_CODE :
            case SEG_CODE :
            case SEL_CODE :
            case SO_CODE :
            case SNO_CODE :
            case PUSH_CODE :
            case POP_CODE :
            case CALLR_CODE :
            case JMPR_CODE :
                parser_SkipUntilEnd();
                end_cnt++;
                break;

            /* Instrucoes sem argumentos e 1 linha : instr -> [...] */
            case RTS_CODE :
            case RTI_CODE :
            case HALT_CODE :
            case BREAKP_CODE :	    
            case SETC_CODE :
            case CLEARC_CODE :
            case NOP_CODE :
                end_cnt++;
                break;

            /* Pseudo-instrucoes */
            case STATIC_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                break;
            case EQU_CODE :
                parser_SkipUntilEnd();
                break;

            default :
                parser_Abort("Instrucao invalida!");
                break;
            }
        }
        free(str_tmp);
    }
    parser_Rewind();
}
/* Atencao: Uma instrucao por linha e um label por linha apenas! */
Uma instrucao por linha e um label por linha apenas!
Uma instrucao por linha e um label por linha apenas!
void DetectarLabels(void)
{
    parser_Init();
    char * str_tmp;
    char * str_tmp1;
    char str_msg[STRTAM];
    unsigned short end_cnt = 0;
    int op_code = 0;
    unsigned short aux = 0;
    while (Look != EOF)
    {
        str_tmp = parser_GetItem_s();
        op_code = BuscaInstrucao(str_tmp);
        if (op_code == LABEL_CODE)
        {
            parser_Match(':');
            AddLabel(str_tmp,end_cnt);
            sprintf(str_msg,"Label \"%s\" em 0x%x.",str_tmp,end_cnt);
            parser_Message(str_msg);
        }
        else if (op_code == VAR_CODE)
        {
            aux = RecebeNumero();
            end_cnt += aux;
        }
        else if (op_code == STRING_CODE)
        {
            parser_Match_noskip('"');
            while (Look != '"')
            {
                if (Look == '\\')
                {
                    parser_GetChar();
                }
                end_cnt++;
                parser_GetChar();
            }
            parser_Match('"');
            end_cnt++;
        }
        else if (op_code == ALLOC_CODE)
        {
            str_tmp1 = parser_GetItem_s();
            AddLabel(str_tmp1,alloc_cnt);
            sprintf(str_msg,"Label \"%s\" em 0x%x.",str_tmp1,alloc_cnt);
            free(str_tmp1);
            parser_Message(str_msg);
            parser_Match(',');
            aux = RecebeNumero();
            alloc_cnt += aux;
            if (alloc_cnt == END_STATIC_DATA_END+1)
                parser_Warning("Alloc ultrapassou o espaco de dados estaticos.");
        }
        else
        {
            switch (op_code)
            {
            case LOAD_CODE :
            case STORE_CODE :
            case LOADIMED_CODE :
            case STOREIMED_CODE :
                parser_SkipUntil(','); 
                parser_SkipUntilEnd(); 
                end_cnt+=2; 
                break;
            case LOADINDEX_CODE :
            case STOREINDEX_CODE :
            case INPUT_CODE :
            case OUTPUT_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;
            case BRA_CODE :
            case BEQ_CODE :
            case BNE_CODE :
            case BZ_CODE :
            case BNZ_CODE :
            case BC_CODE :
            case BNC_CODE :
            case BGT_CODE :
            case BLT_CODE :
            case BEG_CODE :
            case BEL_CODE :
            case BO_CODE :
            case BNO_CODE :
                parser_Abort("BRA nao implementado!");				
                parser_SkipUntilEnd();
                end_cnt++;
                break;
            case ADD_CODE :
            case ADDC_CODE :
            case SUB_CODE :
            case SUBC_CODE :
            case MUL_CODE :
            case DIV_CODE :
	        case LMOD_CODE :	    
            case AND_CODE :
            case OR_CODE :
            case XOR_CODE :
            case ADDINTTOASCII_CODE :
                parser_SkipUntil(',');
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;
            case NOT_CODE :	
	        case MOV_CODE :
            case OUTCHAR_CODE :
            case CMP_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                end_cnt++;
                break;
            case JMP_CODE :
            case JEQ_CODE :
            case JNE_CODE :
            case JZ_CODE :
            case JNZ_CODE :
            case JC_CODE :
            case JNC_CODE :
            case JGT_CODE :
            case JLT_CODE :
            case JEG_CODE :
            case JEL_CODE :
            case JO_CODE :
            case JNO_CODE :
	    case JDZ_CODE :
	    case JN_CODE :
            case CALL_CODE :
            case CEQ_CODE :
            case CNE_CODE :
            case CZ_CODE :
            case CNZ_CODE :
            case CC_CODE :
            case CNC_CODE :
            case CGT_CODE :
            case CLT_CODE :
            case CEG_CODE :
            case CEL_CODE :
            case CO_CODE :
            case CNO_CODE :
	    case CDZ_CODE :
	    case CN_CODE :
                parser_SkipUntilEnd();
                end_cnt+=2;
                break;
            case INCHAR_CODE :
            case INC_CODE :
            case DEC_CODE :
            case SHIFTL0_CODE :
            case SHIFTL1_CODE :
            case SHIFTR0_CODE :
            case SHIFTR1_CODE :
            case ROTL_CODE :
            case ROTR_CODE :
            case SET_CODE :
            case SEQ_CODE :
            case SNE_CODE :
            case SZ_CODE :
            case SNZ_CODE :
            case SC_CODE :
            case SNC_CODE :
            case SGT_CODE :
            case SLT_CODE :
            case SEG_CODE :
            case SEL_CODE :
            case SO_CODE :
            case SNO_CODE :
            case PUSH_CODE :
            case POP_CODE :
            case CALLR_CODE :
            case JMPR_CODE :
                parser_SkipUntilEnd();
                end_cnt++;
                break;
            case RTS_CODE :
            case RTI_CODE :
            case HALT_CODE :
            case BREAKP_CODE :	    
            case SETC_CODE :
            case CLEARC_CODE :
            case NOP_CODE :
                end_cnt++;
                break;
            case STATIC_CODE :
                parser_SkipUntil(',');
                parser_SkipUntilEnd();
                break;
            case EQU_CODE :
                parser_SkipUntilEnd();
                break;
            default :
                parser_Abort("Instrucao invalida!");
                break;
            }
        }
        free(str_tmp);
    }
    parser_Rewind();
}
void DetectarLabels ( void ) { parser_Init ( ) ; char * str_tmp ; char * str_tmp1 ; char str_msg [ STRTAM ] ; unsigned short end_cnt = 0 ; int op_code = 0 ; unsigned short aux = 0 ; while ( Look != EOF ) { str_tmp = parser_GetItem_s ( ) ; op_code = BuscaInstrucao ( str_tmp ) ; if ( op_code == LABEL_CODE ) { parser_Match ( ' ' ) ; AddLabel ( str_tmp , end_cnt ) ; sprintf ( str_msg , " \" \" " , str_tmp , end_cnt ) ; parser_Message ( str_msg ) ; } else if ( op_code == VAR_CODE ) { aux = RecebeNumero ( ) ; end_cnt += aux ; } else if ( op_code == STRING_CODE ) { parser_Match_noskip ( ' ' ) ; while ( Look != ' ' ) { if ( Look == ' \\ ' ) { parser_GetChar ( ) ; } end_cnt ++ ; parser_GetChar ( ) ; } parser_Match ( ' ' ) ; end_cnt ++ ; } else if ( op_code == ALLOC_CODE ) { str_tmp1 = parser_GetItem_s ( ) ; AddLabel ( str_tmp1 , alloc_cnt ) ; sprintf ( str_msg , " \" \" " , str_tmp1 , alloc_cnt ) ; free ( str_tmp1 ) ; parser_Message ( str_msg ) ; parser_Match ( ' ' ) ; aux = RecebeNumero ( ) ; alloc_cnt += aux ; if ( alloc_cnt == END_STATIC_DATA_END + 1 ) parser_Warning ( " " ) ; } else { switch ( op_code ) { case LOAD_CODE : case STORE_CODE : case LOADIMED_CODE : case STOREIMED_CODE : parser_SkipUntil ( ' ' ) ; parser_SkipUntilEnd ( ) ; end_cnt += 2 ; break ; case LOADINDEX_CODE : case STOREINDEX_CODE : case INPUT_CODE : case OUTPUT_CODE : parser_SkipUntil ( ' ' ) ; parser_SkipUntilEnd ( ) ; end_cnt ++ ; break ; case BRA_CODE : case BEQ_CODE : case BNE_CODE : case BZ_CODE : case BNZ_CODE : case BC_CODE : case BNC_CODE : case BGT_CODE : case BLT_CODE : case BEG_CODE : case BEL_CODE : case BO_CODE : case BNO_CODE : parser_Abort ( " " ) ; parser_SkipUntilEnd ( ) ; end_cnt ++ ; break ; case ADD_CODE : case ADDC_CODE : case SUB_CODE : case SUBC_CODE : case MUL_CODE : case DIV_CODE : case LMOD_CODE : case AND_CODE : case OR_CODE : case XOR_CODE : case ADDINTTOASCII_CODE : parser_SkipUntil ( ' ' ) ; parser_SkipUntil ( ' ' ) ; parser_SkipUntilEnd ( ) ; end_cnt ++ ; break ; case NOT_CODE : case MOV_CODE : case OUTCHAR_CODE : case CMP_CODE : parser_SkipUntil ( ' ' ) ; parser_SkipUntilEnd ( ) ; end_cnt ++ ; break ; case JMP_CODE : case JEQ_CODE : case JNE_CODE : case JZ_CODE : case JNZ_CODE : case JC_CODE : case JNC_CODE : case JGT_CODE : case JLT_CODE : case JEG_CODE : case JEL_CODE : case JO_CODE : case JNO_CODE : case JDZ_CODE : case JN_CODE : case CALL_CODE : case CEQ_CODE : case CNE_CODE : case CZ_CODE : case CNZ_CODE : case CC_CODE : case CNC_CODE : case CGT_CODE : case CLT_CODE : case CEG_CODE : case CEL_CODE : case CO_CODE : case CNO_CODE : case CDZ_CODE : case CN_CODE : parser_SkipUntilEnd ( ) ; end_cnt += 2 ; break ; case INCHAR_CODE : case INC_CODE : case DEC_CODE : case SHIFTL0_CODE : case SHIFTL1_CODE : case SHIFTR0_CODE : case SHIFTR1_CODE : case ROTL_CODE : case ROTR_CODE : case SET_CODE : case SEQ_CODE : case SNE_CODE : case SZ_CODE : case SNZ_CODE : case SC_CODE : case SNC_CODE : case SGT_CODE : case SLT_CODE : case SEG_CODE : case SEL_CODE : case SO_CODE : case SNO_CODE : case PUSH_CODE : case POP_CODE : case CALLR_CODE : case JMPR_CODE : parser_SkipUntilEnd ( ) ; end_cnt ++ ; break ; case RTS_CODE : case RTI_CODE : case HALT_CODE : case BREAKP_CODE : case SETC_CODE : case CLEARC_CODE : case NOP_CODE : end_cnt ++ ; break ; case STATIC_CODE : parser_SkipUntil ( ' ' ) ; parser_SkipUntilEnd ( ) ; break ; case EQU_CODE : parser_SkipUntilEnd ( ) ; break ; default : parser_Abort ( " " ) ; break ; } } free ( str_tmp ) ; } parser_Rewind ( ) ; }
Atencao: Uma instrucao por linha e um label por linha apenas!
Atencao : Uma instrucao por linha e um label por linha apenas!
/* Faz parsing da pseudo-instrucao e pula 'n' enderecos */ /* Faz parsing da string, conta caracteres e pula o numero
               de caracteres + 1. */ /*
            alloc Label, #Nr

            Observacoes : alloc aloca, em tempo de montagem, um espaco
               (com base no numero) na parte da memoria para dados estaticos e
               cria um label para este espaco.

               Observacoes : alloc deve receber apenas numeros positivos (unsigned)
            */ /* Se for intrucao entao soma end_cnt
            conforme numero de linhas de endereco
            que esta funcao necessita.

            Tambem pula a declaracao da instrucao. */ /* Loads e Stores */ /* BRA : instr +- () -> [...] */ /* BRA nao implementado! */ /* Instrucoes de 3 argumentos e 1 linha : instr (), (), () -> [...] */ /* Instrucoes de 2 argumentos e 1 linha : instr (), () -> [...] */ /* Eu pus aqui pois sera' Rx <- Not Ry */ /* Instrucoes de 1 argumento e 2 linhas : instr () -> [...] + [...] */ /* Instrucoes de 1 argumento e 1 linha : instr () -> [...] */ /*            case NOT_CODE :  */ /* Instrucoes sem argumentos e 1 linha : instr -> [...] */ /* Pseudo-instrucoes */