哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

作者:黃工 公眾號(hào):strongerHuang 做底層軟件開(kāi)發(fā)的,或多或少都會(huì)接觸一些匯編代碼,今天就來(lái)說(shuō)說(shuō)關(guān)于匯編在C中的定義和調(diào)用,以及舉例說(shuō)明嵌套匯編代碼。 一、嵌套匯編說(shuō)明有認(rèn)真研究,或者說(shuō)細(xì)心一點(diǎn)的讀者應(yīng)該都知道:C中定義匯編代碼與編譯器有關(guān)。 比如:你在core_cm4.h文件會(huì)看到如下的代碼:

#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?

如果你寫(xiě)過(guò)Keil C51,你還會(huì)發(fā)現(xiàn)有如下(通過(guò)預(yù)處理)嵌套匯編:

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

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

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

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

上面說(shuō)了C中定義匯編代碼與編譯器有關(guān),換句話(huà)說(shuō):不同編譯器解析匯編代碼的方式不同。 這里還是拿core_cm3.c來(lái)舉例說(shuō)明,定義一個(gè)__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++ 語(yǔ)句合法時(shí)出現(xiàn)。 三、更多舉例下面舉一些常見(jià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ù)位 這是之前分享過(guò)的一篇文章《STM32復(fù)位來(lái)源》中的代碼:

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

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

    關(guān)注

    183

    文章

    7646

    瀏覽量

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

    關(guān)注

    90

    文章

    3723

    瀏覽量

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

    關(guān)注

    30

    文章

    4975

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    實(shí)驗(yàn)名稱(chēng): 波導(dǎo)環(huán)境下矢量/聲壓嵌套陣輻射噪聲測(cè)量驗(yàn)證實(shí)驗(yàn) 研究方向: 水下航行器輻射噪聲測(cè)量精度問(wèn)題。鑒于我國(guó)海域波導(dǎo)環(huán)境對(duì)測(cè)量的影響,分析常用噪聲測(cè)量方法在不同波導(dǎo)環(huán)境下的測(cè)量結(jié)果,重點(diǎn)探討波導(dǎo)
    的頭像 發(fā)表于 01-23 14:04 ?214次閱讀
    水聲功率放大器在聲壓<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ǔ)言中的代碼優(yōu)化

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

    C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?

    請(qǐng)問(wèn)C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?
    發(fā)表于 12-15 08:14

    C語(yǔ)言的編程技巧

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

    匯編程序段的定義介紹

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

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

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

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

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

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

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

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

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

    采用匯編指示符來(lái)使用自定義指令

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

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

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

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

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

    Whetstone代碼涉及的浮點(diǎn)指令匯編分析

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

    gcc工具鏈無(wú)法匯編硬件浮點(diǎn)指令fsqrt問(wèn)題

    需要在C代碼嵌入匯編,強(qiáng)制這里的開(kāi)方操作使用fsqrt.s來(lái)執(zhí)行 asm(“fsqrt.s %0,%1”:”=f”(out):”f”(a));
    發(fā)表于 10-20 06:19
    长岭县| 信宜市| 揭阳市| 灵台县| 班戈县| 广安市| 平远县| 砀山县| 右玉县| 玉门市| 清远市| 集贤县| 麦盖提县| 福贡县| 屯昌县| 闽侯县| 霍州市| 蒙自县| 长垣县| 沁源县| 兴文县| 勃利县| 昂仁县| 涡阳县| 清苑县| 炎陵县| 孟连| 确山县| 武乡县| 德保县| 西青区| 景德镇市| 四平市| 南雄市| 紫阳县| 永嘉县| 双流县| 延长县| 高阳县| 宝清县| 济阳县|