日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[实验]-从汇编代码来看volatile关键字的作用

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [实验]-从汇编代码来看volatile关键字的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

★★★ 個人博客導讀首頁—點擊此處 ★★★

環境aarch64的交叉編譯器
我們將C語言翻譯成匯編代碼,來看volatile關鍵字的作用

我們先看一段C語言代碼

void udelay(uint64_t usec) {uint64_t start, cnt, delta,freq;volatile uint64_t delta_us = 0; //------------------在這里定義了一個volatile變量uint64_t reference_ratio = 16;if(timer_start == 0){generic_timer_start();start = read_cntpct_el0();delta_us = 1000; //------------------ 給這個變量賦值100while(delta_us) //------------------ 使用這個變量,這里是判斷該變量是否等于0,然后走相應邏輯{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, sp2034bc: a90153f3 stp x19, x20, [sp,#16]2034c0: aa0003f3 mov x19, x02034c4: 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_el02034f0: d2807d00 mov x0, #0x3e8 //------------------------ 0x3e8-#1000給x0賦值1000,x0就表示delta_us變量2034f4: f90017a0 str x0, [x29,#40] //------------------------ 將這個變量寫到棧尾內存(其實可能是main-memory,也可能寫入到了cache中)2034f8: f9412a80 ldr x0, [x20,#592]2034fc: f94017a1 ldr x1, [x29,#40] //------------------------ 將這個變量從棧尾內存讀出來,放到X1中203500: b4000161 cbz x1, 20352c <udelay+0x78> //------------------------ 比較x1是否等于0,然后走相應的分支203504: d53be021 mrs x1, cntpct_el0203508: eb02003f cmp x1, x220350c: 54000101 b.ne 20352c <udelay+0x78>203510: f94017a1 ldr x1, [x29,#40] //----------------------- 在操作(delta_us--)時,再次從內存中去讀203514: d1000421 sub x1, x1, #0x1 // 這樣對應 delta_us--203518: f90017a1 str x1, [x29,#40]20351c: f94017a1 ldr x1, [x29,#40]203520: eb1f003f cmp x1, xzr203524: 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, sp2034bc: f9000bf3 str x19, [sp,#16]2034c0: aa0003f3 mov x19, x02034c4: 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_el02034d8: d2807d00 mov x0, #0x3e8 //------------------------ 0x3e8-#1000給x0賦值100,x0就表示delta_us變量2034dc: d53be022 mrs x2, cntpct_el02034e0: eb01005f cmp x2, x12034e4: 540000a1 b.ne 2034f8 <udelay+0x44>2034e8: f1000400 subs x0, x0, #0x1 //------------------ 這行對應的delta_us--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关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。