一段簡單的ARM彙編分析

2021-10-05 09:41:14 字數 1459 閱讀 1623

假設**段.text首位址為0x8054

錯誤的**示例:

.text

.code 32

.global _start

_start:

bl main @1. pc = 0x8054,lr = 0x0

b .

main:

push @2. pc = 0x805c,lr = 0x8058

bl func1 @3. pc = 0x8060,lr = 0x8058 @棧1

pop @

func1:

bl func2 @4. pc = 0x8068,lr = 0x8064

mov pc, lr @6. pc = 0x806c,lr = 0x806c @程式在此死迴圈,回不去主函式

func2:

mov pc, lr @5. pc = 0x8070,lr = 0x806c

修正後:

.text

.code 32

.global _start

_start:

bl main @1. pc = 0x8054,lr = 0x0

b . @9. pc = 0x8058,lc = 0x8070 @棧空

main:

push @2. pc = 0x805c,lr = 0x8058

bl func1 @3. pc = 0x8060,lr = 0x8058 @棧1

pop @8. pc = 0x8064,lr = 0x8070 @棧3

func1:

push @4. pc = 0x8068,lr = 0x8064

bl func2 @5. pc = 0x806c,lr = 0x8064 @棧2

兩個程式的區別在於func1中有沒有對lr暫存器進行壓棧備份,由於前者沒有備份,所以程式在連續跳轉時丟失了回去的路。

因此在跳轉指令bl被巢狀使用時,應該對lr暫存器進行壓棧備份,在最後一層巢狀中使用mov pc, lr指令返回主調函式,然後逐層pop最終回到主函式.

用自己的語言解釋一段簡單的彙編

section data values int 10,15,20,25,30,35,40,45,50,55,60 section text globl start start nop 空格 固定格式 為了gdb除錯 movl values,eax eax values 0 10 movl value...

用自己的語言解釋一段簡單的彙編

section data values int 10,15,20,25,30,35,40,45,50,55,60 section text globl start start nop 空格 固定格式 為了gdb除錯 movl values,eax eax values 0 10 movl value...

一段分析資料的總結

業務背景 有乙個表中存在1億的資料,存著個人資訊 城市 單位 學校等內容 而這些內容在字段中儲存的是json,需要將這些資料分析後,算出這些內容的離散模型,取出top100。最先的實現方案是批量查出來1w資料,分析後一條條更新,發現更新太慢。隨後做了如下改進,也是總結 1 先查詢後更新的操作,用my...