91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

(當(dāng)然,兩個意思差不多,都是在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)核復(fù)位 這是之前分享過的一篇文章《STM32復(fù)位來源》中的代碼:

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

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    90

    文章

    3716

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    水聲功率放大器在聲壓嵌套陣輻射噪聲的應(yīng)用

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

    在Keil中進(jìn)行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)?:當(dāng)宏定義包含多條語句時,使用do{...}while(0)可以避免語句嵌套問題,確保宏的獨立性。? ?2、靈活數(shù)組成員?:C99標(biāo)準(zhǔn)允許結(jié)構(gòu)體的最后
    發(fā)表于 11-27 06:46

    匯編程序段的定義介紹

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

    C語言和單片機(jī)C語言有什么差異

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

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

    在使用E203 testbench執(zhí)行附帶的benchmark測試用例時候,得到如下打印信息: CPU驗證小白一枚,有個問題不是很理解:黃色框框內(nèi)的字符看起來應(yīng)該是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、在程序我們可以嵌入匯編直接對我們加入的硬件進(jìn)行相應(yīng)的操作 2、在RISC-V架構(gòu)定義的CSR寄存器需要使用特殊的 CSR 指令進(jìn)行訪問,如果在 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è)計

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

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

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

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

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