日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于自制CMSIS_DAP離線下載器下載算法的代碼說明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA”


在自制CMSIS_DAP離線下載器的時候,利用FLM文件生成下載算法里面,每個下載算法都會有一個32個字節(jié)的頭部"0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA",除去這32個字節(jié)的頭部數(shù)據(jù)才是真正的從flm文件中提取出來的算法,國內(nèi)都是魔改差不多能用就不再去深究了,所以在國內(nèi)各大論壇都沒有找到相關(guān)解答,后來在國外幾位開發(fā)者的github上提交issues,其中就包括在ARM官方DAPLink的github下提交issues,終于是有兩位給了回復,下面說一下這部分代碼的作用。

我提交的issues給的相關(guān)回復在這里:

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

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

這兩位作者給的回復都是將這32字節(jié)使用arm編譯工具鏈進行了代碼反匯編,通過反匯編代碼進行分析,具體操作步驟如下:

首先將這32字節(jié)用二進制形式寫入到一個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

反匯編代碼在轉(zhuǎn)成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指令是斷點中斷指令,執(zhí)行該指令可以暫停程序的運行,以上反匯編代碼中除去bkpt指令會操作硬件,其他指令都是軟件層面的,例如b指令是跳轉(zhuǎn)指令,ldrb(Load Register Byte)字節(jié)數(shù)據(jù)加載指令,cmp比較指令等。所以除去bkpt指令,其他匯編代碼其實就是在做類似于CRC校驗算法的一個計算過程。

那么現(xiàn)在這段代碼的功能結(jié)合C代碼也就明確了,首先使用bkpt指令暫停了程序的運行,然后使用b指令跳轉(zhuǎn)到了0X1A這個地址處運行,由于內(nèi)存地址是從0X20000000開始的,也就是跳轉(zhuǎn)到了0X2000001A地址處運行。執(zhí)行完這個類似于CRC檢驗算法的這個過程后,就去執(zhí)行0X20000021開始的地方,也就是真正的FLM中提取出來的下載算法代碼了,接下來就是通過DAP對目標程序進行調(diào)試了。


完!

總結(jié)

以上是生活随笔為你收集整理的关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。