⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zasm.cpp

📁 自己开发的汇编式脚本语言编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:

        // 返回符号大小

        return  pSymbol->iSize;
    }

    /*****************************************************************************************
    *
    *   AddLabel()
    *
    *   向标签表添加标签
    */

    int AddLabel( char *pstrIdent, int iTargetIndex, int iFuncIndex )
    {
        // 如果标签已经存在,则返回无效索引-1

        if( GetLabelByIdent( pstrIdent, iFuncIndex ) )
            return  -1;

        // 创建新标签节点

        LabelNode   *pNewLabel  = new LabelNode;

        // 为新节点赋值

        strcpy( pNewLabel->pstrIdent, pstrIdent );
        pNewLabel->iTargetIndex = iTargetIndex;
        pNewLabel->iFuncIndex   = iFuncIndex;

        // 将新节点插入到标签表并取得索引

        pNewLabel->iIndex   = AddNode( &g_LabelTable, pNewLabel );

        // 返回索引

        return  pNewLabel->iIndex;
    }

    /*****************************************************************************************
    *
    *   GetLabelByIdent()
    *
    *   根据标标签标识符取得标签节点
    */

    LabelNode* GetLabelByIdent( char *pstrIdent, int iFuncIndex )
    {
        // 如果标签表为空,返回0

        if( g_LabelTable.iNodeCount == 0 )
            return  0;
        
        // 创建一个链表节点用于遍历

        LinkedListNode  *pCurrNode  = g_LabelTable.pHead;

        // 遍历标签表,寻找匹配的标签

        for( int i=0 ; i<g_LabelTable.iNodeCount ; ++i )
        {
            LabelNode   *pCurrLabel = (LabelNode*)pCurrNode->pData;

            // 如果名称和范围匹配,则返回当前指针
            if( strcmp( pCurrLabel->pstrIdent, pstrIdent) == 0 && 
                pCurrLabel->iFuncIndex == iFuncIndex )
            {
                return  pCurrLabel;
            }
            else
            {
                pCurrNode   = pCurrNode->pNext;
            }
        }

        // 没有找到匹配的结构,返回0

        return  0;
    }

    /*****************************************************************************************
    *
    *   InitInstrTable()
    *
    *   初始化指令查找表
    */

    void InitInstrTable()
    {
        int     iInstrIndex;

        // ---- 数据传输指令

        // Mov      Destination, Source

        iInstrIndex = AddInstrLookup( "Mov", INSTR_MOV, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // ---- 算数指令

        // Add      Destination, Source

        iInstrIndex = AddInstrLookup( "Add", INSTR_ADD, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Sub      Destination, Source

        iInstrIndex = AddInstrLookup( "Sub", INSTR_SUB, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Mul      Destination, Source

        iInstrIndex = AddInstrLookup( "Mul", INSTR_MUL, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Div      Destination, Source

        iInstrIndex = AddInstrLookup( "Div", INSTR_DIV, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Mod      Destination, Source

        iInstrIndex = AddInstrLookup( "Mod", INSTR_MOD, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Exp      Destination, Source

        iInstrIndex = AddInstrLookup( "Exp", INSTR_EXP, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Neg      Destination

        iInstrIndex = AddInstrLookup( "Neg", INSTR_NEG, 1 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
     
        // Inc      Destination

        iInstrIndex = AddInstrLookup( "Inc", INSTR_INC, 1 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );

        // Dec      Destination

        iInstrIndex = AddInstrLookup( "Dec", INSTR_DEC, 1 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );

        // ---- 位运算 

        // And      Destination, Source

        iInstrIndex = AddInstrLookup( "And", INSTR_AND, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );


        // Or       Destination, Source

        iInstrIndex = AddInstrLookup( "Or", INSTR_OR, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );


        // Xor      Destination, Source

        iInstrIndex = AddInstrLookup( "Xor", INSTR_XOR, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );


        // Not      Destination

        iInstrIndex = AddInstrLookup( "Not", INSTR_NOT, 1 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );

        // Shl      Destination, Source

        iInstrIndex = AddInstrLookup( "Shl", INSTR_SHL, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // Shr      Destination, Source

        iInstrIndex = AddInstrLookup( "Shr", INSTR_SHR, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING |
                                   OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG );

        // ---- 字符串处理

        // Concat   String0, String1
        
        iInstrIndex = AddInstrLookup( "Concat", INSTR_CONCAT, 2 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_STRING );

        // GetChar  Destination, Source, Index

        iInstrIndex = AddInstrLookup( "GetChar", INSTR_GETCHAR, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 2, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT );

        // SetChar  Destination, Index, Source

        iInstrIndex = AddInstrLookup( "GetChar", INSTR_SETCHAR, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF|
                                   OP_FLAG_TYPE_REG );
        SetOpType( iInstrIndex, 1, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT );
        SetOpType( iInstrIndex, 2, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_STRING );

        // ---- 跳转指令

        // Jmp      Label

        iInstrIndex = AddInstrLookup( "Jmp", INSTR_JMP, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JE       Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JE", INSTR_JE, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JNE      Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JNE", INSTR_JNE, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JG       Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JG", INSTR_JG, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JL       Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JL", INSTR_JL, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JGE      Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JGE", INSTR_JGE, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

        // JLE      Op0, Op1, Label

        iInstrIndex = AddInstrLookup( "JLE", INSTR_JLE, 3 );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_MEM_REF |
                                   OP_FLAG_TYPE_REG |
                                   OP_FLAG_TYPE_INT |
                                   OP_FLAG_TYPE_FLOAT |
                                   OP_FLAG_TYPE_STRING );
        SetOpType( iInstrIndex, 0, OP_FLAG_TYPE_LINE_LABEL );

⌨️ 快捷键说明

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