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

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

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

32

主题

727

回帖

2935

积分

荣誉版主

积分
2935
发表于 5 天前 | 显示全部楼层 |阅读模式
【已更第二棒(伪)】 详情请看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

回帖

2935

积分

荣誉版主

积分
2935
发表于 5 天前 | 显示全部楼层
QiTian_MCS251_Compiler_V1.0.7z (171.01 KB, 下载次数: 9)

QiTian_MCS251_Compiler_V2.0 (伪).7z

211.5 KB, 下载次数: 0

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-08-16 12:40:26

9

主题

396

回帖

2815

积分

金牌会员

积分
2815
发表于 5 天前 | 显示全部楼层
搬板凳占个位.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-08-16 14:04:02

33

主题

2495

回帖

5435

积分

论坛元老

积分
5435
发表于 5 天前 | 显示全部楼层
哇,感觉大佬好久没上线了

点评

哈哈,在坛内不算大佬,坛友都很厉害的。  发表于 4 天前
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:269
  • 最近打卡:2025-08-16 11:22:30
已绑定手机

79

主题

2919

回帖

6184

积分

荣誉版主

无情的代码机器

积分
6184
发表于 5 天前 | 显示全部楼层
前排蹲更新
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

19

主题

3255

回帖

5665

积分

论坛元老

积分
5665
发表于 5 天前 | 显示全部楼层
C#开发的啊

点评

是的,.NET 有AOT技术, 感觉可以试试做编译器。 待项目完成度较高时,用AOT部署一下,目前还是传统的JIT。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

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

32

主题

727

回帖

2935

积分

荣誉版主

积分
2935
发表于 4 天前 | 显示全部楼层

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



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:609
  • 最近打卡:2025-08-16 08:26:26

21

主题

567

回帖

3138

积分

论坛元老

积分
3138
发表于 4 天前 | 显示全部楼层
看着很厉害的样子
回复 支持 反对

使用道具 举报 送花

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

32

主题

727

回帖

2935

积分

荣誉版主

积分
2935
发表于 昨天 16:40 | 显示全部楼层
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
  • 打卡总天数:12
  • 最近打卡:2025-08-16 20:00:26

2

主题

60

回帖

588

积分

高级会员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-17 02:30 , Processed in 0.281182 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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