藍芽耳機沒電,公司事務較為清閒,再不能看教程的情況下,計畫看下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位定...