语法规范:

每行一条指令,不使用递归解析

每行可分为:功能,参数,内容这三个部分,用制表符隔开

可以在第三内容后面加制表和注释内容,小于三项不可以加注释

每行开头加上制表或者空格时,这一行就是注释

指令可以只有功能,或者功能和参数,或者三种都有

有三部分的汇编常规写法是功能 参数1 参数2,如: add al,100

为了更符合中文表达的习惯,把功能和参数对调,如: 低一 加 100

也就是中间是功能,左右两边都是参数,参数又分很多种情况

如寄存器低8位,通过第一个汉字"低"来识别

寄存器高8位,通过第一个汉字"高"来识别

寄存器低8加上高8的16位,通过第一个汉字"合"来识别

寄存器的32位,通过第一个汉字"存"来识别

寄存器的64位,通过第一个汉字"共"来识别

段选寄存器,通过第一个汉字"段"来识别

功能指令汉字都是在配置文件里可修改的

第一个字用来区分寄存器,尽量只改第二字

若一定要改第一个字,可以换成同声母的汉字

若同声母汉字还不能达到满意,那就要改源码了

第一个字是数字,或者负数的-号,即识别为数字

其它名称只要不是配置文件里定义过的,都视为变量

申请变量语法是 文本 名称 内容;整数 名字 30

变量名不能和配置文件里定义的名称相同

以上识别还远远不够,所以还需要加一些符号来区分

很多人反对中文编程就是因为要反复切换输入法

而中文标点实在太少,且很多输入法打不出来,不够规范

为了避免切换输入法,就只采用符号不用标点,中文状态打出来也一样的符号

开头加#符号,代表从后面寄存器组合的指针处,取1字节数据

开头加%符号,代表从后面寄存器组合的指针处,取2字节数据

开头加&符号,代表从后面寄存器组合的指针处,取4字节数据

寄存器组合有:1:8种寄存器任选一种。2:8种寄存任选一 + 7种寄存器任意选一

3:8种寄存器任选一 + 数字,数值可分为1字节数和4字节整数

4:8种寄存器任选一 + 7种寄存器任选一 1 或者2 或者4 或者8

5:8种寄存器任选一 + 8种寄存器任选一 * 1、2、4、8 + 操作数

%&+*-这几种用到的符号,都是中英文状态下输入结果都一样的

汇编指令实在是有点多,预计最多不超过42亿乘42亿条指令

高级语言只需要十几条指令,能处理变量就可以了

但是汇编就需要处理寄存器,IO端口,中断等各种硬件层

需要用到的指令就特别多,本编程的指令是可以在配置文件里任意指定的。

对不同的硬件换用不同的指令集,可以满足各种芯片的底层驱动和系统开发。

配置文件:

[型号]
8086=x86
8051=C51
STM32=ARM
STC32=宏晶2
GD32F=兆易
GD32V=兆易V
[8086]
存一=0;EAX累加器,保存运算结果和返回值
存二=1;ECX计数寄存器
存三=2:EDX数据寄存器
存四=3:EBX基址寄存器
存五=4:ESP堆栈指针寄存器
存六=5:EBP基址指针寄存器(用于局部变量)
存七=6:ESI源变址寄存器
存八=7:EDI目的变址寄存器
低一=0:累加器低八位AL
低二=1:计数器低八位CL
低三=2:数据寄存器低八位DL
低四=3:基址寄存器低八位BL
高一=4:累加器高八位AH
高二=5:计数器高八位CH
高三=6:数据寄存器高八位DH
高四=7:基址寄存器高八位BH
加=0:+加法运算add
或=8:|或运算or
进加=16:进位加法adc
借减=24:借位减法sbb
与=32:&与运算and
减=40:-减法运算sub
异或=48:^异或运算xor
比较=56:比较运算cmp
段一=0:附加段ES
段二=8:代码段CS
段三=16:堆栈段SS
段四=24:数据段DS
段五=32:FS无翻译
段六=40:GS无翻译
段七=48:seg?没名称
段八=56:seg?没名字
四七=0:[bx+si]短寻址,低16位寄存器4加7的组合
四八=1:[bx+di]短寻址,低16位寄存器4加8的组合
六七=2:[bp+si]短寻址,低16位寄存器6加7的组合
六八=3:[bp+di]短寻址,低16位寄存器6加8的组合
短七=4:[si]短寻址,低16位7号寄存器的指针地址
短八=5:[di]短寻址,低16位8号寄存器的指针地址
短六=6:[bp+n]短寻址,低16位6号寄存器+短数
短四=7:[bx]短寻址,低16位7号寄存器的指针地址
自加=64:对寄存器进行加1操作
自减=72:对寄存器进行减1操作
压入=80:Push把寄存器数据压入堆栈空间
取出=88:Pop从堆栈空间取出数据到寄存器
溢出=112:JO若溢出则转移到标记
不溢=113:JNO不溢出则转移到标记
低于=114:JB/JNAE/JC小于则转移(无符号)进位为1
高等=115:JAE/JNB/JNC大于或等于则转移(无符号)进位为0
相等=116:JE/JZ相等则转移到标记
不等=117:JNE/JNZ不等则转移到标记
不高=118:JBE/JNA小于或等于则转移(无符号)
高于=119:JA/JNBE大于则转移(无符号)
为负=120:JS结果为负则转移到标记
为正=121:JNS结果为正则转移到标记
偶数=122:JP/JPE奇偶位为偶则转移到标记
奇数=123:JNP/IPO奇偶位为奇则转移到标记
小于=124:JL/JNGE:小于则转移(带符号)
大等=125:JGE/JNL大于或等于则转移(带符号)
小等=126:JLE/JNG小于或等于(带符号)
大于=127:JG/JNLE大于则转移(带符号数)
等于=136:MOV赋值操作,把右边数据传送到左边
短址=138:Mov 低,@
选段=140:段选Mov 寄,段
段选=142:段选Mov 段,寄
短数=176:MOV al,10
传值=184:MOV把右边数值
寄存=192:寄存器运算标志位
回收=194:返回且回收压入堆栈的长度
返回=195:返回到调用处继续执行
异断=204:int3异常软中断
中断=205:int:指定中断号
为零=227:JCXZ/JECXZ到CX/ECX为零则转移
调用=232:call调用某程序段
跳到=235:JMP:直接跳转到标记处,短地址跳转
休止=244:HLT让CPU暂停的指令
[8051]
存一=B8
存二=B9
存三=BA
存四=BB
存五=BC
存六=BD
存七=BE
存八=BF
[c51]
89C51=1
89C52=1
C2052=1
[STC32]
段es,ax=C08E
段cs,cx=C88E
段ss,ax=D08E
段ds,ax=D88E
段fs,ax=E08E
段gs,ax=E88E
[宏晶2]
STC32G=4
STC8系列=1
STC15系列=1
STC12系列=1

极语言源码:

小程序 窗体消息(整数 窗口,整数 消息,整数 参数,整数 数据)
判断(消息)
为 窗口关闭{停止(0)}
为 单击左键{左键点击(参数)}
为 绘制静态{修改颜色(参数,$FF6600,0,$C0FFFF)}
为 绘制列表{修改颜色(参数,$3000FF,1,$C0FF30)}
为 绘制编辑{修改颜色(参数,$FF0066,2,$C0FFC0)}
为 窗口缩放{缩放窗口(数据)}
否则{处理窗口(窗口,消息,参数,数据)}
结束
小程序 修改颜色(整数 设备,整数 字色,整数 模式,整数 背景)
文本改色(设备,字色)
如果(模式=2)
改背景色(设备,背景)
否则{模式填充(设备,模式)
创建画刷(背景)}
结束
小程序 缩放窗口(整数 数据)
移动窗口(文档,60,20,数据 - 60 & $FFFF,数据>>16 -20,0)
移动窗口(列表,0,30,60,数据>>16 -30,0)
结束;
文本 缓冲[120],短句[8],路径[32];
文件框类 文件框(长度=76,路长=64);
数据表 修复{整数 分类,位置;文本 名字[16]}
整数 配置,型号,标记,指针,代码,位置,基址=$400000,位数=4;
小程序 窗体启动
重置 修复(100)
文件框.路径=路径;
文件框.分类 = "文本文档'\0'.c;.txt'\0'所有文件'\0'.'\0'";
配置=申请内存(5120)
型号=?+80标记=?+120代码=?+960
模块名称(0,配置,80)
配置(文字长度(配置)-3)&=$696E69
添加组合("型号",型号,0)
添加列表(型号,标记)读取消息
结束;
小程序 读设置(整数 段名,整数 键名,整数 内容)
读取文字(段名,键名,空,内容,960, 配置)
结束;
小程序 左键点击(整数 参数)
判断(参数)
为 1001新建文件
为 1002显示内容
为 1003保存内容
为 1004保存文件
为 1005编译程序
为 $10002提示文字
为 $10003选择型号
为 $20002插入文字
结束;
小程序 提示文字
整数 选项=发送消息(列表,列表选项,0,0)
发送消息(列表,列表读取,选项,短句)
读设置(型号,短句,缓冲)
改窗口字(信息,缓冲)
结束;
小程序 插入文字
发送消息(文档,编辑替换,0,短句)
结束;
小程序 新建文件
改窗口字(文档,0)路径=0
改窗口字(窗体,"极简编程")
结束;
小程序 显示内容
整数 文件,内容,长度;路径=0;
如果(文件选框(文件框))
{文件=开文件(路径,0);
长度=文件大小(文件,0)
内容=申请内存(长度+1)
读文件(文件,内容,长度)
内容(长度)=0
改窗口字(文档,内容)
改窗口字(窗体,路径)
关文件(文件)}
结束;
小程序 保存文件
路径=0保存内容
结束;
小程序 保存内容
整数 文件,内容,长度;
如果(文字长度(路径)=0)保存选框(文件框)
文件=建文件(路径,0)
长度=窗口字长(文档)+1
内容=申请内存(长度)
长度=取窗口字(文档,内容,长度)
写文件(文件,内容,长度)
改窗口字(窗体,路径)
关文件(文件)结束;
小程序 选择型号
型号=发送消息(组合,取组合项,0,0)
型号=发送消息(组合,组合数据,型号,0)
添加列表(型号,标记)结束;
小程序 添加组合(整数 段名,整数 内容,整数 编号)
读设置(段名,空,内容)
循环在(内容(0)){
读设置(段名,内容,缓冲);
发送消息(组合,组合添加,0,缓冲)
发送消息(组合,组合附加,编号,内容)
编号++;内容+文字长度(内容)+1}
如果(编号)发送消息(组合,选组合项,0,0)
结束;
小程序 添加列表(整数 段名,整数 内容)
读设置(段名,空,内容)
发送消息(列表,列表清除,0,0)
循环在(内容(0)){
发送消息(列表,列表添加,0,内容)
内容+文字长度(内容)+1}
结束;
小程序 替换文本(整数 内容)
整数 长度=文字长度(内容)+1
重查@
内容=查找文字(内容,"``")
如果(内容){内容%=$A0D;内容+2;跳到 重查}
返回(长度)结束
小程序 取数(整数 内容)
转数值(内容,0,0)结束
小程序 取值(整数 内容)
读取整数(型号,内容,0,配置)
结束
小程序 编译程序
整数 文件,长度,行=0,数=发送消息(文档,编辑行数,0,0)
指针=标记;位置=0;修复.行数=0;标记(0)&=32
循环(行<数){缓冲=120
长度=发送消息(文档,编辑取行,行,缓冲)
缓冲(长度)&=0
如果(缓冲(0)>32)解析代码
行++}开始修复
文件=建文件("tmp.bin",0)
写文件(文件,代码,位置)
关文件(文件)
运行("qemu.exe -L . -hda tmp.bin -std-vga",0)
结束;
小程序 解析代码
整数 功能,参数,内容
功能=分割文本(缓冲," ")
参数=分割文本(0," ")
内容=分割文本(0," ")
判断(~功能)
为 0#基址{基址=取数(参数)}
为 0#位数{位数=取数(参数)>>3}
为 0#标记{申请变量(参数,7,内容)}
为 0#程序{申请变量(参数,6,内容)}
为 0#文本{申请变量(参数,5,内容)}
为 0#整数{申请变量(参数,4,内容)}
为 0#小数{申请变量(参数,3,内容)}
为 0#整形{申请变量(参数,2,内容)}
为 0#字节{申请变量(参数,1,内容)}
为 0#跳转{增加修复(参数,0,内容)}
为 0#调用{增加修复(功能,1,参数)}
为 0#填充{填充数据(参数,内容)}
为 0#写入{写入内容(参数,内容)}
否则{如果(内容)传送运算(功能,参数,内容)
否则{如果(参数)写入编码(功能,参数)
否则{写入短码(功能)}结束;
小程序 填充数据(整数 长度,整数 数值)
长度=取数(长度)
如果(长度<0)长度=绝对值(长度)-位置
如果(数值)数值=取数(数值)
清零(代码(位置),长度,数值)位置+长度
结束;
小程序 传送运算(整数 功能,整数 参数, 整数 内容)
整数 数=2,左=功能类型(功能),中=取值(参数),右=功能类型(内容)
整数 左数=取值(功能),左长=取长度(左),右长=取长度(右)
如果(右=5 || 右=2){中+如果是(中>63)40,4如果(中>63)左长*8;
中+取数(内容)<<8+左长+左数;如果(左长)数++如果(右=2)数=1}
否则{如果(右<5){左长+2左数*8+取值(内容)}
否则{左数+取值(内容)*8如果(左>5)左数+192}
中+左数<<8+左长}中>代码+位置;位置+数
如果(右=2)增加修复(型号,2,内容)
结束;
小程序 取大小(整数 值)
判断(值)为 -128~127返回(0)
返回(1)结束
小程序 取长度(整数 值)
判断(值)为 1,11,14返回(0)
返回(1)结束
小程序 写入编码(整数 功能,整数 参数)
整数 类=功能类型(参数)
功能=取值(功能)
判断(类)为 2功能+5
为 5功能+取数(参数)<<8
否则 功能+取值(参数)
功能>代码+位置;位置++
如果(类<7)位置++
如果(类=2)增加修复(型号,2,参数)
结束;
小程序 写入短码(整数 功能)
代码(位置)=取值(功能)
位置++结束;
小程序 功能类型(整数 内容)
整数 分类=内容(0)
判断(分类)
为 35~38{分类-34文字复制(内容,内容+1)}
为 45,48~57分类=5
否则{分类=如果是(读取整数(型号,内容,-1,配置)<0)2,分类-170}
返回(分类)结束
小程序 变量类型(整数 内容,整数 类别)
整数 位置,分类=-1;文本 变量[16]
格式化(变量," %s ",内容)
位置=查找文字(标记,变量)
如果(位置)
拆分式(位置," %s %d %d",变量,@位置,@分类)
否则 位置=-1
如果(类别=1)位置=分类
如果(类别=2)位置+分类<<16
返回(位置)结束
小程序 申请变量(整数 参数,整数 分类, 整数 内容)
整数 数值,长度;小数 小值;
判断(分类)为 >5长度=0
为 5{长度=替换文本(内容)文字复制(代码+位置,内容)}
为 3{小值=转小数(内容)小值>代码+位置;长度=4}
否则{数值=取数(内容)数值>代码+位置;长度=分类}
插入标记(参数,分类)位置+长度
结束
小程序 插入标记(整数 参数,整数 分类)
指针+格式化(指针," %s %d %d",参数,位置,分类)
结束
小程序 写入内容(整数 参数,整数 内容)
参数=取数(参数)内容=取数(内容)
修复标记(位置,内容,参数)位置+参数
结束;
小程序 开始修复
整数 数=0,位
循环(数<修复.行数){
列举 修复(数){
位=变量类型(.名字,0)
如果(.分类=2)修复标记(.位置-2,基址+位,2)
否则 修复标记(.位置-1,位 -.位置,1)}数++}
结束
小程序 修复标记(整数 偏移,整数 参数,整数 长度)
判断(长度)为 1代码(偏移)=参数
为 2代码(偏移)%=参数
为 4代码(偏移)&=参数
结束
小程序 增加修复(整数 参数,整数 分类,整数 内容)
整数 写=代码+位置,位=变量类型(内容,0)
参数=取值(参数)位置+2如果(分类=1)位置++
如果(位<0){列举 修复(修复.行数){.分类=分类
.位置=位置;文字复制(.名字,内容)}修复.行数++}
否则{如果(分类=2)参数=基址+位
否则 参数+(位-位置)<<8}参数>写
结束;


费先生
1 声望0 粉丝