最近打算玩一下STM8, 只为了消化一下我的库存,因为我曾经买过几个型号的STM8单片机,但是一直没用来DIY啥。我对STM8熟悉程度远不如STM32, 后者是流行广泛的ARM核,STM8却是ST独家的架构。
STM8 CPU是在ST7基础上增强,有人说是从6502演变来的,我看倒也不像。学习了一下历史,Motorola的6800演变出来的6805/6811/6809三个分支,以及6502这个与6800有渊源的CPU,从寄存器和指令集上看STM8是和它们有相似之处的,不过差异的地方也很大。作为一个8位MCU,STM8的寻址范围居然达到16M byte(我不信ST会给8位机配上1M以上的ROM或RAM),寻址模式就很多了,间接内存访问比x86都复杂,看惯了RISC的CPU更不能忍。好吧,虽然指令集复杂,STM8的执行速度还快,反正不会纯用汇编来开发。
ST并没有提供STM8的C编译器(汇编器是有的),需要用第三方的。Cosmic C编译器有免费License的版本可以用,这也是ST推荐的,我就装了一个来试。ST官方支持的还有Raisonance的编译器,此外IAR也有STM8的开发环境。
试写了个C程序测试,可以用STVP连接ST-Link下载程序,但我觉得还需要个能反汇编看编译结果的东西。Cosmic工具链里面没有反汇编程序,ST的汇编工具里也没有,STVD既然能跟踪调试应该有,但我没能把它用起来。
干脆自己写一个STM8反汇编工具吧,也练下手怎么写。
先研究下STM8的指令集,这是一种典型变长指令集,除了前缀字节,操作码就在一个字节里面。于是我照着手册统计了一张表出来:
一个字节能表示的范围除了 0x90, 0x91, 0x92, 0x72 用来做指令前缀,其它几乎都用来作操作码了。当然许多指令都有多种寻址模式的(比如加法是谁和谁相加,需要指定),因此用了不止一个操作码。算上寻址模式,256种指令都不够用的,所以STM8靠前面增加前缀字节来扩展。从手册里面截一个例子如下(这是XOR指令的多种编码):
在指令的操作码后面就是提供数据或地址的字节了,长度由操作码加上前缀来决定。
编写反汇编程序就是写一个根据字节数据流的查表过程。上面我做的那个表只是划分了指令的分布,涉及到寻址模式的细节还是得一边写一边查手册。从表上看,操作码的高半字节大概可以把指令划分为几类,再用低半字节去细分指令,于是我的程序解码第一步就是一个 switch-case 结构来划分任务:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | int decode_instr(unsigned char opcode) { switch(opcode>>4) { case 1: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: return decode_group1(opcode); case 0: case 3: case 4: case 6: case 7: return decode_group2(opcode); case 5: if(Prefix==0x72) return decode_group2(opcode); else return decode_5x(opcode); case 8: return decode_8x(opcode); case 2: return decode_2x(opcode); case 9: return decode_9x(opcode); default: return -1; } } |
解码的结果是放到全局变量里面的,返回值只代表了指令是否有效。例如,表格最右边一列的指令我是这样解析的:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | int decode_9x(unsigned char opcode) { AutoXY=1; switch(opcode&0x0f) { case 0: return set_prefix(0x90); case 1: return set_prefix(0x91); case 2: return set_prefix(0x92); case 3: format(0, LDW, regX, regY); format(0x90, LDW, regY, regX); return 1; case 4: format(0, LDW, regSP, regX); return 1; case 5: format(0, LD, regXH, regA); return 1; case 6: format(0, LDW, regX, regSP); return 1; case 7: format(0, LD, regXL, regA); return 1; case 8: format(0, RCF, 0, 0); return 1; case 9: format(0, SCF, 0, 0); return 1; case 0xA: format(0, RIM, 0, 0); return 1; case 0xB: format(0, SIM, 0, 0); return 1; case 0xC: format(0, RVF, 0, 0); return 1; case 0xD: format(0, NOP, 0, 0); return 1; case 0xE: format(0, LD, regA, regXH); return 1; case 0xF: format(0, LD, regA, regXL); return 1; default: return -1; } } |
主要是靠 format() 函数根据当前的指令前缀来翻译操作码:指令名称,寻址的第一操作数、第二操作数。若一共写 256 个 case 分支就太繁琐了,需要抓住共性,像表格中绿色背景的这一组指令我是这么处理的:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | int decode_group2(unsigned char opcode) { int instr; AutoXY=1; switch(opcode&0x0f) { case 1: switch(opcode>>4) { case 0: format(0, RRWA, regX, 0); return 1; case 3: format(0, EXG, regA, longmem); return 1; case 4: format(0, EXG, regA, regXL); return 1; case 6: format(0, EXG, regA, regYL); return 1; default: return -1; } break; case 2: switch(opcode>>4) { case 0: format(0, RLWA, regX, 0); return 1; case 3: format(0, POP, longmem, 0); return 1; case 4: format(0, MUL, regX, regA); return 1; case 6: format(0, DIV, regX, regA); return 1; case 7: return set_prefix(0x72); } break; case 5: switch(opcode>>4) { case 3: format(0, MOV, longmem, imm8); return 1; case 4: format(0, MOV, mem, mem); return 1; case 6: format(0, DIVW, regX, regY); return 1; default: return -1; } break; case 0xB: switch(opcode>>4) { case 3: format(0, PUSH, longmem, 0); return 1; case 4: format(0, PUSH, imm8, 0); return 1; case 6: format(0, LD, offSP, regA); return 1; 关键字:STM8 反汇编工具 引用地址:徒手编写了一个STM8的反汇编工具
上一篇:STM8单片机CAN滤波器的设置 推荐阅读 前一段时间学习了STM32,先是用库函数学了一个星期。发现学完之后,一些基本要用的东西能配出来,但是过程却是十分的懵逼。于是决定暂时放弃库函数,用51的思维学习32,从寄存器开始,发现效果不错。一两天学一两个模块,个把星期下来对一些基本模块的常用寄存器也理解的不少。决定慢慢的回归库函数之前写下自己对STM32一些模块的理解,共勉之。 首先附上G...
汽车雷达不断发展,在高级驾驶辅助系统 (ADAS) 中的作用也不断提升,因此测试环境必须能够实现快速、简单、可重复的测试流程。本文将介绍如何使用雷达回波发生器进行下线生产测试,从而保证汽车雷达传感器的功能和质量。随着制造真正安全的车辆涉及到各种实际问题的重要性越来越明显,我们距离制造并认证能在公共道路上使用的全自动驾驶车辆还有相当长一...
企查查 App 显示,今日,小米科技有限责任公司公开一项名为 “屏蔽来电的方法及装置”的发明专利,申请日为 2014 年 10 月 29 日,申请号为 CN201410594119.6,公开号为 CN105635414B,目前已获得授权。 IT之家了解到,根据描述,这是关于一种屏蔽来电的方法及装置,涉及通信领域。该项专利 “解决了当有被标记的陌生电话呼入时...
广告摘要声明广告【文/歌者】9月4日,杭可科技发布公告称,公司已收到比亚迪中标通知书,合计中标锂电池生产设备5.22亿元,预计将对本年及未来年度经营业绩产生积极影响。根据公司披露的公告,近三年来,杭可科技对比亚迪的销售收入及占比大幅攀升。2018-2020年,公司向比亚迪销售设备分别实现收入3.91万元、2384.71万元、5445.57万元,占当年营业收入的比...
史海拾趣 广州盛炬(GZSJ)公司的发展小趣事
机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐系统中不可或缺的关键设备。它作为连接电视机与外部信号源的桥梁,能够将接收到的数字电视信号转换成适合电视播放的格式,极大地丰富了用户的视听体验。 机顶盒的起源可追溯至20世纪90年代初,最初是为了解决有线电视收视费问题而设计的解扰设备。随着数字电视技术的发展,机顶盒的功能不断扩展,现已成为集数字信号接收、解码、显示以及多种增值服务于一体的智能终端。 从技术层面看,机顶盒支持多种信号源,包括有线电缆、卫星天线、宽带网络及地面广播等。它不仅能够接收高清、超高清电视节目,还能提供电子节目指南(EPG)、因特网网页浏览、视频点播、游戏等多元化服务。此外,一些先进的机顶盒还集成了智能语音助手、云计算和边缘计算技术,实现了更为便捷、智能的用户交互和内容分发。 在内容创新方面,机顶盒通过与各大内容提供商合作,不断引入优质资源,如电影、电视剧、综艺节目等,并根据用户偏好提供个性化推荐服务。同时,其跨平台整合能力也使得用户可以在不同设备间无缝切换,享受高质量的视频内容。 综上所述,机顶盒作为数字电视技术的核心组成部分,以其强大的功能、丰富的内容和便捷的操作体验,成为了现代家庭娱乐的重要选择。随着技术的不断进步和市场的持续扩大,机顶盒将继续发展,为用户带来更加优质、便捷、智能的观影体验。 EPCOS/TDK公司的发展小趣事
自上世纪60年代起,TDK就开始在中国布局。首先,在台湾建立合资公司,随后在香港设立销售网络及生产线。进入80年代后,TDK正式踏足中国大陆,在华东及华南多个地区建立生产基地,并逐渐将业务扩展至全国。TDK在中国的发展不仅推动了当地电子工业的进步,也为公司自身赢得了广阔的市场空间。目前,TDK在中国的员工人数近6万人,占TDK全球员工总数的近55%。 G24 Innovations公司的发展小趣事
随着产品质量的不断提升,远阳开始将目光投向更广阔的市场。公司制定了详细的市场拓展计划,并加大了品牌营销力度。2010年前后,远阳成功进军国际市场,与多家国际知名企业建立了长期合作关系。同时,公司也注重在国内市场的布局,通过参加各类行业展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。这一时期,远阳的产品线不断丰富,涵盖了HDMI、光纤线、DP线等多个系列,成为了数据工程电缆领域的佼佼者。 EKIT公司的发展小趣事
2023年10月,华为坤灵(HUAWEI eKit)在德国慕尼黑成功举办了分销品牌发布会,这是其在欧洲市场的首个国家级发布活动。通过简化交易流程、打造高效的平台和工具、整合伙伴体系等措施,HUAWEI eKit为德国及欧洲市场的中小企业提供了灵活易用的产品解决方案。同时,HUAWEI eKit还致力于为中小企业市场的各种业务场景开发易买易卖、易装易维、易学易用的分销产品,赢得了市场的广泛认可。 Axiomtek公司的发展小趣事
早在2022年,HUAWEI eKit就在中东地区进行了首次海外亮相。在GITEX展会期间,华为举办了HUAWEI eKit分销论坛,向与会者系统介绍了其“以分销商为主,以工程商为中心”的分销业务战略。通过与中东中亚区域的分销伙伴紧密合作,HUAWEI eKit成功推出了多款针对中小企业市场的新产品,覆盖了数通园区网络和数据存储等多个领域,为当地市场带来了前所未有的商机。 Futaba Electric Co Ltd公司的发展小趣事
2023年10月,华为坤灵(HUAWEI eKit)在德国慕尼黑成功举办了分销品牌发布会,这是其在欧洲市场的首个国家级发布活动。通过简化交易流程、打造高效的平台和工具、整合伙伴体系等措施,HUAWEI eKit为德国及欧洲市场的中小企业提供了灵活易用的产品解决方案。同时,HUAWEI eKit还致力于为中小企业市场的各种业务场景开发易买易卖、易装易维、易学易用的分销产品,赢得了市场的广泛认可。
小广播
推荐内容
热门活动
换一批 更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多每日新闻
更多往期活动
11月25日历史上的今天
厂商技术中心
|