使用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.mzph.cn/news/618887.shtml

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

相关文章

【InternLM 大模型实战】第四课

XTuner 大模型单卡低成本微调实战 FINETUNE简介指令跟随微调增量预训练微调LoRA & QLoRA XTuner简介功能亮点适配多种生态适配多种硬件 8GB 显卡玩转LLMFlash AttentionDeepSpeed ZeRO 动手实战环节环境配置微调准备配置文件模型下载数据集下载修改配置文件开始微调将得到的…

HTML标签(一)

目录 HTML语法规范 基本语法概述 标签关系 HTML基本结构标签 第一个HTML网页 开发工具 VSCode的使用: VScode工具生成骨架标签新增代码 文档类型声明标签 lang语言种类 字符集 总结 HTML常用标签 标签语义 标题标签 段落标签 换行标签 文本格式化…

unity urp 视差卡牌

总体效果大概四层,从后往前排序为:卡背、背景、画像、边框 首先卡背比较简单,只要判断如果网格的背面就直接采样卡背图片展示即可 资源准备: 然后是背景,网上找到一张这样的图。 但他还不符合要求,我们的…

Tomcat源码解析(一): Tomcat整体架构

Tomcat源码系列文章 Tomcat源码解析(一): Tomcat整体架构 目录 一、Tomcat整体架构1、Tomcat两个核心组件功能2、Tomcat支持的多种I/O模型和应用层协议 二、Connector连接器1、连接器功能汇总2、ProtocolHandler组件2.1、Endpoint2.2、Processor 3、Adapter组件 三…

好大夫问诊数据爬虫记录

好大夫问诊数据爬虫入库字段记录 获取医生的病程列表 uid Column(Integer, primary_keyTrue, autoincrementTrue) gender Column(String(10)) # 性别 age Column(Integer) # 年龄 # 总交流次数 total_communication_times Column(Integer) # 医生回复次数 doctor_reply_t…

uniapp 编译后文字乱码的解决方案

问题: 新建的页面中编写代码,其中数字和图片都可以正常显示,只有中文编译后展示乱码 页面展示也是乱码 解决方案: 打开HuilderX编辑器的【文件】- 【以指定编码重新打开】- 【选择UTF-8】 然后重新编译就可以啦~ 希望可以帮到你啊~

2023极客大挑战web小记

拿到题目提示post传参还以为是道签到题 刚开始直接把自己极客大挑战的username以及password怼上去,但是不对。看看F12,有提示。 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在&#xff0c…

部署Tomcat及其负载均衡

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样&#xf…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

linux GDB and GDB Sever

概念&#xff1a; GDB&#xff08;GNU Debugger&#xff09;是一个用于调试程序的强大工具。它是GNU项目的一部分&#xff0c;支持多种编程语言&#xff0c;包括C、C等。GDB 提供了一组命令和功能&#xff0c;允许跟踪检查程序的内部状态&#xff0c;跟踪代码的执行过程&#…

MySQL题目示例

文章目录 1.题目示例 1.题目示例 09&#xff09;查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid …

一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读

论文题目&#xff1a;A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化&#xff0c;然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…

TF-IDF(Term Frequency-Inverse Document Frequency)算法详解

目录 概述 术语解释 词频&#xff08;Term Frequency&#xff09; 文档频率&#xff08;Document Frequency&#xff09; 倒排文档频率&#xff08;Inverse Document Frequency&#xff09; 计算&#xff08;Computation&#xff09; 代码语法 代码展示 安装相关包 测…

邮件开发客户:从吸引潜在客户到提高转化率的实用指南

做外贸的很多企业都习惯使用邮件作为沟通工具&#xff0c;所以我们也可以利用邮件发送开发信来进行客户开发。 为什么外贸企业喜欢使用邮件呢&#xff1f; 1、使用习惯 不同于我们国家习惯使用微信沟通&#xff0c;邮件始终是外国人在进行商务、营销、日常沟通等场合下常用且重…

基于OCR的包装产品生产日期识别系统

基于OCR的包装产品生产日期识别系统 背景技术方案PaddleOCR模型应用数据挑战与解决方案优化策略 项目实施步骤结果与展望 背景 在工业生产中&#xff0c;产品包装上的生产日期信息是至关重要的&#xff0c;它关系到物资的时效性和质量。为了更快、更准确地提取这些信息&#x…

Redis中的Java客户端

一、Jedis Jedis是一个Java实现的Redis客户端连接工具。 Jedis使用非常简单&#xff0c;直接引入依赖。基于默认参数的Jedis连接池&#xff0c;初始化连接池类&#xff08;使用默认连接池参数&#xff09;JedisPool&#xff0c;获取一个Jedis连接Jedis jedisjp.getResource()…

.NET core 中的Kestrel 服务器

什么是Kestrel&#xff1f; Kestrel 是一个跨平台的Web服务器&#xff0c;会默认在ASP.NET Core 项目模板中对其进行配置。未使用 IIS 托管时&#xff0c;ASP.NET Core 项目模板默认使用 Kestrel。 Kestrel 的功能包括&#xff1a; 跨平台&#xff1a;Kestrel 是可在 Window…

从零开始的源码搭建:详解连锁餐饮行业中的点餐小程序开发

时下&#xff0c;点餐小程序成为了许多餐饮企业引入的一种创新工具&#xff0c;不仅方便了顾客的用餐体验&#xff0c;同时也提高了餐厅的运营效率。本文将详细探讨如何从零开始搭建一个源码&#xff0c;并深入解析连锁餐饮行业中的点餐小程序开发过程。 一、需求分析与规划 在…

如何使用Flash模拟EEPROM

目录 1、FLASH与EEPROM简介 2、FLASH模拟EEPROM原理 2.1、EERPOM数据结构 2.2、EERPOM物理结构 在讲解这篇博文前&#xff0c;首先要明白为什么使用Flash存储来模拟EEPROM&#xff1f; 主要有以下几个原因&#xff1a; 成本效益&#xff1a;许多微控制器(MCU)和系统芯片(SoC)内…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…