日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內(nèi)不再提示

關(guān)于C中嵌套匯編代碼難嗎?

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

掃碼添加小助手

加入工程師交流群

作者:黃工 公眾號:strongerHuang 做底層軟件開發(fā)的,或多或少都會接觸一些匯編代碼,今天就來說說關(guān)于匯編在C中的定義和調(diào)用,以及舉例說明嵌套匯編代碼。 一、嵌套匯編說明有認真研究,或者說細心一點的讀者應該都知道:C中定義匯編代碼與編譯器有關(guān)。 比如:你在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,你還會發(fā)現(xiàn)有如下(通過預處理)嵌套匯編:

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

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

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

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

上面說了C中定義匯編代碼與編譯器有關(guān),換句話說:不同編譯器解析匯編代碼的方式不同。 這里還是拿core_cm3.c來舉例說明,定義一個__get_PSP函數(shù)。 在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)關(guān)鍵字用于調(diào)用內(nèi)聯(lián)匯編程序,并且可在 C 或 C++ 語句合法時出現(xiàn)。 三、更多舉例下面舉一些常見例子。 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.內(nèi)核復位 這是之前分享過的一篇文章《STM32復位來源》中的代碼:

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

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

    關(guān)注

    183

    文章

    7646

    瀏覽量

    146196
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3724

    瀏覽量

    97458
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

    1. 在 C 代碼調(diào)用匯編程序代碼C 代碼調(diào)
    發(fā)表于 01-23 06:36

    c語言中的代碼優(yōu)化

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

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

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

    C語言的編程技巧

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

    匯編程序段的定義介紹

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

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

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

    求助,關(guān)于C代碼的printf打印的疑問求解

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

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

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

    簡單的內(nèi)聯(lián)匯編介紹

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

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

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

    GCC內(nèi)聯(lián)匯編

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

    關(guān)于蜂鳥E203內(nèi)核中斷硬件實現(xiàn)中斷嵌套的設(shè)計

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

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

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

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

    需要在C代碼嵌入匯編,強制這里的開方操作使用fsqrt.s來執(zhí)行 asm(“fsqrt.s %0,%1”:”=f”(out):”f”(a));
    發(fā)表于 10-20 06:19
    腾冲县| 大余县| 青田县| 呼伦贝尔市| 普安县| 泗阳县| 华亭县| 高雄市| 枞阳县| 普定县| 于田县| 饶阳县| 德化县| 西畴县| 雅安市| 宝清县| 迁安市| 封开县| 博湖县| 石阡县| 彰化县| 沈丘县| 恩施市| 濮阳市| 遵化市| 栖霞市| 连城县| 常熟市| 长治县| 广宗县| 崇文区| 东海县| 弋阳县| 上犹县| 岢岚县| 庆元县| 乐平市| 阿鲁科尔沁旗| 西充县| 海南省| 怀集县|