假設**段.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...