arm彙編 main函式分析

2021-09-23 16:10:56 字數 2355 閱讀 6632

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函式的內容還比較簡單。具體如下 再往下,是乙個死迴圈。我覺得,一行行 拆分分析,寫在這裡會比較麻煩。乾脆,直接在 中通過注釋備註一下。不做過多概述,直接把我寫的注釋增補過來。看了下,其實跟我現在熟悉的嵌入式模式...