📄 zasm.cpp
字号:
// 返回符号大小
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 + -