arm 彙編分析
1. 主要是為了搞清楚原子操作的實現原理。
2. 在 c語言環境下 變數賦值應該是可以被打斷。
3. 還有是在c語言中變數賦值操作對應的彙編**。
4. 原子操作的主要流程 read ---> modify -----> write (rwm )
那麼接下來先看一下c 語言**:
#include
intfunc()
intmain()
反彙編之後的彙編**,
#反彙編主要這兩步
1. arm-none-gcc -c main.c -o main.o
2. arm-none-objdump -s main.o > main.s
# 也可以一步到位
1. arm-none-gcc -s main.c -o main.s
main.o: file format elf32-littlearm
disassembly of section .text:
00000000 :
0: e52db004 push ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e3a0300a mov r3, #10
10: e50b300c str r3, [fp, #-12]
14: e3a03000 mov r3, #0
18: e50b3008 str r3, [fp, #-8]
1c: e51b300c ldr r3, [fp, #-12]
20: e50b3008 str r3, [fp, #-8]
24: e51b3008 ldr r3, [fp, #-8]
28: e1a00003 mov r0, r3
2c: e24bd000 sub sp, fp, #0
30: e49db004 pop ; (ldr fp, [sp], #4)
34: e12fff1e bx lr
@ fp 和 sp 都是棧指標,乙個是區域性函式類的指標,乙個是全域性的棧指標,可以著這麼理解
00000038 :
38: e92d4800 push @ 將fp lr 入棧,此時 sp = sp + 4 + 4 = sp + 8
3c: e28db004 add fp, sp, #4 @ fp = sp + 8 + 4 = sp + 12
40: e24dd008 sub sp, sp, #8 @ sp = sp - 8
@ 對照原始碼進行分析 r3 此時因該儲存的區域性變數 a存放的記憶體位址
44: e3a0300a mov r3, #10 @ sp fp 保持不變 r3 = 10
48: e50b300c str r3, [fp, #-12] @ fp - 12 = r3 , sp 和 fp 保持不變
4c: e51b300c ldr r3, [fp, #-12] @ r3 = fp - 12 , fp 和 sp 保持不變
50: e50b3008 str r3, [fp, #-8] @ fp - 8 = r3 ,fp 和 sp 保持不變
54: ebfffffe bl 0 58: e50b0008 str r0, [fp, #-8] @ r0 函式func的返回值 fp - 8 = r0
@ 這裡r2 應該是儲存的 變數b 的位址
5c: e51b2008 ldr r2, [fp, #-8] @ r2 = fp - 8,相當於 r2 = r0
60: e51b100c ldr r1, [fp, #-12] @ r1 = fp - 12
64: e59f0010 ldr r0, [pc, #16] ; 7c @ arm **流水線 ,如果此時正在執行這條指令,那麼此時的pc = 當前位址 + 8, r0 = 7c
68: ebfffffe bl 0 6c: e3a03000 mov r3, #0
70: e1a00003 mov r0, r3
74: e24bd004 sub sp, fp, #4
78: e8bd8800 pop
7c: 00000000 .word 0x00000000
然後有兩個問題:
1. 乙個函式內部的區域性變數位址是怎麼儲存的? 是否是儲存在某些通用的暫存器中?
2. 彙編中 fp 和 sp 區別?
3. c 語言中賦值操作 : 先把變數的值 從儲存變數的記憶體位址中讀出來放到某個暫存器中,然後賦值給儲存其他變數位址的暫存器。
hostapd之main 函式分析
hostapd 的main函式位於hostapd hostapd.c中。函式開始是日誌相關以及對命令列引數選項的處理。緊接著進入hostapd初始化階段,hostapd包括以下四個步驟。初始化完成之後,進入eloop run 通過select函式判斷是否有新的事件,並呼叫相應處理函式進行處理。最後階...
arm彙編檔案分析
text 表示 global start start ldr r0,0x53000000 watchdog暫存器位址 movr1,0x0 str r1,r0 寫入0,禁止watchdog,否則cpu會不斷重啟 ldr sp,1024 4 設定堆疊,注意 不能大於4k,因為現在可用的記憶體只有4k n...
503 linux核心學習 main函式分析
全部學習彙總 進入核心啟動的正題,開始分析main函式。我手中這個比較原始的核心,main函式的內容還比較簡單。具體如下 再往下,是乙個死迴圈。我覺得,一行行 拆分分析,寫在這裡會比較麻煩。乾脆,直接在 中通過注釋備註一下。不做過多概述,直接把我寫的注釋增補過來。看了下,其實跟我現在熟悉的嵌入式模式...