- 注册时间
- 2004-12-25
- 最后登录
- 1970-1-1
|
工程文件已经传上来,在下面下载。
截图:
目前编译器支持了float语法,当前的完成进度基本达到了我写这个编译器最初的目的.
当前版本为最新版本.
支持了new/delete,对结构增加成员函数,构造和析构函数,和成员函数重载.这些基本得用法同C++;
上次上传时忘了说明一下具体用法:
如果要使用new和delete运算符,必须包含malloc.h或virtualram.h!!
#include <Gvm1Def.h>
#include <malloc.h>
struct Base
{
Base()
{
printf("Base Structor\n");
getchar();
}
~Base()
{
printf("Base Destructor\n");
getchar();
}
};
struct Test : Base
{
void *member;
Test()
{
printf("Test Structor\n");
getchar();
}
Test(void *p)
{
member = p;
printf("Test Structor\n");
getchar();
}
~Test();
};
Test::~Test()
{
printf("Test Destructor\n");
getchar();
}
void fun()
{
Test t1;
Test t2();
Test t3(&t1);
Test *t4 = new Test;
Test *t5 = new Test();
Test *t6 = new Test(t4);
delete t4;
delete t5;
delete t6;
}
void main()
{
fun();
}
以下是编译器在编译方面的特性.
语法的支持
(1).typedef的使用
typedef struct Structure
{
long Member;
} STRUCTURE, *LPSTRUCTURE;
定义Structure结构的同时定义了两个类型:结构STRUCTURE和结构指针LPSTRUCTURE
之后声明结构或结构指针时就可以使用类型定义:
LPSTRUCTURE pStructure;
STRUCTURE Structure;
(2)指针的使用
1)指针可以使用下标运算符,使用下标的方式和数组相同:
long *pLong = (long *)malloc(100 * sizeof(long));
pLong[10] = *(&pLong[11] + 1);
2)特别注意指针的自增,自减和加减运算
按照C语言的定义,指针的自增和自减的增量和减量要看其指向的类型在内存中所占的大小.
所以当声明一个long型指针(long *)时,它在自增(++)运算之后,实际增加了sizeof(long).
同样,一个结构指针自增运算之后实际增加的值是这个结构的size.
在加减运算中也是一样,long型指针和一个整数a相加后,得出的值是
指针的值 + a * sizeof(long).
同样两个long型指针相减时(注意:要在同一个序列中),得出的值被除以了4.
这和 &pLong[11] - &pLong[10] 的道理是一样的.
*注意:对于指针的size(如 long *),或更高级指针的size(如 long **, long ***...),
在GVM1和GVM2里分别被定义为2和4.
(3)赋值
编译器已经实现了 +=,-=,*=,/=,%=,&=,|=,^=,<<=,>>= 扩展赋值运算符.
(4)初始化
目前已经完成了结构的初始化,和在函数内对结构和数组的初始化.
但是要注意,对结构的初始化必须有完整的大括号嵌套,而数组没有这个限制:
#include <Gvm1Def.h>
void main()
{
struct STRU1
{
long member1[2][10];
char member2;
}varstru1 = {
{{1,2,3,4}, 9,8,7,6,5},
'\13'
};
typedef struct STRU1 STRU1;
typedef struct STRU2
{
STRU1 member1;
long member2;
char member3[10];
}STRU2;
STRU2 varstru2 = {{{{1,2,3,4,5}, 6,7,8,9,0}, 97}, 0x12345, "member3"};
printf("%d,%c,%s", &varstru2.member1.member1[1][0],
varstru2.member1.member2, varstru2.member3);
}
对于函数内的初始化,需要占用一部分静态内存,
在GVmaker1里占用128字节,在GVmaker2里占用256字节,这部分内存正常程序无法使用,
但是可以作临时的储存区, 当出现函数内部的初始化时此区域被随机覆盖.
(5)对结构的赋值
void main()
{
struct STRU1
{
long member1[2][10];
char member2;
float member3;
}varstru1 = {
{{1,2,3,4}, {9,8,7,6,5}},
'\13', 1.25
};
struct STRU1 varstru2;
varstru2 = varstru1;
}
除了一般指针变量和char,int,long,float型变量,数组和结构的初始化都是常量型的,
在函数体内一般型的变量可以在声明时使用表达式赋值:
void main()
{
char a = 4, b = 5;
long c = a + b;
float f = 1 + 1.2;
}
(6)对浮点语法的支持
编译器的语法支持了float, 使用时和一般变量的使用方法完全相同,如果想在TC800以外的平台上使用模拟float,那么就在代码中包含<float.h>
(此文件引用自yan的float库,并作了一些修改),此文件对运算符的浮点指令进行了重载.
如果在使用float之前未包含<float.h>,那么对float变量的操作指令将编译成TC800默认的浮点指令.即可以直接支持TC800的所有语法.
编译器在编译数值的运算和传参时,会自动进行类型转换(float 到 char,int,long 或 char,int,long 到 float),不用手动转换.
如:
#include <gvm1def.h>
#include <float.h>
float fun(float a)
{
a += 10.25;
return a;
}
void main()
{
long b = fun(2);
printf("%d", b);
}
(7)几个头文件的说明
1) Gvm1def.h
此文件对Gvmaker1.0的系统函数作了定义,如果要编译GVmaker1.0的程序需要首先包含此文件.
2) Gvm2def.h
此文件对Gvmaker2.x的系统函数作了定义,如果要编译GVmaker2.x的程序需要首先包含此文件.
3) GvmExt.h
此文件只是针对个别系统函数进行了扩展,一般没什么用处.
4) malloc.h
此文件中定义了动态内存分配的函数malloc()和free().
5) Float.h
此文件重载了浮点运算符,使之实现模拟浮点语法.
6) VirtualRam.h
此文件为虚拟内存的实现文件,通过重载指针运算符实现,目前仅用于Gvm2的工程.
使用此文件时,可以不用再包含<malloc.h>.
分配和释放函数为void *_vmalloc(long __size), void _vfree(void *pmem).
当被分配的内存大于32K或物理内存分配失败时,将分配虚拟内存.虚拟内存的地址都从 0x10000开始.
由于重载了指针运算符,所以只要取得了虚拟内存的指针,直接使用指针操作即可.
目前此文件里只重写memcpy为vmemcpy,这个函数实现了任何内存(虚拟内存和物理内存)之间的数据复制,
如:
#include <gvm2def.h>
#include <virtualram.h>
#include <float.h>
void FloatOut(int x, int y, float fnum)
{
char str[20];
TextOut(x, y, ftoa(fnum,str));
}
void main()
{
float *pf = _vmalloc(0x10000);
if (pf == NULL)
{
return;
}
DigitOut(0,0,(long)pf);
pf[0x2000] = 0.125;
*(pf + 0x2001) = 0.521;
FloatOut(0,16, pf[0x2000] + pf[0x2001]);
}
7) TC800Def.h
此文件是专为TC800写的定义文件,使用时不需要包含Float.h文件,支持TC800的数学函数(但稍做了些修改,具体函数的定义请查看源文件).
就这么多了.具体内容看压缩包内的说明.
4.12更新:重新修改了代码的优化和部分浮点运算的编译, 增加函数指针的支持,函数指针的用法和C语言完全相同,示例如下:
#include <gvm1def.h>
#include <float.h>
float (*pfun)(char, long);
typedef float *(*T_fun)(void *);
typedef T_fun (*T_fun2)(void);
float func1(char p1, long p2)
{
printf("func1\n");
return 1.0;
}
float *func2(void *p)
{
printf("func2\n");
return NULL;
}
T_fun func3(void)//返回函数指针的函数
{
printf("func3\n");
return func2;
}
void main()
{
pfun = func1;
pfun(1,2);
T_fun pfun2 = func2;
pfun2(NULL);
T_fun2 pfun3 = func3;
pfun3();
}
K3->gameghost
文件大小:600k
文件类型:RAR
程序作者:gameghost
[ 本帖最后由 gameghost 于 2008-10-6 17:29 编辑 ] |
评分
-
查看全部评分
|