找回密码
 立即注册
查看: 175|回复: 10

【已更第二棒伪】【手搓编译器】齐天编译器 第一棒 梯云八纵(8颗流水灯)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:221
  • 最近打卡:2025-08-16 16:40:09

32

主题

727

回帖

2945

积分

荣誉版主

积分
2945
发表于 2025-8-12 17:17:09 | 显示全部楼层 |阅读模式
【已更第二棒(伪)】 详情请看9楼
【手搓编译器】齐天编译器 第一棒 梯云八纵(8颗流水灯)

https://www.bilibili.com/video/BV1jHtozkEFk



目测要写3~5篇文章来解释第一棒的代码
1. 词法分析
齐天编译器第一棒 原理&代码讲解之 词法分析:编译器的第一道关卡 - SDCC, IAR C++ for 51, GCC, VSCode,Linux, MacOS 国芯人工智能技术交流网站 - AI32位8051交流社区
2. 语法分析 齐天编译器第一棒 原理&代码讲解之 从乒乓球到语法分析 - SDCC, IAR C++ for 51, GCC, VSCode,Linux, MacOS 国芯人工智能技术交流网站 - AI32位8051交流社区
3.中间代码生成
4.机器码与hex生成




* 说明文档
* 项目名称:QITIAN_MCS251_Compiler_V1.0
* 作者:gentleman_齐天大圣
* 用途:兼容 MCS251 指令集的编译器
* 开源协议:GPLV3
* 测试环境:AI8051U 实验箱V1.2 跑马灯程序
* 简介:当前版本,
*       编译器执行文件位置:bin\Debug\net9.0\QITIAN_MCS251_Compiler.exe
*       会编译工程目录下 test\test.c
*       到build\test.hex 下
*      
*       首个版本,主要是为了跑通 整个工具链
*       实现 源码 - tonken - ast - ir - 机器码 - hex
*       所以仅支持5条c指令 (可用于点灯,闪灯,跑马灯等程序)
*      
*       支持的指令列表
*       C 语法                    IR 指令        8051/C251       机器码                        说明
*       sfr P1 = 0x90;            符号登记                (无机器码)                —        声明特殊功能寄存器
*       void main(void){}        仅生成入口标签                (无机器码)            —        主函数入口(后续扩展)
*       P1 = 0xFF;                MOV_DIR_IMM 0x90, 0xFF        75 90 FF                    立即数写端口
*       while(1);                SJMP_REL -2                    80 FE                        无限循环
*       delay(N);                3×DJNZ_DIR_REL                (三次嵌套DJNZ)        软件延时(特色语法糖
*      
*      
*
* 下版本预告:      
*       实现 串口通讯 相关源码的编译



2 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:221
  • 最近打卡:2025-08-16 16:40:09

32

主题

727

回帖

2945

积分

荣誉版主

积分
2945
发表于 2025-8-12 17:17:25 | 显示全部楼层
QiTian_MCS251_Compiler_V1.0.7z (171.01 KB, 下载次数: 13)

QiTian_MCS251_Compiler_V2.0 (伪).7z

211.5 KB, 下载次数: 3

没有添加任何编译器代码,只更新了test.c,就实现了串口发送,就算第二棒(伪)吧,以后再发一个第二棒(真 ...

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-08-22 12:00:26

9

主题

396

回帖

2865

积分

金牌会员

积分
2865
发表于 2025-8-12 17:34:04 | 显示全部楼层
搬板凳占个位.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:505
  • 最近打卡:2025-08-23 08:45:03

33

主题

2504

回帖

5379

积分

论坛元老

积分
5379
发表于 2025-8-12 17:35:46 | 显示全部楼层
哇,感觉大佬好久没上线了

点评

哈哈,在坛内不算大佬,坛友都很厉害的。  发表于 2025-8-13 06:33
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2982

回帖

6361

积分

荣誉版主

无情的代码机器

积分
6361
发表于 2025-8-12 18:11:15 | 显示全部楼层
前排蹲更新
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:535
  • 最近打卡:2025-08-23 00:00:26
已绑定手机

19

主题

3257

回帖

5695

积分

论坛元老

积分
5695
发表于 2025-8-12 22:02:28 | 显示全部楼层
C#开发的啊

点评

是的,.NET 有AOT技术, 感觉可以试试做编译器。 待项目完成度较高时,用AOT部署一下,目前还是传统的JIT。  详情 回复 发表于 2025-8-13 06:40
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:221
  • 最近打卡:2025-08-16 16:40:09

32

主题

727

回帖

2945

积分

荣誉版主

积分
2945
发表于 2025-8-13 06:40:08 | 显示全部楼层

是的,.NET 有AOT技术, 感觉可以试试做编译器。
待项目完成度较高时,用AOT部署一下,目前还是传统的JIT。



回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:615
  • 最近打卡:2025-08-23 08:47:11

21

主题

567

回帖

3164

积分

论坛元老

积分
3164
发表于 2025-8-13 11:32:50 | 显示全部楼层
看着很厉害的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:221
  • 最近打卡:2025-08-16 16:40:09

32

主题

727

回帖

2945

积分

荣誉版主

积分
2945
发表于 7 天前 | 显示全部楼层
2025/08/16:
第二棒来的有点快呀

截图202508161638156663.jpg

第一棒预告 第二棒是串口通讯。

突然想到,既然串口也是给 寄存器 SBUF 赋值


那么第一棒的编译器,似乎不需要添加任何代码

只需重写个串口test.c文件就好了。


就算 第二棒(伪)吧
以后再更新个 第二棒(真)

下面是串口发送的 test.c 替换掉 第一棒跑马灯的test.c。
等下二楼也会放一个重新打包的。

sfr WTST = 0xE9;
sfr EAXFR = 0xBA;
sfr CKCON = 0xEA;

sfr P0 = 0x80;
sfr P0M0 = 0x94;   
sfr P0M1 = 0x93;   

sfr P4 = 0xC0;
sfr P4M0 = 0xB3;
sfr P4M1 = 0xB4;

sfr SCON = 0x98;   
sfr SBUF = 0x99;
sfr AUXR = 0x8E;
sfr TMOD = 0x89;
sfr TCON = 0x88;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr T2L = 0xD4;   
sfr T2H = 0xD5;  
sfr T2CON = 0xC8;   
sfr P_SW1 = 0xA2;   
sfr IE = 0xA8;  
sfr P0 = 0x80;  


void main()
{
    WTST = 0;      
    EAXFR = 1;      
    CKCON = 0;

    P0M0 = 0xFF;   
    P0M1 = 0x00;

    P4M0 = 0x00;
    P4M1 = 0x00;

    P4 = 0x00;

    //115200bps@24.000MHz
    SCON = 0x50;                //8位数据,可变波特率
    AUXR = 0x40;                //定时器时钟1T模式
    //AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
    TMOD = 0x0F;                //设置定时器模式
    TL1 = 0xCC;                        //设置定时初始值
    TH1 = 0xFF;                        //设置定时初始值
    IE = 0;                            //禁止定时器中断
    //TR1 = 1;                        //定时器1开始计时
    TCON = 0x40;


    while(1)
    {
        SBUF = 0x51;   // 发送

        P0 = 0xFE;
        delay(15);

        P0 = 0xFD;
        delay(15);

        P0 = 0xFB;
        delay(15);

        P0 = 0xF7;
        delay(15);

        P0 = 0xEF;
        delay(15);

        P0 = 0xDF;
        delay(15);

        P0 = 0xBF;
        delay(15);

        P0 = 0x7F;
        delay(15);

    }
}




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-08-20 21:28:57

2

主题

61

回帖

602

积分

高级会员

积分
602
发表于 7 天前 | 显示全部楼层
这是真正的大佬,工程量肯定不小,希望能坚持下来。STC也应该给点支持,只要解决了编译器,stc新扩展的功能才能发挥出真正的功能。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-23 22:30 , Processed in 0.289611 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表