chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

作者:黃工 公眾號:strongerHuang 做底層軟件開發(fā)的,或多或少都會(huì)接觸一些匯編代碼,今天就來說說關(guān)于匯編在C中的定義和調(diào)用,以及舉例說明嵌套匯編代碼。 一、嵌套匯編說明有認(rèn)真研究,或者說細(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?

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

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

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

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

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

上面說了C中定義匯編代碼與編譯器有關(guān),換句話說:不同編譯器解析匯編代碼的方式不同。 這里還是拿core_cm3.c來舉例說明,定義一個(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++ 語句合法時(shí)出現(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

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

    關(guān)注

    90

    文章

    3710

    瀏覽量

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

    關(guān)注

    30

    文章

    4956

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

    則僅僅是幾句相關(guān)的匯編,代碼更簡潔,效率更高。固然,因?yàn)榫幾g器的不一樣,可能效率的差距不大,可是,以我目前遇到的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)宏定義包含多條語句時(shí),使用do{...}while(0)可以避免語句嵌套問題,確保宏的獨(dú)立性。? ?2、靈活數(shù)組成員?:C99標(biāo)準(zhǔn)允許結(jié)構(gòu)體的最后
    發(fā)表于 11-27 06:46

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

    的目標(biāo)代碼短、運(yùn)行速度高、存儲空間小、符合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測試用例時(shí)候,得到如下打印信息: CPU驗(yàn)證小白一枚,有個(gè)問題不是很理解:黃色框框內(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)核中斷硬件實(shí)現(xiàn)中斷嵌套的設(shè)計(jì)

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

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

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

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

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

    技術(shù)干貨驛站 ▏深入理解C語言:嵌套循環(huán)與循環(huán)控制的底層原理

    大家好!在上一節(jié),我們學(xué)習(xí)了C語言中的基本循環(huán)語句,如for、while和do...while循環(huán)。今天,我們將進(jìn)一步探討嵌套循環(huán)和循環(huán)控制,這些技巧可以幫助我們實(shí)現(xiàn)更復(fù)雜的邏輯操作。無論是處理
    的頭像 發(fā)表于 02-21 18:26 ?1184次閱讀
    技術(shù)干貨驛站  ▏深入理解<b class='flag-5'>C</b>語言:<b class='flag-5'>嵌套</b>循環(huán)與循環(huán)控制的底層原理

    代碼加密、源代碼防泄漏c/c++與git服務(wù)器開發(fā)環(huán)境

    代碼加密對于很多研發(fā)性單位來說是至關(guān)重要的,當(dāng)然每家企業(yè)的業(yè)務(wù)需求不同所用的開發(fā)環(huán)境及開發(fā)語言也不盡相同,今天主要來講一下c++及git開發(fā)環(huán)境的源代碼防泄密保護(hù)方案。企業(yè)源代碼泄密
    的頭像 發(fā)表于 02-12 15:26 ?1023次閱讀
    源<b class='flag-5'>代碼</b>加密、源<b class='flag-5'>代碼</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++與git服務(wù)器開發(fā)環(huán)境

    分析C語言代碼結(jié)構(gòu)的設(shè)計(jì)問題

    來分析一個(gè)C語言代碼結(jié)構(gòu)的設(shè)計(jì)問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內(nèi)存。用完后,內(nèi)存釋放,防止內(nèi)存泄漏。 大家覺得,這樣的代碼設(shè)計(jì)有沒有問題。
    的頭像 發(fā)表于 02-11 09:31 ?762次閱讀