ARM彙編指令除錯方法

2021-09-08 11:23:41 字數 1607 閱讀 3630

學習arm彙編時,少不了對arm彙編指令的除錯。作為支援多語言的偵錯程式,gdb自然是較好的選擇。偵錯程式工作時,一般通過修改**段的內容構造trap軟中斷指令,實現程式的暫停和程式執行狀態的監控。為了在x86平台上執行arm指令,可以使用qemu模擬器執行arm彙編指令。

首先,我們構造一段簡單的arm匯程式設計序作為測試**main.s。

.globl _start

_start:

mov r0,#0

swi 0x00900001

以上彙編指令完成了0號系統呼叫exit的呼叫。mov指令將系統呼叫號傳入暫存器r0,然後使用0x00900001軟中斷陷入系統呼叫。

arm-linux-gcc main.s -o main -nostdlib
編譯選項「-nostdlib」表示不使用任何執行時庫檔案,編譯生成的可執行檔案main只能在arm體系結構的系統上執行。

為了x86的linux系統內執行arm體系結構的可執行程式,需要安裝qemu模擬器。

編譯安裝qemu。

./configure --prefix=/usr

sudo make && make install

然後使用qemu的arm模擬器執行arm程式。

qemu ./main
為了除錯arm程式,需要使用gdb的原始碼編譯生成arm-gdb。

./configure --target=arm-linux --prefix=/usr/local

sudo make && make install

為了和系統的gdb避免衝突,我們將gdb的安裝目錄安裝到/usr/local,然後建立軟鏈結即可。

ln -s /usr/local/gdb/gdb /usr/bin/arm-gdb
之後便可以使用arm-gdb命令除錯arm程式了。

首先使用qemu開啟遠端除錯埠。

qemu-arm -g 1024 ./main
然後匯出環境變數qemu_gdb。

export qemu_gdb=/usr/local/gdb
最後,進入gdb除錯。

arm-gdb ./main
進入arm-gdb後,首先連線遠端除錯埠。

(gdb) target remote localhost:1024
然後使用gdb常用的除錯命令除錯**即可。

(gdb) disassemble           // 檢視反彙編

(gdb) x /8xw 0x0000808e // 檢視記憶體

(gdb) info register // 檢視暫存器

(gdb) continue // 繼續執行

(gdb) stepi // 彙編級逐過程

(gdb) nexti // 彙編級逐語句

ARM彙編指令

b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...

arm彙編指令

一般arm官方風格彙編指令為大寫,windows ads mdk 實際運用一般用gnu風格,為小寫,linux 1 arm採用risc架構,cpu本身不能直接讀取內 存,而需要先將記憶體中內容加載入cpu中通用寄 存器中才能被 cpu處理 ldr loadregister 指令 將記憶體內容加載入通...

ARM彙編指令

1.彙編概述 2.指令分類學習 3.偽指令 4.協處理訪問指令 為什麼要學習使用匯程式設計序?bootloader kernel的初始化和需要執行效率極高的程式中 1.arm標準彙編 2.gnu彙編 section.data 初始化的資料 section.bss 未初始化的資料 section.te...