使用FreeBASIC设计8051单片机汇编编译器

news2025/2/24 17:19:18

        在STC论坛上看到有人用C++语言实现8051汇编编译器(源码),好奇下,试着用FB写了一下。

        基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格(数据来自网络,如果发现有误请联系QQ1493446087修正。)。

助记符说明字节周期机器码二进制机器码参数1参数2说明
NOP空操作11000000 0000//
ACALL addr 11绝对子程序调用22***0 0001a10a9a80 0001a7a6a5a4 a3a2a1a0/
LJMP addr 16长转移32020000 0010a15a14a13a12 a11a10a9a8a7a6a5a4 a3a2a1a0
RR AA右移一位11030000 0011//
INC AA加111040000 0100//
INC data直接字节加121050000 0101直接地址/
INC @Ri间接RAM加11106 - 070000 011i//i = 0,1
INC Rn寄存器加11108 - 0F0000 1rrr//r = 0 - 7
JBC bit,rel若直接位==1则转移且清除32100001 0000位地址相对地址 relrel = 标签地址 - 当前地址的下一个地址
AJMP addr 11绝对转移22***1 0001a10a9a81 0001a7a6a5a4 a3a2a1a0/
LCALL addr 16子程序调用32120001 0010a15a14a13a12 a11a10a9a8a7a6a5a4 a3a2a1a0
RRC AA带进位右移一位11130001 0011//
DEC AA减111140001 0100//
DEC data直接字节减121150001 0101直接地址/
DEC @Ri间接RAM减11116 - 170001 011i//i = 0,1
DEC Rn寄存器减11118 - 1F0001 1rrr//r = 0 - 7
JB bit,rel若直接位==1则转移32200010 0000位地址相对地址 rel
RET子程序调用返回12220010 0010//
RL AA循环左移一位11230010 0011//
ADD A,#data立即数加到A21240010 0100立即数/
ADD A,data直接字节加到A21250010 0101直接地址/
ADD A,@Ri间接RAM加到A1126 - 270010 011i//i = 0,1
ADD A,Rn寄存器加到A1128 - 2F0010 1rrr//r = 0 - 7
JNB bit,rel若直接位==0则转移32300011 0000位地址相对地址 rel
RETI中断程序调用返回12320011 0010//
RLC AA带进位左移一位11330011 0011//
ADDC A,#data立即数带进位加到A21340011 0100立即数/
ADDC A,data直接字节带进位加到A21350011 0101直接地址/
ADDC A,@Ri间接RAM带进位加到A1136 - 370011 011i//i = 0,1
ADDC A,Rn寄存器带进位加到A1138 - 3F0011 1rrr//r = 0 - 7
JC rel若C==1则转移22400100 0000相对地址 rel/
ORL data,AA或到直接字节21420100 0010直接地址
ORL data,#data立即数或到直接字节32430100 0011直接地址立即数
ORL A,#data立即数或到A21440100 0100立即数/
ORL A,data直接字节或到A21450100 0101直接地址/
ORL A,@Ri间接RAM或到A1146 - 470100 011i//i = 0,1
ORL A,Rn寄存器或到A1148 - 4F0100 1rrr//r = 0 - 7
JNC rel若C≠1则转移22500101 0000相对地址 rel/
ANL data,AA与到直接字节21520101 0010直接地址/
ANL data,#data立即数与到直接字节32530101 0011直接地址立即数
ANL A,#data立即数与到A21540101 0100立即数/
ANL A,data直接字节与到A21550101 0101直接地址/
ANL A,@Ri间接RAM与到A1156 - 570101 011i//i = 0,1
ANL A,Rn寄存器与到A1158 - 5F0101 1rrr//r = 0 - 7
JZ rel若A==0则转移22600110 0000相对地址 rel/
XRL data,AA异或到直接字节21620110 0010直接地址/
XRL data,#data立即数异或到直接字节32630110 0011直接地址立即数
XRL A,#data立即数异或到A21640110 0100立即数/
XRL A,data直接字节异或到A21650110 0101直接地址/
XRL A,@Ri间接RAM异或到A1166 - 670110 011i//i = 0,1
XRL A,Rn寄存器异或到A1168 - 6F0110 1rrr//r = 0 - 7
JNZ rel若A≠0则转移22700111 0000相对地址 rel/
ORL C,bit直接位或到进位位22720111 0010位地址/
JMP @A+DPTR相对于DPTR间接转移12730111 0011//
MOV A,#data立即数送A21740111 0100立即数/
MOV data,#data立即数送直接字节32750111 0101直接地址立即数
MOV @Ri,#data立即数送间接Rn2276 - 770111 011i立即数/i = 0,1
MOV Rn,#data立即数送寄存器2178 - 7F0111 1rrr立即数/r = 0 - 7
SJMP rel / JMP rel短转移22801000 0000相对地址 rel/
ANL C,bit直接位与到进位位22821000 0010位地址/
MOVC A,@A+PCA+PC寻址程序存贮字节送A12831000 0011//
DIV ABA除B14841000 0100//
MOV data,data直接字节送直接字节32851000 0101直接地址/
MOV data,@Ri间接Rn送直接字节2286 - 871000 011i直接地址/i = 0,1
MOV data,Rn寄存器送直接字节2188 - 8F1000 1rrr直接地址/r = 0 - 7
MOV DPTR,#data1616位常数送数据指针31901001 0000高立即数底立即数
MOV bit,C进位位送直接位22921001 0010位地址/
MOVC A,@A+DPTRA+DPTR寻址程序存贮字节送A12931001 0011//
SUBB A,#data从A中减去立即数和进位21941001 0100立即数/
SUBB A,data从A中减去直接字节和进位21951001 0101直接地址/
SUBB A,@Ri从A中减去间接RAM和进位1196 - 971001 011i//i = 0,1
SUBB A,Rn从A中减去寄存器和进位1198 - 9F1001 1rrr//r = 0 - 7
ORL C,/bit直接位的反码或到进位位22A01010 0000位地址/
MOV C,bit直接位送进位位21A21010 0010位地址/
INC DPTR数据指针加112A31010 0011//
MUL ABA乘B14A41010 0100//
MOV @Ri,data直接字节送间接Rn11A6 - A71010 011i//i = 0,1
MOV Rn,data直接数送寄存器22A8 - AF1010 1rrr直接地址/r = 0 - 7
ANL C,/bit直接位的反码与到进位位22B01011 0000位地址/
CPL bit直接位取反21B21011 0010位地址/
CPL C进位位取反11B31011 0011//
CJNE A,#data,rel立即数与A比较,不等转移32B41011 0100立即数相对地址 rel
CJNE A,data,rel直接数与A比较,不等转移32B51011 0101直接地址相对地址 rel
CJNE @Ri,#data,rel立即数与间接RAM比较,不等转移32B6 - B71011 011i立即数相对地址 reli = 0,1
CJNE Rn,#data,rel立即数与寄存器比较不等转移32B8 - BF1011 1rrr立即数相对地址 relr = 0 - 7
PUSH data直接字节入栈,SP加122C01100 0000直接地址/
CLR bit直接位清021C21100 0010位地址/
CLR C进位位清011C31100 0011//
SWAP AA半字节交换11C41100 0100//
XCH A,data直接字节与A交换21C51100 0101直接地址/
XCH A,@Ri间接Rn与A交换11C6 - C71100 011i//i = 0,1
XCH A,Rn寄存器与A交换11C8 - CF1100 1rrr//r = 0 - 7
POP data直接字节出栈,SP减122D01101 0000直接地址/
SETB bit直接位置位 121D21101 0010位地址/
SETB C进位位置位 111D31101 0011//
DA AA十进制调整11D41101 0100//
DJNE data,rel直接字节减1不为0转移32D51101 0101直接地址相对地址 rel
XCHD A,@Ri间接Rn与A低半字节交换11D6 - D71101 011i//i = 0,1
DJNE Rn,rel寄存器减1不为0转移22D8 - DF1101 1rrr相对地址 rel/r = 0 - 7
MOVX A,@DPTR外部数据送A(16位地址)12E01110 0000//
MOVX A,@Ri外部数据送A(8位地址)12E2 - E31110 0010//
CLR AA清011E41110 0011//
MOV A,data直接字节送A21E51110 0100直接地址/
MOV A,@Ri间接RAM送A11E6 - E71110 011i//i = 0,1
MOV A,Rn寄存器送A11E8 - EF1110 1rrr//r = 0 - 7
MOVX @DPTR,AA送外部数据(16位地址)12F01111 0000//
MOVX @Ri,AA送外部数据(8位地址)12F2 - F31111 001i//
CPL AA求反码11F41111 0100//
MOV data,AA送直接字节21F51111 0101直接地址/
MOV @Ri,AA送间接Rn12F6 - F71111 0101//i = 0,1
MOV Rn,AA送寄存器11F8 - FF1111 1rrr//r = 0 - 7

所以就可以开始分析汇编文件,然后根据以上表格转换对应的机器码。

1、使用main函数来接收控制台的命令参数

    FB里使用Main函数需要自己定义入口点,并使用__FB_ARGC__和__FB_ARGV__来获取参数。ParseAsmFile来解析ASM文件到机器码。CompileToHex将机器码转换为Hex文件。(具体实现看源码)

Private Function main(ByVal argc As Integer,ByVal argv As ZString Ptr Ptr) As Integer
    Print argc,*argv[1],*argv[2]
    'argc 是参数个数
    'argv 是命令行的参数指针
    '*argv[0] 表示第1个参数,是exe本身的名字
    '*argv[1] 表示第2个参数,这里固定为ASM文件名
    '*argv[2] 表示第3个参数,这里固定为Hex文件名
    If argc > 1 Then '有参数
        '1、解析命令(未完成)
        '根据命令添加8051默认寄存器
        '2、解析汇编文件
		ParseAsmFile(*argv[1])
        '3、输出Hex文件
		CompileToHex(*argv[2])
	End If
	Return 0
End Function

End main(__FB_ARGC__, __FB_ARGV__)

2、另外建立一个调用编译器的窗体工程

窗体如下:

测试打印信息:

源码工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云添加SSL证书

一、进入腾讯云SSL证书: ssl证书控制台地址 选择“我的证书”,点击"申请免费证书" 2、填写域名和邮箱,点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS:云解析DNS地址 进入我的解析-记录…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇: C#,入门教程(16)——可变数据类型(var)的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

【文末送书】语义解析:连接自然语言与机器智能的桥梁

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

R语言【paleobioDB】——pbdb_collections():通过参数选择,返回多个采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_collections (...) Arguments 参数【...…

2024趋势:ERP中数据分析的五大要点

2024 年,数据分析不仅仅是 ERP 实施中的一个额外功能;这就像第一步,将最终确定整个 ERP 实施项目的成功之路。忘记笨重的电子表格和无休止的报告——准备好驾驭这五种新兴趋势的浪潮: 一、人工智能和机器学习 (ML) 的兴起 人工智能驱动的数据…

PiflowX-DorisRead组件

DorisRead组件 组件说明 从Doris存储读取数据。 计算引擎 flink 有界性 目前Doris Source是有界流,不支持CDC方式读取。 组件分组 Doris 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述…

java使用itext7实现html转pdf全代码完整示例

之前项目有个需求,系统实现自己的打印功能,基本上都是前端找了个框架搞的,我呢,就是配合处理一些前端不好处理的部分,但是新一期的需求评审中,前端提出了,前端自己生成pdf在数据量大的时候会很慢…

前端基础知识整理汇总(上)

HTML页面的生命周期 HTML页面的生命周期有以下三个重要事件&#xff1a; DOMContentLoaded —— 浏览器已经完全加载了 HTML&#xff0c;DOM 树已经构建完毕&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 load —— 浏览器已经加载了所有的资源&…

C语言宏定义小技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒&#xff08;除闰年&#xff09;举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

商城小程序系统:数字化转型下的商机

近几年&#xff0c;电商行业不断发展&#xff0c;线上购物已经成为大众的重要选择。线上商超作为传统的商业购物模式&#xff0c;为带来更多的商机&#xff0c;也逐渐转向了线上电商模式&#xff0c;越来越多的商超企业开始搭建专属的商城小程序&#xff0c;为消费者提供方便快…

适用于动态 IT 环境的服务器流量监控软件

服务器在网络性能中起着至关重要的作用&#xff0c;这意味着保持其最佳容量至关重要。企业需要将 AI、ML 和云技术融入其 IT 中&#xff0c;从而提供充分的敏捷性、安全性和灵活性&#xff0c;在这方面&#xff0c;服务器流量监控已成为当务之急。通过定期监控通信、跟踪流量上…

《Linux C编程实战》笔记:线程同步

这一节主要是解决共享资源的处理。操作系统里也讲过互斥、锁之类的概念。 互斥锁 互斥锁通过锁机制来实现线程同步&#xff0c;同一时刻只允许一个线程执行一个关键部分的代码 一下是操作互斥锁的函数&#xff0c;均声明在pthread.h中。 pthread_mutex_init&#xff08;初始…

【2024济南生物发酵展同期会议】合成生物学背景下的发酵深层次技术论坛

2024合成生物学背景下的发酵深层次技术论坛 新技术、新资源、新机遇 反应设备.过滤分离.提取浓缩.干燥.流体机械.实验室设备.仪器仪表.废水废气 主办单位&#xff1a; 生物发酵展组委会 发酵人社区公众号 万物生物合成俱乐部 承办单位&#xff1a; 上海履济技术服务中心 …

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示 引言 在企业级应用或桌面程序中&#xff0c;经常需要从远程服务器获取数据&#xff0c;并在用户界面上展示这些数据。本文将通过一个实际案例&#xff0c;演示如何在 Windows Forms 应用程序中使用 FtpWebReques…

openWrt将插件安装到USB外接硬盘上

问题描述&#xff1a; 陆由器的闪存空间不够&#xff0c;而陆由器有一个usb接口&#xff0c;可以外接硬盘&#xff0c;可以将插件安装在外接硬盘上&#xff0c;就再也不用担心陆由器的空间不够了&#xff1b; 解决方案&#xff1a; 查看USB目录&#xff0c;为 mnt/sdb1 利用…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

kafka入门(六):日志分段(LogSegment)

日志分段&#xff08;LogSegment&#xff09; Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段&#xff08;LogSegment&#xff09;。 每个日志分段还可以细分为索引文件、日志存储…

MOOSE相关滤波跟踪算法(个人学习笔记)

MOOSE 论文标题 “Visual Object Tracking using Adaptive Correlation Filters” 原文地址 用滤波器对目标外观进行建模&#xff0c;并通过卷积操作来执行跟踪。 参考阅读&#xff1a; 目标跟踪经典算法——MOSSE&#xff08;Minimum Output Sum Square Error&#xff09…

Redis命令总结

1、启动Redis服务&#xff0c;登录Redis # 开启redis服务 redis-server redis配置文件路径例子&#xff1a; redis-server redis.windows.conf# 连接redis 【无密码】 redis-cli# 连接redis【有密码】 # 1 先连接再输入密码 redis-cli auth 密码 2、连接时输入 IP址、端口号、…

GC6153步进电机驱动芯片——低噪声、低振动,应用于摄像机,机器人等产品上

GC6153是双通道5V低压步进电机驱动器具有低噪声、低振动的特点&#xff0c;特别适用于相机的变焦和对焦系统&#xff0c;万向节&#xff0c;摇头机和其他精密&#xff0c;低噪声扫描隧道显微镜控制系统。该芯片为每个通道集成了256微步驱动器通过SPI和I2C接口&#xff0c;用户可…