首页
社区
课程
招聘
[原创]新版虫虫汇编器
发表于: 2007-12-31 15:50 7917

[原创]新版虫虫汇编器

2007-12-31 15:50
7917
新版的虫虫汇编器已经和原来的版本完全不同,想看的快下啊

当前的.cco文件格式:
#define PointerAdd(pData,x) (*(DWORD*)&pData) += x

#pragma pack(push)
#pragma pack(1)//字节对齐方式设为1

struct CCUFileHeader
{
        DWORD m_ccuFlag;//'ccu'
        DWORD m_nLib;//需要引用到的链接库的数量
        DWORD m_nSymbolItem;//SymbolTableItem的数目
        DWORD m_nSection;       
};

class CCULib;
typedef CCULib* P_CCULib;
class CCULib
{
public:
        WORD m_nameLen;//包括结束符
        char m_name[];
public:
        static P_CCULib Create(const char *name)
        {
                int nameLen = ::strlen(name)+1;
                int size = sizeof(CCULib) + nameLen;
                P_CCULib p = (P_CCULib)::malloc(size);
                p->m_nameLen = nameLen;
                ::strcpy(p->m_name,name);
                return p;
        }
        inline int GetItemSize()const{return sizeof(CCULib) + m_nameLen;}
        inline static void IncPointer(P_CCULib &p)
        {
                PointerAdd(p,p->GetItemSize());
        }
};

class SymbolTableItem;
typedef SymbolTableItem* P_SymbolTableItem;
class SymbolTableItem
{
public:
        union Flag
        {
                struct
                {
                        unsigned char StaticOrExtern:1;//局部标号(0)还是全局标号(1)
                        unsigned char IsDllApi:1;
                        unsigned char BelongToThis:1;//该标号定义在本ccu文件中
                };
        };
        Flag m_flag;
        //--IsDllApi为真时,或者BelongToThis为假时,此部分无用
        WORD m_secIndex;//在哪个section中
        DWORD m_ofs;//在所在节中的偏移
        //--
        BYTE m_nameLen;//包括结束符
        char m_name[];
public:
        static P_SymbolTableItem Create(const char *name)
        {
                int nameLen = ::strlen(name)+1;
                int size = sizeof(SymbolTableItem) + nameLen;
                P_SymbolTableItem p = (P_SymbolTableItem)::malloc(size);
                memreset(p->m_flag);
                p->m_secIndex = -1;
                p->m_ofs = -1;
                p->m_nameLen = nameLen;
                ::strcpy(p->m_name,name);
                return p;
        }
        inline int GetItemSize()const{return sizeof(SymbolTableItem) + m_nameLen;}
public:
        inline static void IncPointer(P_SymbolTableItem &p)
        {
                PointerAdd(p,p->GetItemSize());
        }
};

class RelTable;
typedef RelTable* P_RelTable;

class CCUSection;
typedef CCUSection* P_ObjSection;
class CCUSection
{
public:
        union Characteristic//特征值
        {
                DWORD dd;
                struct
                {
                        unsigned char CanRun:1;
                        unsigned char CanRead:1;
                        unsigned char CanWrite:1;
                };
        };
        Characteristic m_char;
        struct Flag
        {
                unsigned char HasRelTable:1;//有重定位表。如果为真,则在raw data之后会跟一个RelTable
        };
        Flag m_flag;
        DWORD m_sizeOfRawData;//raw data跟在m_name的后面
        BYTE m_nameLen;//包括结束符
        char m_name[];
        //--
public:
        static P_ObjSection Create(const char *name)
        {
                int nameLen = ::strlen(name)+1;
                int size = sizeof(CCUSection) + nameLen;
                P_ObjSection p = (P_ObjSection)::malloc(size);
                memreset(p->m_char);
                memreset(p->m_flag);
                p->m_sizeOfRawData = 0;
                //---节名
                p->m_nameLen = nameLen;
                ::strcpy(p->m_name,name);
                //---
                return p;
        }
        inline int GetSecHeadSize()const{return sizeof(CCUSection) + m_nameLen;}
        inline BYTE* GetRawData(){return (BYTE*)(&m_name[0] + m_nameLen);}
        P_RelTable GetRelTable()
        {
                if(m_flag.HasRelTable)
                        return (P_RelTable)(GetRawData()+m_sizeOfRawData);
                return NULL;
        }
        int GetItemSize();       
public:
        inline static void IncPointer(P_ObjSection &p)
        {
                PointerAdd(p,p->GetItemSize());
        }
};

class RelTable
{
public:       
        struct Item
        {
                int m_ofs;//在节中的偏移               
                int m_iSymTable;//在符号表中的索引
                struct Flag
                {
                        unsigned char IsRelative:1;
                };
                Flag m_flag;
        };
        int m_itemCount;
        Item m_item[];
public:
        static P_RelTable Create(int itemCount)
        {
                int size = sizeof(RelTable) + itemCount*sizeof(Item);
                P_RelTable p = (P_RelTable)::malloc(size);
                //--
                p->m_itemCount = itemCount;
                ::memset(p->m_item,0,p->m_itemCount*sizeof(Item));
                //--
                return p;
        }
        inline Item& operator[](int i)
        {
                assert(i>=0 && i<m_itemCount);
                return m_item[i];
        }
        inline int GetTableSize()const{return sizeof(RelTable) + m_itemCount*sizeof(Item);}
};

inline int CCUSection::GetItemSize()
{
        int size = GetSecHeadSize() + m_sizeOfRawData;
        if(m_flag.HasRelTable)
        {
                P_RelTable pRT = GetRelTable();
                size += pRT->GetTableSize();
        }
        return size;
}

#pragma pack(pop)

这只是目前.cco文件的格式,上面的代码是其中要用到的数据结构,使用的是可变长的数据结构。
上面的代码我现在不想多解释,以后有时间我会再解释。

v0.3添加了对常量字符串自动定义的功能,即对于指令中出现的双引号字符串,编译器将自动在
.const段中添加其定义,免去了用户定义常量字符串的麻烦。

v0.4实现了invoke宏

v0.5
对上一版本做了较大的修改,修改的内容包括:
1)        取消了.cco文件,而用.ccu文件取代。.ccu即虫虫格式的单元文件。
2)        取消了原来直接用指令调用API的功能(如:
call dword ptr ['user32.dll'.'MessageBoxA']),而改成用更标准的方法来调用API。即函数原型声明 + includelib。includelib指令后跟的库文件可以用Inc2CCU.exe生成。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
下一个看看```然后去吃饭```

==============================
刚才下好了看了下,运行需要MSVCP71.dll

另外想说的一句话是,你太牛了!本来还以为是个IDE,没想到是个编译器``` 呵呵!
2007-12-31 16:57
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
牛人要支持~~~
2007-12-31 17:15
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我已把需要的另外两个dll上传上去了
2007-12-31 17:33
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
换了个网速快的地方,总算传上去了
2007-12-31 19:50
0
雪    币: 271
活跃值: (18)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
6
虫虫...嘿嘿..叫起来好暧昧....
2007-12-31 20:29
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
怎么随便给自己起个名字都“暧昧”
2007-12-31 21:13
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我也86的....不禁感叹,人和人之间的差距咋就这么大呢.....
祝楼主早日找到好工作了
2008-1-1 00:32
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
9
楼主太牛B了,祝新年快乐
2008-1-1 11:08
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
谢谢你的祝福!
我成功的关键在于我定义的那些强大的数据结构
2008-1-1 12:02
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
11
收藏一个学习,不错
2008-1-1 13:20
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
v0.2已放出
2008-1-2 09:23
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
v0.3已放出
2008-1-2 18:30
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
v0.4已放出
2008-1-3 21:33
0
雪    币: 9793
活跃值: (2186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
虫虫大牛,你的示例程序怎么都带一个控制台窗口啊? 可以在源程序中添加代码除去么?
2008-1-5 15:59
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
那是链接器把程序链接成控制台程序,需要修改链接器。不过我这只是验证版本,没有提供修改参数。
2008-1-7 11:42
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
v0.5已放出
2008-1-7 11:50
0
雪    币: 9793
活跃值: (2186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
技术更新,希望越来越强大。成为超越masm和tasm的经典之作。
2008-1-10 08:59
0
雪    币: 9793
活跃值: (2186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
没有更新了么?还有很多功能没加呢?
2008-1-25 22:55
0
游客
登录 | 注册 方可回帖
返回
//