aarch64彙編入門學習 1

2021-09-29 09:06:29 字數 1342 閱讀 7071

藍芽耳機沒電,公司事務較為清閒,再不能看教程的情況下,計畫看下arm64的彙編**。可以先寫乙個簡單的helloworld程式試驗一下。

如果直接使用c語言,呼叫printf函式,勢必會鏈結c庫,那麼反彙編**將會比較複雜,不利於入門,於是計畫,是否可以直接使用組合語言,來寫個最簡單的程式,輸出helloworld。

參考文章:

.text

.global main

main:

ldr x0, addr_of_keep_x30

str x30, [x0]

ldr x0, addr_of_msg

bl puts

ldr x0, addr_of_keep_x30

ldr x30, [x0]

mov w0, #0

retaddr_of_msg: .dword msg

addr_of_keep_x30: .dword keep_x30

.data

msg: .asciz "hello world!\n"

keep_x30: .dword 0

分析:

從下往上看:

addr_of_msg: .dword msg 即定義了乙個標號,該標號為dword型別,,再次指向了乙個位址,msg,而這個msg相當於乙個首位址,型別為。asciz的字串"hello world!\n"

首先,將位址標號addr_of_keep_x30存入x0

將x30暫存器中的資料,放入x0暫存器中位址,即,上面的addr_of_keep_x30標號所代表的位址。

也就是說,前兩行做了乙個儲存x30暫存器的值的作用,值最終被儲存在keep_x30處

然後,取得列印字串的位址,放入x0,作為引數傳遞給puts函式,

最後,由於之前儲存了x30暫存器,所以現在需要恢復,即從位址addr_of_keep_x30中讀出存放的位址到x0,再從存放位址放入到x30

最後,將0寫入到w0,即x0的低32位,應該是預設的操作。

有疑問,這個字串儲存的長度是否有限制?發現並沒有限制。

如果我想列印兩個字串呢?是否是也可以將x1傳遞給puts?

發現並沒有將x1傳遞給puts,是否是因為puts只接收乙個引數?確實是

需要注意的是,以上的**如果從可執行程式再次反彙編,則會比較複雜和龐大。

所以可以知道最起碼有以下幾點需要注意:

①使用前需要做一定的準備工作,如儲存之前的暫存器的值——x30是lr暫存器

②引數的傳遞根據函式需要的個數,從x0到xn依次傳遞

③實用完成後,需要復原

後續需要去深入理解每個暫存器的作用。

aarch64交叉編譯dfu programmer

這裡需要說明一下的是dfu programmer的編譯需要依賴於libusb 1.0庫,需要先交叉編譯usblib 1.0庫。cd root tar xvf libusb 1.0.23 tar.bz2 cd libusb 1.0.23 mkdir build configure host aarch...

aarch64下執行aarch32程式

能否在arm晶元的aarch64模式下執行aarch32的程式呢?f2e4fcbe37df253c60b2ac2de888558e9916dbdb,not stripped 32位arm檔案,有依賴的動態庫,還有乙個直譯器 lib ld 我們稍後再分析 needed libm.so.6 基礎包 ne...

初探arm與aarch64虛擬化相容心得

armv8主要有三套指令集,依據執行狀態 execution state 的不同可以劃分為 aarch64 aarch64 狀態只支援一套指令集,叫做a64.a64為定長32位的指令集,即每個指令的大小為32bit.指令集手冊 aarch32 aarch32 狀態支援兩套指令集 a32 也是32位定...