正在写一个类似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测试一下
请知道的帮帮忙,谢谢了!
[课程]Linux pwn 探索篇!