【已更第二棒伪】【手搓编译器】齐天编译器 第一棒 梯云八纵(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) 软件延时(特色语法糖)
*
*
*
* 下版本预告:
* 实现 串口通讯 相关源码的编译
搬板凳占个位. 哇,感觉大佬好久没上线了{:xieyanxiao:} {:4_174:}{:4_174:}{:4_174:}前排蹲更新 C#开发的啊 soma 发表于 2025-8-12 22:02
C#开发的啊
是的,.NET 有AOT技术, 感觉可以试试做编译器。
待项目完成度较高时,用AOT部署一下,目前还是传统的JIT。
看着很厉害的样子 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);
}
}
这是真正的大佬,工程量肯定不小,希望能坚持下来。STC也应该给点支持,只要解决了编译器,stc新扩展的功能才能发挥出真正的功能。
页:
[1]