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

        在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 IntegerPrint 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 IfReturn 0
End FunctionEnd main(__FB_ARGC__, __FB_ARGV__)

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

窗体如下:

测试打印信息:

源码工程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt6安装教程

由于QT在5.14版本后不再有离线安装版本,均需要通过在线安装 1.下载exe安装包 打开Open Source Development | Open Source License | Qt,往下拉,找到红框所示的按钮 点进去后点击Download即可 2 安装 下载完成后可得到qt-unified-windows…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

【抓包教程】BurpSuite联动雷电模拟器——安卓高版本抓包移动应用教程

前言 近期找到了最适合自己的高版本安卓版本移动应用抓HTTP协议数据包教程,解决了安卓低版本的问题,同时用最简单的办法抓到https的数据包,特此进行文字记录和视频记录。 前期准备 抓包工具:BurpSuite安卓模拟器:雷…

Docker之数据卷的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker之数据卷的使用》。🎯&#x…

SSM框架学习笔记04 | SpringMVC

文章目录 一、SpringMVC简介二、 请求与响应1. 请求映射路径2. get请求与post请求3. 响应 二、REST风格1.简介 三、 SSM整合四、拦截器1. 定义拦截器2.配置拦截器3.拦截器执行顺序4.拦截器参数5.多个连接器工作流程分析6.拦截器链的运行顺序 一、SpringMVC简介 SpringMVC技术与…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-1 CSS3过渡

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS3 过渡</title> <style> /*显示*/ .box {width: 100px;height: 100px;background-color: #eee;/*透明度*/opacity: 1;/*过渡*/transition: 3s; } /…

搭建 MyBatis 环境

目录 1.添加依赖 2.数据库连接配置 3.配置XML路径 4.下载插件MyBatisX 5.如何使用 6.示例 1.添加依赖 创建新项目时添加两个依赖: MyBatis Framewrok 和 MySQL Driver 。 如果是在已经创建好的项目中配置mybatis环境。需要先下载一个插件&#xff1a;EditStarters 。 然…

【AIGC】Controlnet:基于扩散模型的文生图的可控性

前言 controlnet可以让stable diffusion的生图变得可控。 文章连接&#xff1a;https://arxiv.org/pdf/2302.05543.pdf 摘要 冻结了stable diffusion的预训练模型并重用它的预训练编码层神经网络结构与零初始化卷积层连接&#xff0c;从零开始逐渐增加参数&#xff0c;并确…

DNS域名解析服务器

前言 一、域名 1、域名的概念和作用 2、域名与ip地址的关系 3、域名的构成 二、DNS服务器 1、DNS服务器的概念和作用 2、DNS服务器的优势 3、DNS服务器的类型 4、DNS服务器的查询方式 4.1 递归查询 4.2 迭代查询 5、DNS服务器查询原理过程 6、本地系统上的域名解析…

SQL-修改数据

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Vant2组件库van-list+Toast下拉加载滚动条回顶问题

目录 List 列表 Toast 轻提示 解决方案 1、不使用 Toast 的 加载提示 2、修改调整 pointer-event 属性值 3、判断是否为第一次加载再使用 背景 &#xff1a; 移动端项目 开发时&#xff0c;有数据长列表展示的场景需求&#xff0c;此时就用到了 Vant2 组件库里面的 <v…

JRebel热部署

热部署 什么热部署&#xff0c;简单来说我们正常的java项目需要编写java代码&#xff0c;但电脑执行的可不是java代码&#xff0c;而是转换后的class文件。这也意味着我们对程序进行微调&#xff0c;也要重新编译才能让程序展示我们需要的状态 而且不仅仅是我们手写的java文件…

7.11、Kali Linux中文版虚拟机安装运行教程

目录 一、资源下载准备工作 二、安装教程 三、kali linux换源 四、apt-get update 报错 一、资源下载准备工作 linux 中文版镜像历史版本下载:http://old.kali.org/kali-images/ 大家可以自行选择版本下载&#xff0c;本人下载的是2021版本 二、安装教程 打开vmvare wokst…

ZooKeeper 实战(二) 命令行操作篇

文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…

小学信息科技Python课程第2课:坐标与画笔

一、turtle画布与坐标系 在同一平面互相垂直且有公共原点的两条数轴构成平面直角坐标系。在坐标系中&#xff0c;水平方向的轴都称为x轴&#xff0c;垂直方向的轴都称为y轴 它们相交于O点&#xff0c;在这一个点里&#xff0c;x轴的值为0&#xff0c;y轴的值也为0&#xff0c;所…

c#图片作为鼠标光标

图片转换为鼠标光标代码如下&#xff1a; private void Form1_Load(object sender, EventArgs e) {//button1.Cursor System.Windows.Forms.Cursors.Hand;Bitmap bmp new Bitmap("780.jpg");Cursor cursor new Cursor(bmp.GetHicon());button1.Cursor cursor;} …

如何异地链接Pycharm服务器进行远程开发并实现与公司服务器资源同步

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

2024年美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

华为mux vlan+DHCP+单臂路由用法配置案例

最终效果&#xff1a; vlan 2模拟局域网服务器&#xff0c;手动配置地址&#xff0c;也能上公网 vlan 3、4用dhcp分配地址 vlan 4的用户之间不能互通&#xff0c;但可以和其它vlan通&#xff0c;也能上公网 vlan 3的用户不受任何限制可以和任何vlan通&#xff0c;也能上公网 交…

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.45 (目的&am…