免責聲明:本文提供的所有內容僅供學習、分享與交流,不保證內容的正確性,亦不對內容可能帶來的風險擔責。如若轉載,請署名以及註明原始出處。本文僅代表個人的立場和觀點,並不代表任何公司或組織。
下面的全部操作僅適用Window 10 64bits 環境。
0x01 簡介
GNU toolchain 工具鏈是是ARM嵌入式開發必備工具,安裝LiteOS Studio時,需按照教程完成安裝工具鏈。安裝完成效果如下圖,所在目錄為:%userprofile%\.huawei-liteos-studio\tools\arm-none-eabi。為了在Windows下編譯構建makefile,還需安裝GNU Make工具,參考LiteOS Studio文檔站點即可。
GNU Arm Embedded Toolchain
0x02 簡介
來看一段簡單的彙編代碼,然後在Qemu connex開發板上進行仿真運行。彙編源文件包含一行行的聲明序列,遵循如下的格式:
label: instruction @ comment
每個部分均為可選:
label:
標籤,用於引用指令在內存中的位置,內存地址出現的地方都就可以使用label標籤。標籤名稱由字母、數字、_和$ 組成。
Comment:
注釋,由@符號開始,任何在@之後的字符串都被忽略。
instruction:
指令,可以是彙編指令ARM instruction或彙編器指令assembler directive,後者是彙編器的命令,點符號.開始的指令。 下面看一段簡單的彙編代碼。
.text .global _start_start: @ 標籤 mov r0, 4 @ 寄存器r1賦值4 add r2, r1, r0 @ 把r0和r1兩個寄存器的值相加,保存在寄存器r2stop: b stop @ 無限循環停止執行
其中.text是彙編器指令,表示後續的指令會被彙編到代碼段 code section,而不是數據段.data section。後續會詳細介紹段section。
0x03 獲取代碼和Makefile構建腳本
代碼和Makefile構建腳本,LiteOS Stuido工程配置文件等已經上傳到gitee代碼倉,可以下載下載,直接編譯、調試。
https://gitee.com/huawei_liteos_studio/arm_assembly/tree/master/HelloArm
0x04 ARM 彙編調試演示
點擊工具欄上的編譯圖標,可以實現一鍵編譯:
編譯 編譯日誌 輸出件
點擊工具欄調測按鈕,開始調試:
點擊工具欄調測按鈕
點擊調測工具欄的單步跳過按鈕,或者F10快捷鍵,開始單步調試,可以看到寄存器r0,r1先後被賦值為5和4.繼續單步執行,r2寄存器賦值為9。我們這個最簡單的彙編程序在Qemu上執行完畢。
單步調測F10
重新開始調測,這一次,我們打開build目錄下面的asm文件,並且分欄展示,F10單步調試,效果圖如下:
ASM反彙編展示
可以看到,add.s 執行到第6行add r2, r1, r0 時,寄存器pc值為0x8 <_start+8>,此時asm反彙編文件在第10,此時的地址為8,彙編語句為add r2, r1, r0,彙編源碼、PC寄存器、ASM反彙編文件可以彼此對應上。
0x05 ARM 編譯命令說明
arm-none-eabi-as -o add.o add.s -o 選項指定輸出文件名稱arm-none-eabi-ld -Ttext=0x0 -o add.elf add.o -o 選項指定輸出文件名稱,-Ttext=0x0 指定分給給text段的地址,從0x0開始。arm-none-eabi-nm add.elf nm命令查看各個標籤分配的地址arm-none-eabi-objcopy -O binary add.elf add.bin 轉換elf文件為bin文件格式
0x06 參考資料
http://www.bravegnu.org/gnu-eprog/hello-arm.html
https://jacobmossberg.se/posts/2017/01/17/use-gdb-on-arm-assembly-program.html