关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA”


在自制CMSIS_DAP离线下载器的时候,利用FLM文件生成下载算法里面,每个下载算法都会有一个32个字节的头部"0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA",除去这32个字节的头部数据才是真正的从flm文件中提取出来的算法,国内都是魔改差不多能用就不再去深究了,所以在国内各大论坛都没有找到相关解答,后来在国外几位开发者的github上提交issues,其中就包括在ARM官方DAPLink的github下提交issues,终于是有两位给了回复,下面说一下这部分代码的作用。

我提交的issues给的相关回复在这里:

  • https://github.com/ARMmbed/DAPLink/issues/902

  • https://github.com/pyocd/pyOCD/discussions/1252

这两位作者给的回复都是将这32字节使用arm编译工具链进行了代码反汇编,通过反汇编代码进行分析,具体操作步骤如下:

首先将这32字节用二进制形式写入到一个bin格式文件中:

int main(void)
{uint32_t header[] = {0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA, 0x2A001E52, 0x4770D1F2};int fd;fd = open("D:/algo.bin", O_RDWR | O_BINARY | O_CREAT);write(fd, header, sizeof(header));close(fd);return 0;
}

然后使用arm交叉编译器对其反汇编:

具体命令为:

arm-none-eabi-objdump.exe -b binary -m arm -M force-thumb -D D:/algo.bin

然后就得到了反汇编代码:

00000000 <.data>:0:   be00            bkpt    0x00002:   e00a            b.n     0x1a4:   780d            ldrb    r5, [r1, #0]6:   062d            lsls    r5, r5, #248:   4068            eors    r0, r5a:   2408            movs    r4, #8c:   0040            lsls    r0, r0, #1e:   d300            bcc.n   0x1210:   4058            eors    r0, r312:   1e64            subs    r4, r4, #114:   d1fa            bne.n   0xc16:   1c49            adds    r1, r1, #118:   1e52            subs    r2, r2, #11a:   2a00            cmp     r2, #01c:   d1f2            bne.n   0x41e:   4770            bx      lr

反汇编代码在转成C语言就是这样:

// r0 = initial value
// r1 = ptr
// r2 = count
// r3 = modifier xor'd into r0
uint32_t foo(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3)
{while (r2 != 0){uint32_t r5 = *(uint8_t *)r1;r5 <<= 24;r0 ^= r5;uint32_t r4 = 8;do {uint32_t b = r0 & (1 << 31);r0 <<= 1;if (b){r0 ^= r3;}r4 -= 1;} while (r4 != 0);r1 += 1;r2 -= 1;}return r0;
}

这段汇编代码什么意思呢?

对于汇编不了解的同学我就先简单说一下,不展开说ARM汇编指令了。

bkpt指令是断点中断指令,执行该指令可以暂停程序的运行,以上反汇编代码中除去bkpt指令会操作硬件,其他指令都是软件层面的,例如b指令是跳转指令,ldrb(Load Register Byte)字节数据加载指令,cmp比较指令等。所以除去bkpt指令,其他汇编代码其实就是在做类似于CRC校验算法的一个计算过程。

那么现在这段代码的功能结合C代码也就明确了,首先使用bkpt指令暂停了程序的运行,然后使用b指令跳转到了0X1A这个地址处运行,由于内存地址是从0X20000000开始的,也就是跳转到了0X2000001A地址处运行。执行完这个类似于CRC检验算法的这个过程后,就去执行0X20000021开始的地方,也就是真正的FLM中提取出来的下载算法代码了,接下来就是通过DAP对目标程序进行调试了。


完!

关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“相关推荐

  1. 如何解决万能地图下载器下载的地图和选择范围不一致

    有的朋友在下载用万能地图下载器下载地图的时候下载了某个多边形的地图,但是导出地图后发现和自己的下载范围不一致,这是怎么回事呢,今天就给大家讲讲如何解决这个问题. 工具/原料 水经注万能地图下载器 方法 ...

  2. 使用太乐地图下载器下载cesium适用瓦片

    使用太乐地图下载器下载cesium适用瓦片

  3. 如何用GGGIS地图下载器下载谷歌无偏移影像和天地图标注(百度和高德地图类似)

    如何用GGGIS地图下载器下载谷歌无偏移影像和天地图标注(百度和高德地图类似) 软件:GGGIS地图下载器 第一步:选择登录注册 第二步骤:注册一个自己专属的账号 第三步:登录即可(第一次登录会比较慢 ...

  4. 如何使用万能地图下载器下载矢量路网

    矢量路网地图是智能交通诱导和汽车导航等系统的构建基础,有极高的应用价值,现有绘图方法要么工作周期较长,要么难以获取最新的数据源.当前路网地网获取方法主要是传统测绘方法,其运用测绘仪器及测绘学原理进行实 ...

  5. 万能地图下载器下载谷歌卫星地图在CAD中套合

    手里的矢量图需要和影像进行叠加查看效果,一般国内的矢量数据一般是80.54或者2000坐标系,这时候就需要对下载的影像进行一下坐标转换才可以同矢量地图叠加上.这里以CAD为例,讲解一下如何将万能地图下 ...

  6. 如何将万能地图下载器下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计

    最近有遇到朋友想要将万能地图下载器内下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计,查找了相关的资料,找到了如何加载进入的方法,给大家分享一下,希望对大家能够有所 ...

  7. 如何使用新版本的万能地图下载器下载谷歌电子地图

    现在基本上所有的朋友都使用的是新版本的万能地图下载器,基本的操作大家应该都会了,今天继续新版本的教程,今天介绍的是如何使用新版本的万能地图下载器下载谷歌电子地图. 工具/原料 万能地图下载器 方法/步 ...

  8. android调用系统下载器下载文件

    在项目中使用到了在android端下载服务端的文件,之前使用的是http下载方式,现在想改成调用系统的下载器进行下载,实现步骤为: 1.得到url:文件下载地址 2.使用URL下载: (1)下载前先判 ...

  9. 用CSS样式下载器 下载CSS里面的图片路径配对问题

    2019独角兽企业重金招聘Python工程师标准>>> 用CSS样式下载器 下载CSS里面的图片路径配对问题 路径如下图: 这时候在CSS样式下载器选择[相对路径加网址前缀]然后在输 ...

最新文章

  1. 技术人生:与其鸟宿檐下,不如击翅风雨
  2. linux磁盘管理原理,Linux操作系统中磁盘存储区管理的原理与技巧
  3. leetcode10 为什么p[j-1] == '*'的时候,不能用递推公式dp[i][j] = dp[i][j-1] || dp[i][j-2] || dp[i-1][j]
  4. 追梦童年,80后记忆中的Gameboy,教你怎么用模拟器去重温旧梦!
  5. delphi控制POS打印机
  6. libzbar.a armv7
  7. SQL学习——小结练习(1)
  8. MacBook Pro 下安装 MySQL 5
  9. Win10/Win11:恢复Win7照片查看器
  10. Java制作银行管理系统_java代码实现银行管理系统
  11. 【保险分享】出门旅游是否需要够买旅行险?
  12. java 未读消息_javaweb未读消息提醒
  13. POJ3067 Japan
  14. 双服务器架构实战飞桨部署-自动上色和老相片修复
  15. Python斐波拉契数列
  16. Java——反射机制(下)
  17. MATLAB遗传算法求解超市物流配送选址问题实例
  18. 基于python-tkinter的答题系统
  19. 在Adobe Illustrator中创建漂亮的冬季场景
  20. Recyclerview多布局

热门文章

  1. 多层卷积后感受野的计算
  2. 有一个List集合,里面存储了5个Student对象。Student有姓名、年龄和成绩属性,按照多个属性进行排序(一行代码解决list对象集合排序问题)。
  3. fails sanity check错误的解决方法
  4. 基于OpenCV的形状检测
  5. 媒体谈北京豪车遍地报道:传递羡富价值观刺激社会
  6. 今日头条广告投放技巧干货:落地页分析工具
  7. 2018年终总结之最有成就感的几件事
  8. 被误解的 Node.js
  9. 2.MyBatis源码解析-SqlSession构建流程--阿呆中二
  10. USB OTG连接方式