色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【專欄精選】Cortex-M 的反編譯入門

電子發燒友論壇 ? 來源:未知 ? 2023-05-16 09:35 ? 次閱讀

電子發燒友技術探索官,分享你的原創電子行業文章!

本期為大家推薦一篇嵌入式相關技術文章,作者主要從事嵌入式領域的開發,感興趣的小伙伴可以關注學習哦~


本期推

專欄作者嵌入式大雜燴(點擊查看作者主頁)

介紹:該專欄主要介紹嵌入式開發相關的知識,與大家一起交流學習。


我們在寫單片機裸機程序時,在主函數之前,會有一段啟動代碼,而啟動代碼是用匯編寫的,有些朋友可能看到匯編頭都大了,當時要想深入研究底層架構,這快硬骨頭就必須去啃。


匯編:匯編文件轉換為目標文件(里面是機器碼)。

反匯編:可執行文件(目標文件,里面是機器碼),轉換為匯編文件。

關于匯編的基礎知識,請關注筆者專欄,閱讀以前的文章。

今天筆者以STM32F1的點燈程序為例,帶領大家進行反匯編,并閱讀反匯編后的代碼。

1 新建LED裸機程序

1.新建文件夾

新建文件夾“STM32F1”,當然名字也可以另取,在 STM32F1文件夾下,我們新建五個文件夾,分別為CMSIS、Listing、Output、Project、User。

其中CMSIS文件夾放啟動文件:


筆者的開發板芯片是STM32F103ZE,這個文件是根據STM32的固件庫startup_stm32f10x_md.s文件修改而來。

2.新建工程

打開Keil,在工具欄 Project->New μVision Project…新建我們的工程文件。


輸入工程名,保存即可。


窗口是讓我們選擇公司跟芯片的型號,我們用的芯片是 ST 公司的STM32F103ZE,有64K SRAM,512K Flash,屬于高集成度的芯片。按如下選擇即可。



后點擊項目管理。


最后修改后的內容如下:


并添加相應的文件。


其中main.c的內容如下所示:

/**
* @brief 延時函數
* @param d
* @retval None
*/
void delay(int d)
{
while(d--);
}


/**
* @brief main
* @param None
* @retval int
*/
int main(void)
{
unsigned int *pReg;

/* 使能GPIOB */
pReg = (unsigned int *)(0x40021000 + 0x18);
*pReg |= (1<<3);

/* 設置GPIOB0為輸出引腳 */
pReg = (unsigned int *)(0x40010C00 + 0x00);
*pReg |= (1<<0);


pReg = (unsigned int *)(0x40010C00 + 0x0C);

while (1)
{
/* 設置GPIOB0輸出1 */
*pReg |= (1<<0);

delay(1000000);


/* 設置GPIOB0輸出0 */
*pReg &= ~(1<<0);

delay(1000000);
}
}

startup.s文件的內容如下:

;************************************ STM32F1 ************************************
;* File Name : startup.s
;* Author : BruceOu
;* Version : V1.0
;* Date : 2021-06-27
;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;*******************************************************************************
PRESERVE8
THUMB




; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors

__Vectors DCD 0
DCD Reset_Handler ; Reset Handler


AREA |.text|, CODE, READONLY


; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT main


LDR SP, =(0x20000000+0x10000)
BL main


ENDP

END

接下來還有配置工程。


選擇Output文件夾。


選擇Listing文件夾。


基本配置就這些,接下來編譯工程。


只要沒有錯誤就可以了,最后就是下載程序,筆者使用的是J-Link,最后的現象如下:


LED會不停閃爍。

2 Keil反匯編

接下來才是今天正題,反匯編。

在KEIL的User選項中,如下圖添加這兩項:

fromelf --bin --output=STM32F1.bin ../Output/STM32F1.axf

fromelf --text -a -c --output=STM32F1.dis ../Output/STM32F1.axf

然后重新編譯,即可得到二進制文件STM32F1.bin(以后會分析)、反匯編文件STM32F1.dis。

如下圖所示:


正常編譯過程是分為四個階段進行的,即預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編 (Assembly)和鏈接(Linking)。

但是反編譯是講為二進制文件反編譯成匯編文件,因此反匯編的流程如下:

3 反匯編代碼解析

接下來就是查看反編譯代碼,打開反編譯文件Project/STM32F1.dis。這里只截取一段查看,因為格式都是一樣的,知識每條內容不同罷了。


第一列是鏈接地址,第二列是機器碼,第三列是匯編指令。

根本匯編指令,我們找到ARMv7-M Architecture Reference Manual_DDI 0403E.d (ID070218)中的LDR指令。


我們將F8DFD004變成二進制。


這個使用的32位的Thumb2指令集。


其中b0~b11是立即數,這里是4,對應的匯編代碼的也是4,這里要注意的是,ARM指令采用流水線機制,當前執行地址A的指令,同時已經在對下一條指令進行譯碼同時已經在讀取下下一條指令:PC = A +4 (Thumb/Thumb2指令集)。


B12~b15是寄存器,這段大小是0XC,對應的寄存器就是sp;


后面16bit除了23位意外,全是固定的,其中‘U’表示無條件執行,這里置為1。

其他的匯編指令對應的機器碼也是類似的,值得注意的是,不同的架構對應的機器碼也是不同的,這也就回答了為了不同的處理器架構會對應不同的指令集。

有興趣的可以對比Cortex-M系列和Cortex-A系列的的指令集。請參考以下手冊:

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition.pdf

ARMv7-M Architecture Reference Manual.pdf

4 反匯編代碼全解析

進入debug模式,在View下選擇disassembly window。


這樣就可將機器碼和對應的代碼對應起來。當程序運行起來了,也就從異常向量表中跳轉到Reset_Handler中,然后跳轉到main函數中,而main函數是在棧中,因此需要設置占空間的起始位置。根據STM32的參考手冊,SRAM的其起始地址和大小如下:


因此棧頂為起始位置加上棧的大小即可,只要不超過SRAM即可。


值得注意的是,棧是__向低地址擴展的數據結構__,是一塊連續的內存區域,棧頂的地址和棧的最大容量是在通過LDR設置,因此需要根據應用需求合理分配??臻g。

接下來往下走,如果在匯編中不打斷點,會默認進入main函數的一條指令,就從這里分析。為了分析方便,這里還有使用上一節方便出來的文件。



【C代碼33行】

從內存地址0x0800 017c拷貝數據0x40021018到r3中,也就是

r3 = * 0x0800 017c

也就是將pReg指針保存到r3中。


【C代碼34行】

這里對應3條指令


首先將r3拷貝到r0中,然后將r0或上1左移3位,也就是

ORR r0,r0,#8

最后將r0的值寫入r3所指地址中。

【C代碼37行】

同33行,從內存地址0x0800 0180拷貝數據40010c00到r3中


【C代碼38行】

同34行,這里也對應3條指令:


【C代碼40行】

和33行不同的是,這里分了兩條指令:


筆者認為前面是編譯器優化了。根據ARM指令采用流水線機制,當前執行地址A的指令,同時已經在對下一條指令進行譯碼同時已經在讀取下下一條指令:PC = A +4 (Thumb/Thumb2指令集)。因此前面類似的代碼被優化了。

接下來就進入循環中。

后面就移植在死循環中,不斷操作GPIO的亮滅。

【C代碼45行】

這里是將B0設置為1,和34行類似。


【C代碼47行】

這里將進入延時函數。


進入延時函數:


NOP是字節對齊,減少指令的內存訪問次數。首先將變量d保存到r0,然后將r0賦給r1,接著是r0自減1,緊接著是r1與0比較,如果r1等于0,則會返回,否則,又從頭開始,值得注意的是,這里先比較,然后r0才自減的。

為了進一步說明,可以看--d的匯編代碼。


這里就是相當于r1先減1,然后再比較的。

【C代碼50行】

這行代碼對應一下指令,很簡單。

5 總結

在前面使用Keil進行了反匯編,也對相應的C代碼進行了分析。我們看到的反匯編代碼如下:


根據反匯編的代碼,可將其對應到Flash,在Flash上的內容如下表所示:

地址Flash****內容
0x0800000000000000
0x0800000408000009
0x08000008f8dfd004
0x0800000cf000f80c

最后總結下點燈的流程:

第一步:設置棧CPU會從0x08000000讀取值,用來設置SP。

第二步:跳轉:CPU從0x08000004得到地址值,根據它的BIT0切換為ARM狀態或Thumb狀態,然后跳轉。

__第三步:__對于cortex M3/M4,它只支持Thumb狀態,所以0x08000004上的值bit0必定是1,0x08000004上的值 = Reset_Handler + 1。從Reset_Handler繼續執行。

第四步:然后進入到主函數中執行相應C代碼。


原文地址:http://m.1cnz.cn/d/2071474.html




版權說明:

本內容為作者發布至電子發燒友平臺原創文章,相關創作版權歸原作者所有,如未經作者授權,禁止轉載!




聲明本文由電子發燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。


更多熱點文章閱讀

  • 電子工程師分享:常用電平轉換電路、電源自動切換電路、太陽能充電電路總結

  • 基于32位RISC-V設計的互聯型微控制器,沁恒微CH32V307開發樣例

  • RK3568!四核64位ARMv8.2A架構,匯聚編譯源碼及實戰樣例

  • 尺寸僅有21mm*51mm,板邊采用郵票孔設計,合宙 Air105 核心板開發總結

  • 基于ESP32芯片,搭載OpenHarmony操作系統,NiobeU4開發板應用實例


原文標題:【專欄精選】Cortex-M 的反編譯入門

文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴

原文標題:【專欄精選】Cortex-M 的反編譯入門

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Cortex-M3/M4F指令集技術用戶手冊

    電子發燒友網站提供《Cortex-M3/M4F指令集技術用戶手冊.pdf》資料免費下載
    發表于 12-23 16:31 ?3次下載
    <b class='flag-5'>Cortex-M</b>3/<b class='flag-5'>M</b>4F指令集技術用戶手冊

    如何使用Ozone分析Cortex-M異常

    Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調試功能,深入了解Cortex-M架構上的這些錯誤。
    的頭像 發表于 11-29 11:14 ?868次閱讀
    如何使用Ozone分析<b class='flag-5'>Cortex-M</b>異常

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節碼(.class文件)轉換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結構,但它并不總是能完美地還原原始源代碼。反編譯工具通常會
    的頭像 發表于 09-02 11:03 ?1135次閱讀

    java反編譯的代碼可以修改么

    Java反編譯是一種將編譯后的Java字節碼(.class文件)轉換回源代碼的過程。反編譯后的代碼可以進行修改,但是需要注意,反編譯代碼的質量和可讀性可能會受到原始
    的頭像 發表于 09-02 11:00 ?782次閱讀

    ida反編譯出來代碼能直接用嗎

    IDA反編譯出來的代碼通常 不能直接使用 ,這主要基于以下幾個方面的原因: 一、代碼的不完整性 IDA反編譯生成的代碼可能缺少原始源代碼中的某些關鍵信息。在編譯過程中,編譯器會優化代碼
    的頭像 發表于 09-02 10:55 ?782次閱讀

    單片機hex文件反編譯成C語言的過程

    使用C語言編寫,然后編譯成機器碼并燒錄到單片機的存儲器中。 Hex文件是一種用于存儲單片機程序的文件格式,它包含了程序的機器碼和一些附加信息,如起始地址、結束地址等。Hex文件通常用于燒錄單片機程序,也可以用于程序的傳輸和存儲。 Hex文件反編譯的基本概念 Hex文
    的頭像 發表于 09-02 10:49 ?3713次閱讀

    使用Keil uVision對TLE9893_2QK Evalkit進行編程,顯示\"未找到Cortex-M SW設備\",為什么?

    我正在使用 Keil uVision 對 TLE9893_2QK Evalkit 進行編程。 當我嘗試調試時,得到以下錯誤信息。 我還收到一個窗口,顯示\"未找到 Cortex-M SW
    發表于 06-03 08:10

    [RK3588從入門到精通]系列內容專欄目錄及介紹

    [RK3588從入門到精通] 專欄目錄及介紹
    的頭像 發表于 04-10 10:40 ?788次閱讀
    [RK3588從<b class='flag-5'>入門</b>到精通]系列內容<b class='flag-5'>專欄</b>目錄及介紹

    CW32F003E4芯片入門學習:1.開發環境安裝

    、學生、學者等群體非商業免費評估和使用。 沒有代碼大小限制。 支持Arm Compiler 6:可為所有基于Arm Cortex-M的產品提供精簡的代碼和強大的性能。 可訪問超過9500款支持
    的頭像 發表于 03-27 09:27 ?614次閱讀
    CW32F003E4芯片<b class='flag-5'>入門</b>學習:1.開發環境安裝

    Cortex-M0+內核介紹

    和8位的價位實現32位性能。處理器的低門數使其能夠部署在需要簡單功能的應用中。 作為ARM Cortex-M處理器系列的最新成員,32位Cortex-M0+處理器采用了低成本90納米低功耗(LP)工藝,耗電量僅9μA/MHz,約為主流8位或16位處理器的1/3,卻能提供更
    的頭像 發表于 03-27 09:13 ?1129次閱讀
    <b class='flag-5'>Cortex-M</b>0+內核介紹

    Cortex-M3芯片有哪些

    Cortex-M3芯片是一款基于ARM架構的低功耗、高性能的嵌入式處理器。目前市面上有眾多廠商生產了基于Cortex-M3內核的芯片,如意法半導體的STM32F系列、恩智浦半導體的LPC1800系列等。這些芯片廣泛應用于工業控制、智能家居、物聯網等領域。
    的頭像 發表于 03-11 17:07 ?1646次閱讀

    Cortex-M3芯片怎么樣

    Cortex-M3芯片是一款高性能、低功耗的32位RISC處理器,特別適用于嵌入式系統和實時控制領域。其架構采用哈佛結構,實現指令和數據存儲器的獨立訪問,提高了系統效率。Cortex-M3支持內部和外部總線接口,提供了廣泛的外設連接和擴展性支持。
    的頭像 發表于 03-08 16:00 ?1399次閱讀

    Cortex-M85內核單片機如何快速上手

    2022年4月,Arm推出了全新的MCU級內核Cortex-M85。截止目前(2024年2月),Cortex-M85是最新、最強的Cortex-M內核。
    發表于 02-29 09:35 ?789次閱讀
    <b class='flag-5'>Cortex-M</b>85內核單片機如何快速上手

    ARM?Cortex?-M23 32位MCU數據表

    電子發燒友網站提供《ARM?Cortex?-M23 32位MCU數據表.pdf》資料免費下載
    發表于 02-22 14:32 ?0次下載
    ARM?<b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>23 32位MCU數據表

    入門級64位ARM?CORTEX?-A55 MPU數據手冊

    電子發燒友網站提供《入門級64位ARM?CORTEX?-A55 MPU數據手冊.pdf》資料免費下載
    發表于 02-19 10:59 ?1次下載
    <b class='flag-5'>入門</b>級64位ARM?<b class='flag-5'>CORTEX</b>?-A55 MPU數據手冊
    主站蜘蛛池模板: 亚洲国产成人在线视频| 大学生宿舍飞机china free| 久久国产精品久久国产精品| 66美女人体| 日韩毛片大全| 国产午夜三级一区二区三| 真实国产熟睡乱子伦对白无套| 琪琪的色原网站| 国产在线精品亚洲| asian4you裸模| 亚洲AV无码国产精品色在线看| 麻豆成人久久精品二区三区网站 | 777米奇影院第七色色| 十分钟免费看完整视频| 久久婷婷五月免费综合色啪| 国产69精品久久久久人妻刘玥| 在线看片韩国免费人成视频| 色戒在线完整观看在线播放版| 久久久久琪琪精品色| 国产99久久九九精品无码不卡| 最近日本字幕免费高清| 午夜无码国产理论在线| 欧美乱妇15p图| 久久精品中文字幕免费| 国产精品青草久久福利不卡| 99热这里只有精品8| 夜色私人影院永久入口| 文中字幕一区二区三区视频播放| 男女肉大捧进出全过程免费| 激情内射亚州一区二区三区爱妻 | 玩弄放荡人妻一区二区三区| 免费的av不用播放器的| 国产中文字幕乱码免费| 动漫护士被乳羞羞漫| 92午夜免费福利757| 夜夜狂射影院欧美极品| 午夜想想爱午夜剧场| 日日摸天天添天天添无码蜜臀| 嫩草影院永久在线一二三四| 九九视频在线观看视频6| 国产精品亚洲污污网站入口|