首页
社区
课程
招聘
[讨论]C语言语法手册
发表于: 2012-1-10 11:00 6126

[讨论]C语言语法手册

2012-1-10 11:00
6126
正在写一个类似C语言的编译器,能够将正确的C代码翻译成汇编代码了。

源码如下(摘自加密解密第二版):
unsigned int g_dwCRC32Table[256];

int crc32_MakeTable()
{
        int crc; int i; int j;
        for(i=0;i<256;i++)
        {
                crc=i;
                for(j=0;j<8;j++)
                {
                            if(crc&1) crc=(crc>>1)^0xEDB88320;
                            else crc=crc>>1;
                }
                g_dwCRC32Table[i]=crc;
        }
return 0;
}

int _stdcall crc32_Get(char *pDat,int iSize)
{
        unsigned int crc; crc=0xffffffff;
        unsigned char* buffer;
        int len; len=iSize;
        buffer=(unsigned char*)pDat;
        crc32_MakeTable();
        while(len--)
        {
                crc=(crc>>8)^g_dwCRC32Table[(crc&0xFF)^*buffer++];
        }
return crc^0xffffffff;
}

可以编译成这样:
_crc32_MakeTable:
push    ebp
mov     ebp,esp
sub     esp,???
mov     dword ptr [ebp-8],0
jmp     L4
L1:
mov     ebx,dword ptr [ebp-8]
mov     dword ptr [ebp-4],ebx
mov     dword ptr [ebp-C],0
jmp     L8
L5:
mov     ebx,dword ptr [ebp-4]
and     ebx,1
cmp     ebx,0
jz      L9
mov     esi,dword ptr [ebp-4]
mov     ecx,1
sar     esi,cl
mov     ecx,esi
xor     ecx,EDB88320
mov     dword ptr [ebp-4],ecx
jmp     L10
L9:
mov     esi,dword ptr [ebp-4]
mov     ecx,1
sar     esi,cl
mov     ecx,esi
mov     dword ptr [ebp-4],ecx
L10:
L6:
add     dword ptr [ebp-C],1
L8:
mov     ebx,dword ptr [ebp-C]
cmp     ebx,8
setl    bl
cmp     bl,0
jnz     L5
L7:
mov     ebx,dword ptr [ebp-C]
mov     ecx,dword ptr [ebp-8]
add     ebx,ecx
mov     ecx,dword ptr [ebp-4]
mov     dword ptr [ebx],ecx
L2:
add     dword ptr [ebp-8],1
L4:
mov     ebx,dword ptr [ebp-8]
cmp     ebx,100
setl    bl
cmp     bl,0
jnz     L1
L3:
mov     eax,0
mov     esp,ebp
pop     ebp
retn
_crc32_Get:
push    ebp
mov     ebp,esp
sub     esp,???
mov     dword ptr [ebp-4],FFFFFFFF
mov     ebx,dword ptr [ebp+C]
mov     dword ptr [ebp-C],ebx
mov     ebx,dword ptr [ebp+8]
mov     dword ptr [ebp-8],ebx
call    _crc32_MakeTable
jmp     L12
L11:
L11:
mov     esi,dword ptr [ebp-4]
mov     ecx,8
shr     esi,cl
mov     ecx,esi
mov     ebx,dword ptr [ebp-4]
and     ebx,FF
mov     edx,dword ptr [ebp-8]
add     byte ptr [edx],1
movsx   eax,byte ptr [edx]
xor     ebx,eax
mov     edx,_g_dwCRC32Table
imul    ebx,4
add     edx,ebx
mov     ebx,dword ptr [edx]
xor     ecx,ebx
mov     dword ptr [ebp-4],ecx
L12:
sub     dword ptr [ebp-C],1
cmp     len,0
jnz     L11
L13:
mov     ebx,dword ptr [ebp-4]
xor     ebx,FFFFFFFF
mov     eax,ebx
mov     esp,ebp
pop     ebp
retn    8

编译了不少源码,基本能行了。现在就是错误提示不给力。比如两个非指针的结构体变量相加肯定是错误的,这个会给出错误提示,其他情况呢?我需要一个全一点的语法手册,我好照着手册完成类型检查,以避免下面这种情况的发生:

源码:
int Test_Func()
{
        double fTest1; double fTest2; int iTest1;

        return iTest1=(fTest1*(int)fTest2);
}

编译成的asm:
_Test_Func:
push    ebp
mov     ebp,esp
sub     esp,???
mov     ebx,qword ptr [ebp-10]//这里编译出问题了
mov     dword ptr [ebp-18],ebx
fld     qword ptr [ebp-8]
fild    dword ptr [ebp-18]
fmulp   st(1),st
[5] warning1003: 赋值运算可能丢失数据
fistp   dword ptr [ebp-14]
mov     eax,dword ptr [ebp-14]
mov     esp,ebp
pop     ebp
retn

所以,需要一个全面一点的语法手册,或者说是错误大全之类的。不想做发现-修复-发现-修复这样的无限循环。自己写程序的时候,检查语法错误的工作都交给编译器了,对各种错误不是非常熟悉。比如:两个指针能否相加我都要拿VC测试一下

请知道的帮帮忙,谢谢了!

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 14
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
怎么没人回复啊,想起来一点算一点,真的很急啊。如果你想起来,可以这样写:
1.指针与整数相加要考虑 指针+整数*偏移量
2.非指针的结构体和联合体变量不能直接参加算数和逻辑运算
...

拜托了
2012-1-10 11:13
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
Compiler.Design.In.C
2012-1-10 13:41
0
雪    币: 14
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我认真的搜索了 Compiler.Design.In.C
结果发现没有中文版的,楼上的大牛,既然你推荐这本书给我,那么想必你已经深刻理解了。不然你不会随便推荐一本自己没读过的书给我的。

所以,能告诉我在Compiler.Design.In.C 这本书中,我的问题一般在第几章能找到答案吗? 谢谢了!
2012-1-10 17:16
0
雪    币: 442
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
C语言语法的BNF描述
http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf
2012-2-9 19:35
0
游客
登录 | 注册 方可回帖
返回
//