gentleman 发表于 2025-8-12 17:17:09

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

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

https://www.bilibili.com/video/BV1jHtozkEFk
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)      软件延时(特色语法糖)
*      
*      
*
* 下版本预告:      
*       实现 串口通讯 相关源码的编译



gentleman 发表于 2025-8-12 17:17:25


网老四 发表于 2025-8-12 17:34:04

搬板凳占个位.

_奶咖君_ 发表于 2025-8-12 17:35:46

哇,感觉大佬好久没上线了{:xieyanxiao:}

ercircle 发表于 2025-8-12 18:11:15

{:4_174:}{:4_174:}{:4_174:}前排蹲更新

soma 发表于 2025-8-12 22:02:28

C#开发的啊

gentleman 发表于 2025-8-13 06:40:08

soma 发表于 2025-8-12 22:02
C#开发的啊

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



wangxiangtan 发表于 2025-8-13 11:32:50

看着很厉害的样子

gentleman 发表于 2025-8-16 16:40:09

2025/08/16:
第二棒来的有点快呀{:4_167:}


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

突然想到,既然串口也是给 寄存器 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);

    }
}




sdwys 发表于 2025-8-16 20:00:26

这是真正的大佬,工程量肯定不小,希望能坚持下来。STC也应该给点支持,只要解决了编译器,stc新扩展的功能才能发挥出真正的功能。
页: [1]
查看完整版本: 【已更第二棒伪】【手搓编译器】齐天编译器 第一棒 梯云八纵(8颗流水灯)