生活随笔
收集整理的這篇文章主要介紹了
[实验]-从汇编代码来看volatile关键字的作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
★★★ 個人博客導讀首頁—點擊此處 ★★★
環境aarch64的交叉編譯器
我們將C語言翻譯成匯編代碼,來看volatile關鍵字的作用
我們先看一段C語言代碼
void udelay(uint64_t usec
)
{uint64_t start
, cnt
, delta
,freq
;volatile uint64_t delta_us
= 0; uint64_t reference_ratio
= 16;if(timer_start
== 0){generic_timer_start();start
= read_cntpct_el0();delta_us
= 1000; while(delta_us
) {cnt
= read_cntpct_el0();if(cnt
!= start
)break;delta_us
--;if(delta_us
== 0){base_frequency
= 0;}}INFO("base_frequency %ld\n",base_frequency
);}
......
}
翻譯成匯編后,從匯編代碼來看,delta_us=1000,直接將1000寫道棧尾中了.
while(delta_us)代碼,需要讀出delta_us,也是種棧尾種讀出來的
00000000002034b4
<udelay
>:2034b4
: a9bd7bfd stp x29
, x30
, [sp
,#
-48]!2034b8
: 910003fd mov x29
, sp
2034bc
: a90153f3 stp x19
, x20
, [sp
,#
16]2034c0
: aa0003f3 mov x19
, x0
2034c4
: b00000c0 adrp x0
, 21c000
<xxx_middle_mem_pool
+0xa40>2034c8
: f90017bf str xzr
, [x29
,#
40]2034cc
: 900000d4 adrp x20
, 21b000
<buf
+0xdb8>2034d0
: b94f9c00 ldr w0
, [x0
,#
3996]2034d4
: 340000a0 cbz w0
, 2034e8 <udelay
+0x34>2034d8
: f9412a80 ldr x0
, [x20
,#
592]2034dc
: b50003a0 cbnz x0
, 203550 <udelay
+0x9c>2034e0: d37cee73 lsl x19
, x19
, #
42034e4: 14000014 b
203534 <udelay
+0x80>2034e8: 97ffffdd bl
20345c
<generic_timer_start
>2034ec
: d53be022 mrs x2
, cntpct_el0
2034f0: d2807d00 mov x0
, #
0x3e8 2034f4: f90017a0 str x0
, [x29
,#
40] 2034f8: f9412a80 ldr x0
, [x20
,#
592]2034fc
: f94017a1 ldr x1
, [x29
,#
40] 203500: b4000161 cbz x1
, 20352c
<udelay
+0x78> 203504: d53be021 mrs x1
, cntpct_el0
203508: eb02003f cmp x1
, x2
20350c
: 54000101 b
.ne
20352c
<udelay
+0x78>203510: f94017a1 ldr x1
, [x29
,#
40] 203514: d1000421 sub x1
, x1
, #
0x1 203518: f90017a1 str x1
, [x29
,#
40]20351c
: f94017a1 ldr x1
, [x29
,#
40]203520: eb1f003f cmp x1
, xzr
203524: 9a9f1000 csel x0
, x0
, xzr
, ne
我們去除volatile關鍵字后,再翻譯成匯編:
uint64_t delta_us = 0; //------------------在這里定義了一個volatile變量
翻譯成匯編后,從匯編代碼來看,delta_us=1000,只是將1000寫入到了x0寄存器中
0000000002034b4
<udelay
>:2034b4
: a9be7bfd stp x29
, x30
, [sp
,#
-32]!2034b8
: 910003fd mov x29
, sp
2034bc
: f9000bf3 str x19
, [sp
,#
16]2034c0
: aa0003f3 mov x19
, x0
2034c4
: b00000c0 adrp x0
, 21c000
<xxx_middle_mem_pool
+0xa40>2034c8
: b94f9c00 ldr w0
, [x0
,#
3996]2034cc
: 35000160 cbnz w0
, 2034f8 <udelay
+0x44>2034d0
: 97ffffe3 bl
20345c
<generic_timer_start
>2034d4
: d53be021 mrs x1
, cntpct_el0
2034d8
: d2807d00 mov x0
, #
0x3e8 2034dc
: d53be022 mrs x2
, cntpct_el0
2034e0: eb01005f cmp x2
, x1
2034e4: 540000a1 b
.ne
2034f8 <udelay
+0x44>2034e8: f1000400 subs x0
, x0
, #
0x1 2034ec
: 54ffff81 b
.ne
2034dc
<udelay
+0x28>2034f0: 900000c0 adrp x0
, 21b000
<buf
+0xdb8>2034f4: f901281f str xzr
, [x0
,#
592]2034f8: 900000c0 adrp x0
, 21b000
<buf
+0xdb8>2034fc
: f9412801 ldr x1
, [x0
,#
592]
總結volatile關鍵字的作用:其實就算告訴編譯器,我要讀寫的數據,不要從X0-X30通用寄存器中讀取,每次都要從內存中去讀取,這里說的內存可能是主內存(main-memory)、也可能是各級cache等
總結
以上是生活随笔為你收集整理的[实验]-从汇编代码来看volatile关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。