国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于C中嵌套匯編代碼難嗎?

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-01-10 14:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:黃工 公眾號:strongerHuang 做底層軟件開發的,或多或少都會接觸一些匯編代碼,今天就來說說關于匯編在C中的定義和調用,以及舉例說明嵌套匯編代碼。 一、嵌套匯編說明有認真研究,或者說細心一點的讀者應該都知道:C中定義匯編代碼與編譯器有關。 比如:你在core_cm4.h文件會看到如下的代碼:

#if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #define __STATIC_INLINE static __inline #elif defined ( __GNUC__ ) #define __ASM __asm /*!< asm keyword for GNU Compiler */ #define __INLINE inline /*!< inline keyword for GNU Compiler */ #define __STATIC_INLINE static inline #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ #define __STATIC_INLINE static inline #elif defined ( __TMS470__ ) #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ #define __STATIC_INLINE static inline #elif defined ( __TASKING__ ) #define __ASM __asm /*!< asm keyword for TASKING Compiler */ #define __INLINE inline /*!< inline keyword for TASKING Compiler */ #define __STATIC_INLINE static inline #elif defined ( __CSMC__ ) #define __packed #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */??#define?__STATIC_INLINE??static?inline#endif?

如果你寫過Keil C51,你還會發現有如下(通過預處理)嵌套匯編:

#pragma asm ; Assembler Code Here #pragma endasm 所以,你會發現,不同的編譯器,匯編代碼還是有差異。當然,這里主要是說C中嵌套匯編與編譯器有關。 二、C中嵌套匯編代碼常見兩種定義:

1.在C函數中定義一段匯編代碼;

2.在C文件中定義一個匯編函數;

(當然,兩個意思差不多,都是在C中嵌套匯編)

上面說了C中定義匯編代碼與編譯器有關,換句話說:不同編譯器解析匯編代碼的方式不同。 這里還是拿core_cm3.c來舉例說明,定義一個__get_PSP函數。 在Keil MDK中定義:

__ASM uint32_t __get_PSP(void){ mrs r0, psp bx lr}在IAR EWARM中定義:

uint32_t __get_PSP(void){ __ASM("mrs r0, psp"); __ASM("bx lr");} __asm(__ASM)關鍵字用于調用內聯匯編程序,并且可在 C 或 C++ 語句合法時出現。 三、更多舉例下面舉一些常見例子。 1.FreeRTOS中portmacro.h文件下源代碼:

static portFORCE_INLINE void vPortRaiseBASEPRI( void ){uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; __asm { /* Set BASEPRI to the max syscall priority to effect a critical section. */ msr basepri, ulNewBASEPRI dsb isb }}2.FreeRTOS中port.c文件下源代碼:

__asm void xPortPendSVHandler( void ){ extern uxCriticalNesting; extern pxCurrentTCB; extern vTaskSwitchContext; PRESERVE8 mrs r0, psp isb ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ ldr r2, [r3] stmdb r0!, {r4-r11} /* Save the remaining registers. */ str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ stmdb sp!, {r3, r14} mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY msr basepri, r0 dsb isb bl vTaskSwitchContext mov r0, #0 msr basepri, r0 ldmia sp!, {r3, r14} ldr r1, [r3] ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ msr psp, r0 isb bx r14 nop}3.內核復位 這是之前分享過的一篇文章《STM32復位來源》中的代碼:

__asm void NVIC_CoreReset_a(void){ LDR R0, =0xE000ED0C LDR R1, =0x05FA0001 STR R1, [R0]deadloop_Core B deadloop_Core} 舉了這些常見例子,沒有說透,但相信只要認真理解了都能明白。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145581
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97185
  • 代碼
    +關注

    關注

    30

    文章

    4968

    瀏覽量

    73960
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    水聲功率放大器在聲壓嵌套陣輻射噪聲的應用

    實驗名稱: 波導環境下矢量/聲壓嵌套陣輻射噪聲測量驗證實驗 研究方向: 水下航行器輻射噪聲測量精度問題。鑒于我國海域波導環境對測量的影響,分析常用噪聲測量方法在不同波導環境下的測量結果,重點探討波導
    的頭像 發表于 01-23 14:04 ?121次閱讀
    水聲功率放大器在聲壓<b class='flag-5'>嵌套</b>陣輻射噪聲<b class='flag-5'>中</b>的應用

    在Keil中進行C代碼匯編代碼的混合編程

    1. 在 C 代碼調用匯編程序代碼C 代碼調
    發表于 01-23 06:36

    c語言中的代碼優化

    則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。固然,因為編譯器的不一樣,可能效率的差距不大,可是,以我目前遇到的MS C ,ARM C 來看,效率的差距仍是不小。對于以2的指數次方為\
    發表于 01-12 09:45

    C語言中可以嵌套匯編語言嗎?

    請問C語言中可以嵌套匯編語言嗎?
    發表于 12-15 08:14

    C語言的編程技巧

    1、宏定義使用do{...}while(0)?:當宏定義包含多條語句時,使用do{...}while(0)可以避免語句嵌套問題,確保宏的獨立性。? ?2、靈活數組成員?:C99標準允許結構體的最后
    發表于 11-27 06:46

    匯編程序段的定義介紹

    指令部分)... MOVAX, 4C00H INT21H CODE ENDS ENDSTART 語法解讀: 程序開始的兩條指令都是用于裝載數據段寄存器DS的。進入程序后,代碼段寄存器CS的值
    發表于 11-21 08:19

    C語言和單片機C語言有什么差異

    的目標代碼短、運行速度高、存儲空間小、符合C語言的ANSI標準,生成的代碼遵循Intel目標文件格式,而且可與A51匯編語言PL/M51語言目標代碼
    發表于 11-14 07:55

    求助,關于C代碼的printf打印的疑問求解

    在使用E203 testbench執行附帶的benchmark測試用例時候,得到如下打印信息: CPU驗證小白一枚,有個問題不是很理解:黃色框框內的字符看起來應該是C代碼的printf語句
    發表于 11-10 07:54

    RVMCU課堂「7」: 手把手教你玩轉RVSTAR—匯編程序篇

    匯編程序而言,在匯編程序調用C/C++語言函數,必須遵照ABI所定義的函數調用規則,即函數參數由寄存器a0~a7傳遞,函數返回由寄存器a0
    發表于 10-31 08:46

    簡單的內聯匯編介紹

    前言1、在程序我們可以嵌入匯編直接對我們加入的硬件進行相應的操作 2、在RISC-V架構定義的CSR寄存器需要使用特殊的 CSR 指令進行訪問,如果在 C/
    發表于 10-30 08:04

    采用匯編指示符來使用自定義指令

    ,.dword為插入雙字即64位。以下為演示過程: * 在main.c編寫如下代碼 * 使用riscv-nuclei-elf-gcc main.c命令編譯main.
    發表于 10-28 06:02

    GCC內聯匯編

    需要用到C/C++的內聯匯編語法asm volatile(“instructions”) 以在C代碼
    發表于 10-24 07:46

    關于蜂鳥E203內核中斷硬件實現中斷嵌套的設計

    嵌套,可以有很多層(蜂鳥處理器該情況下不響應新的端,繼續執行正在處理的ISR,徹底完成后才響應新的中斷請求) 注意:假設新來的中斷請求的優先級比正在處理的中斷優先級低或者相同,則無論是否能支持中斷
    發表于 10-23 07:07

    Whetstone代碼涉及的浮點指令匯編分析

    對benchmark的whetstone進行代碼分析,通過反匯編統計所出現的浮點指令,共有26種,如下 特點是只涉及單精度的浮點指令,并且存在有浮點Load/Store的壓縮指令,還有一些偽
    發表于 10-22 08:11

    gcc工具鏈無法匯編硬件浮點指令fsqrt問題

    需要在C代碼嵌入匯編,強制這里的開方操作使用fsqrt.s來執行 asm(“fsqrt.s %0,%1”:”=f”(out):”f”(a));
    發表于 10-20 06:19